Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Add html filtering#1356

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
JoannaaKL merged 7 commits intomainfromadd-html-filtering
Nov 5, 2025
Merged
Show file tree
Hide file tree
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletionsgo.mod
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,18 +6,21 @@ require (
github.com/google/go-github/v76v76.0.0
github.com/josephburnett/jdv1.9.2
github.com/mark3labs/mcp-gov0.36.0
github.com/microcosm-cc/bluemondayv1.0.27
github.com/migueleliasweb/go-github-mockv1.3.0
github.com/spf13/cobrav1.10.1
github.com/spf13/viperv1.21.0
github.com/stretchr/testifyv1.11.1
)

require (
github.com/aymerick/douceurv0.2.0// indirect
github.com/bahlo/generic-list-gov0.2.0// indirect
github.com/buger/jsonparserv1.1.1// indirect
github.com/go-openapi/jsonpointerv0.19.5// indirect
github.com/go-openapi/swagv0.21.1// indirect
github.com/google/go-github/v71v71.0.0// indirect
github.com/gorilla/cssv1.0.1// indirect
github.com/gorilla/muxv1.8.0// indirect
github.com/invopop/jsonschemav0.13.0// indirect
github.com/josharian/internv1.0.0// indirect
Expand All@@ -26,6 +29,7 @@ require (
github.com/yudai/golcsv0.0.0-20170316035057-ecda9a501e82// indirect
go.yaml.in/yaml/v3v3.0.4// indirect
golang.org/x/expv0.0.0-20240719175910-8a7402abbf56// indirect
golang.org/x/netv0.26.0// indirect
gopkg.in/yaml.v2v2.4.0// indirect
)

Expand Down
10 changes: 8 additions & 2 deletionsgo.sum
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
github.com/aymerick/douceurv0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceurv0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/bahlo/generic-list-gov0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-gov0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/buger/jsonparserv1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
Expand All@@ -24,14 +26,14 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmpv0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-github/v71v71.0.0 h1:Zi16OymGKZZMm8ZliffVVJ/Q9YZreDKONCr+WUd0Z30=
github.com/google/go-github/v71v71.0.0/go.mod h1:URZXObp2BLlMjwu0O8g4y6VBneUj2bCHgnI8FfgZ51M=
github.com/google/go-github/v74v74.0.0 h1:yZcddTUn8DPbj11GxnMrNiAnXH14gNs559AsUpNpPgM=
github.com/google/go-github/v74v74.0.0/go.mod h1:ubn/YdyftV80VPSI26nSJvaEsTOnsjrxG3o9kJhcyak=
github.com/google/go-github/v76v76.0.0 h1:MCa9VQn+VG5GG7Y7BAkBvSRUN3o+QpaEOuZwFPJmdFA=
github.com/google/go-github/v76v76.0.0/go.mod h1:38+d/8pYDO4fBLYfBhXF5EKO0wA3UkXBjfmQapFsNCQ=
github.com/google/go-querystringv1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystringv1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/uuidv1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuidv1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/cssv1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
github.com/gorilla/cssv1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
github.com/gorilla/muxv1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/muxv1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/inconshreveable/mousetrapv1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
Expand All@@ -57,6 +59,8 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
github.com/mailru/easyjsonv0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mark3labs/mcp-gov0.36.0 h1:rIZaijrRYPeSbJG8/qNDe0hWlGrCJ7FWHNMz2SQpTis=
github.com/mark3labs/mcp-gov0.36.0/go.mod h1:T7tUa2jO6MavG+3P25Oy/jR7iCeJPHImCZHRymCn39g=
github.com/microcosm-cc/bluemondayv1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
github.com/microcosm-cc/bluemondayv1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
github.com/migueleliasweb/go-github-mockv1.3.0 h1:2sVP9JEMB2ubQw1IKto3/fzF51oFC6eVWOOFDgQoq88=
github.com/migueleliasweb/go-github-mockv1.3.0/go.mod h1:ipQhV8fTcj/G6m7BKzin08GaJ/3B5/SonRAkgrk0zCY=
github.com/niemeyer/prettyv0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
Expand DownExpand Up@@ -104,6 +108,8 @@ go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/expv0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/expv0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/netv0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
golang.org/x/netv0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/oauth2v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
golang.org/x/oauth2v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
golang.org/x/sysv0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
Expand Down
8 changes: 4 additions & 4 deletionspkg/github/issues.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -212,15 +212,15 @@ func fragmentToIssue(fragment IssueFragment) *github.Issue {

return&github.Issue{
Number:github.Ptr(int(fragment.Number)),
Title:github.Ptr(sanitize.FilterInvisibleCharacters(string(fragment.Title))),
Title:github.Ptr(sanitize.Sanitize(string(fragment.Title))),
CreatedAt:&github.Timestamp{Time:fragment.CreatedAt.Time},
UpdatedAt:&github.Timestamp{Time:fragment.UpdatedAt.Time},
User:&github.User{
Login:github.Ptr(string(fragment.Author.Login)),
},
State:github.Ptr(string(fragment.State)),
ID:github.Ptr(fragment.DatabaseID),
Body:github.Ptr(sanitize.FilterInvisibleCharacters(string(fragment.Body))),
Body:github.Ptr(sanitize.Sanitize(string(fragment.Body))),
Labels:foundLabels,
Comments:github.Ptr(int(fragment.Comments.TotalCount)),
}
Expand DownExpand Up@@ -327,10 +327,10 @@ func GetIssue(ctx context.Context, client *github.Client, owner string, repo str
// Sanitize title/body on response
ifissue!=nil {
ifissue.Title!=nil {
issue.Title=github.Ptr(sanitize.FilterInvisibleCharacters(*issue.Title))
issue.Title=github.Ptr(sanitize.Sanitize(*issue.Title))
}
ifissue.Body!=nil {
issue.Body=github.Ptr(sanitize.FilterInvisibleCharacters(*issue.Body))
issue.Body=github.Ptr(sanitize.Sanitize(*issue.Body))
}
}

Expand Down
8 changes: 4 additions & 4 deletionspkg/github/pullrequests.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -127,10 +127,10 @@ func GetPullRequest(ctx context.Context, client *github.Client, owner, repo stri
// sanitize title/body on response
ifpr!=nil {
ifpr.Title!=nil {
pr.Title=github.Ptr(sanitize.FilterInvisibleCharacters(*pr.Title))
pr.Title=github.Ptr(sanitize.Sanitize(*pr.Title))
}
ifpr.Body!=nil {
pr.Body=github.Ptr(sanitize.FilterInvisibleCharacters(*pr.Body))
pr.Body=github.Ptr(sanitize.Sanitize(*pr.Body))
}
}

Expand DownExpand Up@@ -821,10 +821,10 @@ func ListPullRequests(getClient GetClientFn, t translations.TranslationHelperFun
continue
}
ifpr.Title!=nil {
pr.Title=github.Ptr(sanitize.FilterInvisibleCharacters(*pr.Title))
pr.Title=github.Ptr(sanitize.Sanitize(*pr.Title))
}
ifpr.Body!=nil {
pr.Body=github.Ptr(sanitize.FilterInvisibleCharacters(*pr.Body))
pr.Body=github.Ptr(sanitize.Sanitize(*pr.Body))
}
}

Expand Down
48 changes: 48 additions & 0 deletionspkg/sanitize/sanitize.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
package sanitize

import (
"sync"

"github.com/microcosm-cc/bluemonday"
)

varpolicy*bluemonday.Policy
varpolicyOnce sync.Once

funcSanitize(inputstring)string {
returnFilterHTMLTags(FilterInvisibleCharacters(input))
}

// FilterInvisibleCharacters removes invisible or control characters that should not appear
// in user-facing titles or bodies. This includes:
// - Unicode tag characters: U+E0001, U+E0020–U+E007F
Expand All@@ -20,6 +33,41 @@ func FilterInvisibleCharacters(input string) string {
returnstring(out)
}

funcFilterHTMLTags(inputstring)string {
ifinput=="" {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Maybe we could also check if the string has any HTML in the first place in this early return?

SamMorrowDrums reacted with heart emoji
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Interesting idea, although an early return that has to parse the content might not be an optimisation. Hard to tell without getting into the weeds.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

What I was mainly thinking about is just adding a simple!strings.Contains(input, "<") check, nothing fancy or overly complex. It wouldn't even handle all edge cases (i.e., an input containing a single< for whatever reason) but it would be just a quick scan to avoid running the full sanitiser on plain input. But what you said is definitely a good point!

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Bluemonday does html input tokenization and I don't want to reinvent the wheel here. :)

returninput
}
returngetPolicy().Sanitize(input)
}

funcgetPolicy()*bluemonday.Policy {
policyOnce.Do(func() {
p:=bluemonday.StrictPolicy()

p.AllowElements(
"b","blockquote","br","code","em",
"h1","h2","h3","h4","h5","h6",
"hr","i","li","ol","p","pre",
"strong","sub","sup","table","tbody",
"td","th","thead","tr","ul",
"a","img",
)

p.AllowAttrs("href").OnElements("a")
p.AllowURLSchemes("https")
p.RequireParseableURLs(true)
p.RequireNoFollowOnLinks(true)
p.RequireNoReferrerOnLinks(true)
p.AddTargetBlankToFullyQualifiedLinks(true)

p.AllowImages()
p.AllowAttrs("src","alt","title").OnElements("img")

policy=p
})
returnpolicy
}

funcshouldRemoveRune(rrune)bool {
switchr {
case0x200B,// ZERO WIDTH SPACE
Expand Down
66 changes: 66 additions & 0 deletionspkg/sanitize/sanitize_test.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -186,3 +186,69 @@ func TestShouldRemoveRune(t *testing.T) {
})
}
}

func TestFilterHtmlTags(t *testing.T) {
tests := []struct {
name string
input string
expected string
}{
{
name: "empty string",
input: "",
expected: "",
},
{
name: "allowed simple tags preserved",
input: "<b>bold</b>",
expected: "<b>bold</b>",
},
{
name: "multiple allowed tags",
input: "<b>bold</b> and <em>italic</em>",
expected: "<b>bold</b> and <em>italic</em>",
},
{
name: "code tag preserved",
input: "<code>fmt.Println(\"hi\")</code>",
expected: "<code>fmt.Println(&#34;hi&#34;)</code>", // quotes are escaped by sanitizer
},
{
name: "disallowed script removed entirely",
input: "<script>alert(1)</script>",
expected: "", // StrictPolicy should drop script element and contents
},
{
name: "allow anchor with https href",
input: "Click <a href=\"https://example.com\">here</a> now",
expected: "Click <a href=\"https://example.com\" rel=\"nofollow noreferrer noopener\" target=\"_blank\">here</a> now",
},
{
name: "anchor removed but inner text kept",
input: "before <a href='https://example.com' onclick='alert(1)' title='foo' alt='bar'>link</a> after",
expected: "before <a href=\"https://example.com\" rel=\"nofollow noreferrer noopener\" target=\"_blank\">link</a> after",
},
{
name: "image removed (no textual fallback)",
input: "<img src='x' alt='y'>",
expected: "<img src=\"x\" alt=\"y\">", // images are allowed via AllowImages()
},
{
name: "mixed allowed and disallowed",
input: "<b>bold</b> <script>alert(1)</script> <em>italic</em>",
expected: "<b>bold</b> <em>italic</em>",
},
{
name: "idempotent sanitization",
input: FilterHTMLTags("<b>bold</b> and <em>italic</em>"),
expected: "<b>bold</b> and <em>italic</em>",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := FilterHTMLTags(tt.input)
assert.Equal(t, tt.expected, result)
})
}
}
4 changes: 2 additions & 2 deletionsscript/licenses
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,8 +14,8 @@ for goos in linux darwin windows ; do
#
# Normally these warnings are packages containing non go code, which may or may not require explicit attribution,
# depending on the license.
GOOS="${goos}" go-licenses save ./... --save_path="${TEMPDIR}/${goos}" --force||echo"Ignore warnings"
GOOS="${goos}" go-licenses report ./... --template .github/licenses.tmpl> third-party-licenses.${goos}.md||echo"Ignore warnings"
GOOS="${goos}"GOFLAGS=-mod=modgo-licenses save ./... --save_path="${TEMPDIR}/${goos}" --force||echo"Ignore warnings"
GOOS="${goos}"GOFLAGS=-mod=modgo-licenses report ./... --template .github/licenses.tmpl> third-party-licenses.${goos}.md||echo"Ignore warnings"
cp -fR"${TEMPDIR}/${goos}"/* third-party/
done

4 changes: 2 additions & 2 deletionsscript/licenses-check
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,9 @@ for goos in linux darwin windows ; do
#
# Normally these warnings are packages containing non go code, which may or may not require explicit attribution,
# depending on the license.
GOOS="${goos}" go-licenses report ./... --template .github/licenses.tmpl > third-party-licenses.${goos}.copy.md || echo "Ignore warnings"
GOOS="${goos}"GOFLAGS=-mod=modgo-licenses report ./... --template .github/licenses.tmpl > third-party-licenses.${goos}.copy.md || echo "Ignore warnings"
if ! diff -s third-party-licenses.${goos}.copy.md third-party-licenses.${goos}.md; then
echo "License check failed.\n\nPlease update the license file by running \`.script/licenses\` and committing the output."
printf "License check failed.\n\nPlease update the license file by running \`.script/licenses\` and committing the output."
rm -f third-party-licenses.${goos}.copy.md
exit 1
fi
Expand Down
4 changes: 4 additions & 0 deletionsthird-party-licenses.darwin.md
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ The following open source dependencies are used to build the [github/github-mcp-
Some packages may only be included on certain architectures or operating systems.


-[github.com/aymerick/douceur](https://pkg.go.dev/github.com/aymerick/douceur) ([MIT](https://github.com/aymerick/douceur/blob/v0.2.0/LICENSE))
-[github.com/bahlo/generic-list-go](https://pkg.go.dev/github.com/bahlo/generic-list-go) ([BSD-3-Clause](https://github.com/bahlo/generic-list-go/blob/v0.2.0/LICENSE))
-[github.com/buger/jsonparser](https://pkg.go.dev/github.com/buger/jsonparser) ([MIT](https://github.com/buger/jsonparser/blob/v1.1.1/LICENSE))
-[github.com/fsnotify/fsnotify](https://pkg.go.dev/github.com/fsnotify/fsnotify) ([BSD-3-Clause](https://github.com/fsnotify/fsnotify/blob/v1.9.0/LICENSE))
Expand All@@ -18,12 +19,14 @@ Some packages may only be included on certain architectures or operating systems
-[github.com/google/go-github/v76/github](https://pkg.go.dev/github.com/google/go-github/v76/github) ([BSD-3-Clause](https://github.com/google/go-github/blob/v76.0.0/LICENSE))
-[github.com/google/go-querystring/query](https://pkg.go.dev/github.com/google/go-querystring/query) ([BSD-3-Clause](https://github.com/google/go-querystring/blob/v1.1.0/LICENSE))
-[github.com/google/uuid](https://pkg.go.dev/github.com/google/uuid) ([BSD-3-Clause](https://github.com/google/uuid/blob/v1.6.0/LICENSE))
-[github.com/gorilla/css/scanner](https://pkg.go.dev/github.com/gorilla/css/scanner) ([BSD-3-Clause](https://github.com/gorilla/css/blob/v1.0.1/LICENSE))
-[github.com/gorilla/mux](https://pkg.go.dev/github.com/gorilla/mux) ([BSD-3-Clause](https://github.com/gorilla/mux/blob/v1.8.0/LICENSE))
-[github.com/invopop/jsonschema](https://pkg.go.dev/github.com/invopop/jsonschema) ([MIT](https://github.com/invopop/jsonschema/blob/v0.13.0/COPYING))
-[github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v1.9.2/LICENSE))
-[github.com/josharian/intern](https://pkg.go.dev/github.com/josharian/intern) ([MIT](https://github.com/josharian/intern/blob/v1.0.0/license.md))
-[github.com/mailru/easyjson](https://pkg.go.dev/github.com/mailru/easyjson) ([MIT](https://github.com/mailru/easyjson/blob/v0.7.7/LICENSE))
-[github.com/mark3labs/mcp-go](https://pkg.go.dev/github.com/mark3labs/mcp-go) ([MIT](https://github.com/mark3labs/mcp-go/blob/v0.36.0/LICENSE))
-[github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/microcosm-cc/bluemonday/blob/v1.0.27/LICENSE.md))
-[github.com/migueleliasweb/go-github-mock/src/mock](https://pkg.go.dev/github.com/migueleliasweb/go-github-mock/src/mock) ([MIT](https://github.com/migueleliasweb/go-github-mock/blob/v1.3.0/LICENSE))
-[github.com/pelletier/go-toml/v2](https://pkg.go.dev/github.com/pelletier/go-toml/v2) ([MIT](https://github.com/pelletier/go-toml/blob/v2.2.4/LICENSE))
-[github.com/sagikazarmark/locafero](https://pkg.go.dev/github.com/sagikazarmark/locafero) ([MIT](https://github.com/sagikazarmark/locafero/blob/v0.11.0/LICENSE))
Expand All@@ -41,6 +44,7 @@ Some packages may only be included on certain architectures or operating systems
-[github.com/yudai/golcs](https://pkg.go.dev/github.com/yudai/golcs) ([MIT](https://github.com/yudai/golcs/blob/ecda9a501e82/LICENSE))
-[go.yaml.in/yaml/v3](https://pkg.go.dev/go.yaml.in/yaml/v3) ([MIT](https://github.com/yaml/go-yaml/blob/v3.0.4/LICENSE))
-[golang.org/x/exp](https://pkg.go.dev/golang.org/x/exp) ([BSD-3-Clause](https://cs.opensource.google/go/x/exp/+/8a7402ab:LICENSE))
-[golang.org/x/net/html](https://pkg.go.dev/golang.org/x/net/html) ([BSD-3-Clause](https://cs.opensource.google/go/x/net/+/v0.26.0:LICENSE))
-[golang.org/x/sys/unix](https://pkg.go.dev/golang.org/x/sys/unix) ([BSD-3-Clause](https://cs.opensource.google/go/x/sys/+/v0.31.0:LICENSE))
-[golang.org/x/text](https://pkg.go.dev/golang.org/x/text) ([BSD-3-Clause](https://cs.opensource.google/go/x/text/+/v0.28.0:LICENSE))
-[golang.org/x/time/rate](https://pkg.go.dev/golang.org/x/time/rate) ([BSD-3-Clause](https://cs.opensource.google/go/x/time/+/v0.5.0:LICENSE))
Expand Down
Loading
Loading

[8]ページ先頭

©2009-2025 Movatter.jp