Handle Quoted Paths - #56

Open
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths
Open

Handle Quoted Paths#56
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths

Conversation

@EliSauder

Copy link
Copy Markdown

Since I was in here and the parsing is updated, I figured #13 probably wouldn't be that bad to add. Here is my go at it :)

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thanks. Always a good sign when a change makes other fixes easier…

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
Comment threadimpl.go
Comment threadimpl_test.go Outdated

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

what do you think about these simplifcations? (i haven't confirmed they pass all the tests, including the new ones i suggested! apologies if i'm leading you astray...)

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
@EliSauder

Copy link
Copy Markdown
Author

@josharian I was looking over the stripPaths test cases, why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

I think it would make more sense for all of these to expect an error.

 {desc: "equals terminates path", input: "Iface[a/b=c.T]", want: "Iface[b=c.T]"},
// Exclamation mark is excluded - path ends at !
{desc: "exclamation terminates path", input: "Iface[a/b!c.T]", want: "Iface[b!c.T]"},
// Semicolon is excluded - path ends at ;
{desc: "semicolon terminates path", input: "Iface[a/b;c.T]", want: "Iface[b;c.T]"},
// Question mark is excluded
{desc: "question mark terminates path", input: "Iface[a/b?c.T]", want: "Iface[b?c.T]"},
// Colon is excluded
{desc: "colon terminates path", input: "Iface[a/b:c.T]", want: "Iface[b:c.T]"},
// Space terminates path (spec says "graphic chars without spaces")
{desc: "space terminates path", input: "Iface[a/b c.T]", want: "Iface[b c.T]"},
// Unicode replacement character U+FFFD is excluded
{desc: "replacement char terminates path", input: "Iface[a/b\uFFFDc.T]", want: "Iface[b\uFFFDc.T]"},

@josharian

Copy link
Copy Markdown
Owner

why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

Time box expired, decided to just ship, same as above.

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

OK, basically there. bunch of little nits. if you want, say the word and i'll make the last few changes myself. otherwise, comments below. things that occur multiple places i've noted only once. oh, and please run gofumpt at the end.

Comment threadimpl_test.go
{input: "github.com/go-chi/chi.Router[github.com/some-org/pkg.SomeType]", path: "github.com/go-chi/chi", typ: Type{Name: "Router", Params: []string{"pkg.SomeType"}}},

// Quoted path edge cases - unbalanced/double quotes
//// missing closing quote

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Add a comment above these explaining why they are here-but-commented-out.

Comment threadimpl.go
return string(out)

// We want balanced quotes for our paths
if quotesRemoved % 2 != 0 {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

nice

Comment threadimpl.go
return string(out), nil
}

func getNonPathSeg(runes []rune, quotesRemoved *int) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

please return quotesRemoved instead of passing pointer. and it looks like it can be a bool (singular quoteRemoved), not an int, which makes it clearer.

Comment threadimpl.go
*quotesRemoved += lenPreTrim - len(seg)
// If there are no path like characters, we are done
if n == -1 {
return seg, []rune{}, false

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

use nil instead of []rune{}

Comment threadimpl.go
return seg, remain, true
}

func getPathSeg(runes []rune) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

seg, remain []rune

Comment threadimpl.go
return seg, remain, true
}

func checkForQuote(p []rune) bool {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

call this hasQuote

Comment threadimpl.go
return p[0] == '"' || p[len(p)-1] == '"'
}

func trimPathSeg(p []rune) []rune {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

trimQuote

Comment threadimpl.go

for len(remain) > 0 {
var seg []rune
var more bool

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

very optional: change more to done, because done is marginally nicer than !more as a condition.

@EliSauder

Copy link
Copy Markdown
Author

@josharian I realized, without handling those test cases for findInterfaces, this won't actually resolve #13. I don't think it makes sense to merge in without that. So, I'll take a look at it along with your comments.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@EliSauder@josharian
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Handle Quoted Paths - #56

Open
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths
Open

Handle Quoted Paths#56
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths

Conversation

@EliSauder

Copy link
Copy Markdown

Since I was in here and the parsing is updated, I figured #13 probably wouldn't be that bad to add. Here is my go at it :)

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thanks. Always a good sign when a change makes other fixes easier…

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
Comment threadimpl.go
Comment threadimpl_test.go Outdated

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

what do you think about these simplifcations? (i haven't confirmed they pass all the tests, including the new ones i suggested! apologies if i'm leading you astray...)

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
@EliSauder

Copy link
Copy Markdown
Author

@josharian I was looking over the stripPaths test cases, why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

I think it would make more sense for all of these to expect an error.

 {desc: "equals terminates path", input: "Iface[a/b=c.T]", want: "Iface[b=c.T]"},
// Exclamation mark is excluded - path ends at !
{desc: "exclamation terminates path", input: "Iface[a/b!c.T]", want: "Iface[b!c.T]"},
// Semicolon is excluded - path ends at ;
{desc: "semicolon terminates path", input: "Iface[a/b;c.T]", want: "Iface[b;c.T]"},
// Question mark is excluded
{desc: "question mark terminates path", input: "Iface[a/b?c.T]", want: "Iface[b?c.T]"},
// Colon is excluded
{desc: "colon terminates path", input: "Iface[a/b:c.T]", want: "Iface[b:c.T]"},
// Space terminates path (spec says "graphic chars without spaces")
{desc: "space terminates path", input: "Iface[a/b c.T]", want: "Iface[b c.T]"},
// Unicode replacement character U+FFFD is excluded
{desc: "replacement char terminates path", input: "Iface[a/b\uFFFDc.T]", want: "Iface[b\uFFFDc.T]"},

@josharian

Copy link
Copy Markdown
Owner

why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

Time box expired, decided to just ship, same as above.

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

OK, basically there. bunch of little nits. if you want, say the word and i'll make the last few changes myself. otherwise, comments below. things that occur multiple places i've noted only once. oh, and please run gofumpt at the end.

Comment threadimpl_test.go
{input: "github.com/go-chi/chi.Router[github.com/some-org/pkg.SomeType]", path: "github.com/go-chi/chi", typ: Type{Name: "Router", Params: []string{"pkg.SomeType"}}},

// Quoted path edge cases - unbalanced/double quotes
//// missing closing quote

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Add a comment above these explaining why they are here-but-commented-out.

Comment threadimpl.go
return string(out)

// We want balanced quotes for our paths
if quotesRemoved % 2 != 0 {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

nice

Comment threadimpl.go
return string(out), nil
}

func getNonPathSeg(runes []rune, quotesRemoved *int) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

please return quotesRemoved instead of passing pointer. and it looks like it can be a bool (singular quoteRemoved), not an int, which makes it clearer.

Comment threadimpl.go
*quotesRemoved += lenPreTrim - len(seg)
// If there are no path like characters, we are done
if n == -1 {
return seg, []rune{}, false

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

use nil instead of []rune{}

Comment threadimpl.go
return seg, remain, true
}

func getPathSeg(runes []rune) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

seg, remain []rune

Comment threadimpl.go
return seg, remain, true
}

func checkForQuote(p []rune) bool {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

call this hasQuote

Comment threadimpl.go
return p[0] == '"' || p[len(p)-1] == '"'
}

func trimPathSeg(p []rune) []rune {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

trimQuote

Comment threadimpl.go

for len(remain) > 0 {
var seg []rune
var more bool

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

very optional: change more to done, because done is marginally nicer than !more as a condition.

@EliSauder

Copy link
Copy Markdown
Author

@josharian I realized, without handling those test cases for findInterfaces, this won't actually resolve #13. I don't think it makes sense to merge in without that. So, I'll take a look at it along with your comments.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@EliSauder@josharian
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Handle Quoted Paths - #56

Open
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths
Open

Handle Quoted Paths#56
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths

Conversation

@EliSauder

Copy link
Copy Markdown

Since I was in here and the parsing is updated, I figured #13 probably wouldn't be that bad to add. Here is my go at it :)

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thanks. Always a good sign when a change makes other fixes easier…

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
Comment threadimpl.go
Comment threadimpl_test.go Outdated

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

what do you think about these simplifcations? (i haven't confirmed they pass all the tests, including the new ones i suggested! apologies if i'm leading you astray...)

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
@EliSauder

Copy link
Copy Markdown
Author

@josharian I was looking over the stripPaths test cases, why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

I think it would make more sense for all of these to expect an error.

 {desc: "equals terminates path", input: "Iface[a/b=c.T]", want: "Iface[b=c.T]"},
// Exclamation mark is excluded - path ends at !
{desc: "exclamation terminates path", input: "Iface[a/b!c.T]", want: "Iface[b!c.T]"},
// Semicolon is excluded - path ends at ;
{desc: "semicolon terminates path", input: "Iface[a/b;c.T]", want: "Iface[b;c.T]"},
// Question mark is excluded
{desc: "question mark terminates path", input: "Iface[a/b?c.T]", want: "Iface[b?c.T]"},
// Colon is excluded
{desc: "colon terminates path", input: "Iface[a/b:c.T]", want: "Iface[b:c.T]"},
// Space terminates path (spec says "graphic chars without spaces")
{desc: "space terminates path", input: "Iface[a/b c.T]", want: "Iface[b c.T]"},
// Unicode replacement character U+FFFD is excluded
{desc: "replacement char terminates path", input: "Iface[a/b\uFFFDc.T]", want: "Iface[b\uFFFDc.T]"},

@josharian

Copy link
Copy Markdown
Owner

why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

Time box expired, decided to just ship, same as above.

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

OK, basically there. bunch of little nits. if you want, say the word and i'll make the last few changes myself. otherwise, comments below. things that occur multiple places i've noted only once. oh, and please run gofumpt at the end.

Comment threadimpl_test.go
{input: "github.com/go-chi/chi.Router[github.com/some-org/pkg.SomeType]", path: "github.com/go-chi/chi", typ: Type{Name: "Router", Params: []string{"pkg.SomeType"}}},

// Quoted path edge cases - unbalanced/double quotes
//// missing closing quote

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Add a comment above these explaining why they are here-but-commented-out.

Comment threadimpl.go
return string(out)

// We want balanced quotes for our paths
if quotesRemoved % 2 != 0 {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

nice

Comment threadimpl.go
return string(out), nil
}

func getNonPathSeg(runes []rune, quotesRemoved *int) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

please return quotesRemoved instead of passing pointer. and it looks like it can be a bool (singular quoteRemoved), not an int, which makes it clearer.

Comment threadimpl.go
*quotesRemoved += lenPreTrim - len(seg)
// If there are no path like characters, we are done
if n == -1 {
return seg, []rune{}, false

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

use nil instead of []rune{}

Comment threadimpl.go
return seg, remain, true
}

func getPathSeg(runes []rune) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

seg, remain []rune

Comment threadimpl.go
return seg, remain, true
}

func checkForQuote(p []rune) bool {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

call this hasQuote

Comment threadimpl.go
return p[0] == '"' || p[len(p)-1] == '"'
}

func trimPathSeg(p []rune) []rune {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

trimQuote

Comment threadimpl.go

for len(remain) > 0 {
var seg []rune
var more bool

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

very optional: change more to done, because done is marginally nicer than !more as a condition.

@EliSauder

Copy link
Copy Markdown
Author

@josharian I realized, without handling those test cases for findInterfaces, this won't actually resolve #13. I don't think it makes sense to merge in without that. So, I'll take a look at it along with your comments.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@EliSauder@josharian
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Handle Quoted Paths - #56

Open
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths
Open

Handle Quoted Paths#56
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths

Conversation

@EliSauder

Copy link
Copy Markdown

Since I was in here and the parsing is updated, I figured #13 probably wouldn't be that bad to add. Here is my go at it :)

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thanks. Always a good sign when a change makes other fixes easier…

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
Comment threadimpl.go
Comment threadimpl_test.go Outdated

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

what do you think about these simplifcations? (i haven't confirmed they pass all the tests, including the new ones i suggested! apologies if i'm leading you astray...)

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
@EliSauder

Copy link
Copy Markdown
Author

@josharian I was looking over the stripPaths test cases, why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

I think it would make more sense for all of these to expect an error.

 {desc: "equals terminates path", input: "Iface[a/b=c.T]", want: "Iface[b=c.T]"},
// Exclamation mark is excluded - path ends at !
{desc: "exclamation terminates path", input: "Iface[a/b!c.T]", want: "Iface[b!c.T]"},
// Semicolon is excluded - path ends at ;
{desc: "semicolon terminates path", input: "Iface[a/b;c.T]", want: "Iface[b;c.T]"},
// Question mark is excluded
{desc: "question mark terminates path", input: "Iface[a/b?c.T]", want: "Iface[b?c.T]"},
// Colon is excluded
{desc: "colon terminates path", input: "Iface[a/b:c.T]", want: "Iface[b:c.T]"},
// Space terminates path (spec says "graphic chars without spaces")
{desc: "space terminates path", input: "Iface[a/b c.T]", want: "Iface[b c.T]"},
// Unicode replacement character U+FFFD is excluded
{desc: "replacement char terminates path", input: "Iface[a/b\uFFFDc.T]", want: "Iface[b\uFFFDc.T]"},

@josharian

Copy link
Copy Markdown
Owner

why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

Time box expired, decided to just ship, same as above.

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

OK, basically there. bunch of little nits. if you want, say the word and i'll make the last few changes myself. otherwise, comments below. things that occur multiple places i've noted only once. oh, and please run gofumpt at the end.

Comment threadimpl_test.go
{input: "github.com/go-chi/chi.Router[github.com/some-org/pkg.SomeType]", path: "github.com/go-chi/chi", typ: Type{Name: "Router", Params: []string{"pkg.SomeType"}}},

// Quoted path edge cases - unbalanced/double quotes
//// missing closing quote

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Add a comment above these explaining why they are here-but-commented-out.

Comment threadimpl.go
return string(out)

// We want balanced quotes for our paths
if quotesRemoved % 2 != 0 {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

nice

Comment threadimpl.go
return string(out), nil
}

func getNonPathSeg(runes []rune, quotesRemoved *int) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

please return quotesRemoved instead of passing pointer. and it looks like it can be a bool (singular quoteRemoved), not an int, which makes it clearer.

Comment threadimpl.go
*quotesRemoved += lenPreTrim - len(seg)
// If there are no path like characters, we are done
if n == -1 {
return seg, []rune{}, false

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

use nil instead of []rune{}

Comment threadimpl.go
return seg, remain, true
}

func getPathSeg(runes []rune) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

seg, remain []rune

Comment threadimpl.go
return seg, remain, true
}

func checkForQuote(p []rune) bool {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

call this hasQuote

Comment threadimpl.go
return p[0] == '"' || p[len(p)-1] == '"'
}

func trimPathSeg(p []rune) []rune {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

trimQuote

Comment threadimpl.go

for len(remain) > 0 {
var seg []rune
var more bool

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

very optional: change more to done, because done is marginally nicer than !more as a condition.

@EliSauder

Copy link
Copy Markdown
Author

@josharian I realized, without handling those test cases for findInterfaces, this won't actually resolve #13. I don't think it makes sense to merge in without that. So, I'll take a look at it along with your comments.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@EliSauder@josharian
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Handle Quoted Paths - #56

Open
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths
Open

Handle Quoted Paths#56
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths

Conversation

@EliSauder

Copy link
Copy Markdown

Since I was in here and the parsing is updated, I figured #13 probably wouldn't be that bad to add. Here is my go at it :)

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thanks. Always a good sign when a change makes other fixes easier…

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
Comment threadimpl.go
Comment threadimpl_test.go Outdated

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

what do you think about these simplifcations? (i haven't confirmed they pass all the tests, including the new ones i suggested! apologies if i'm leading you astray...)

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
@EliSauder

Copy link
Copy Markdown
Author

@josharian I was looking over the stripPaths test cases, why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

I think it would make more sense for all of these to expect an error.

 {desc: "equals terminates path", input: "Iface[a/b=c.T]", want: "Iface[b=c.T]"},
// Exclamation mark is excluded - path ends at !
{desc: "exclamation terminates path", input: "Iface[a/b!c.T]", want: "Iface[b!c.T]"},
// Semicolon is excluded - path ends at ;
{desc: "semicolon terminates path", input: "Iface[a/b;c.T]", want: "Iface[b;c.T]"},
// Question mark is excluded
{desc: "question mark terminates path", input: "Iface[a/b?c.T]", want: "Iface[b?c.T]"},
// Colon is excluded
{desc: "colon terminates path", input: "Iface[a/b:c.T]", want: "Iface[b:c.T]"},
// Space terminates path (spec says "graphic chars without spaces")
{desc: "space terminates path", input: "Iface[a/b c.T]", want: "Iface[b c.T]"},
// Unicode replacement character U+FFFD is excluded
{desc: "replacement char terminates path", input: "Iface[a/b\uFFFDc.T]", want: "Iface[b\uFFFDc.T]"},

@josharian

Copy link
Copy Markdown
Owner

why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

Time box expired, decided to just ship, same as above.

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

OK, basically there. bunch of little nits. if you want, say the word and i'll make the last few changes myself. otherwise, comments below. things that occur multiple places i've noted only once. oh, and please run gofumpt at the end.

Comment threadimpl_test.go
{input: "github.com/go-chi/chi.Router[github.com/some-org/pkg.SomeType]", path: "github.com/go-chi/chi", typ: Type{Name: "Router", Params: []string{"pkg.SomeType"}}},

// Quoted path edge cases - unbalanced/double quotes
//// missing closing quote

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Add a comment above these explaining why they are here-but-commented-out.

Comment threadimpl.go
return string(out)

// We want balanced quotes for our paths
if quotesRemoved % 2 != 0 {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

nice

Comment threadimpl.go
return string(out), nil
}

func getNonPathSeg(runes []rune, quotesRemoved *int) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

please return quotesRemoved instead of passing pointer. and it looks like it can be a bool (singular quoteRemoved), not an int, which makes it clearer.

Comment threadimpl.go
*quotesRemoved += lenPreTrim - len(seg)
// If there are no path like characters, we are done
if n == -1 {
return seg, []rune{}, false

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

use nil instead of []rune{}

Comment threadimpl.go
return seg, remain, true
}

func getPathSeg(runes []rune) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

seg, remain []rune

Comment threadimpl.go
return seg, remain, true
}

func checkForQuote(p []rune) bool {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

call this hasQuote

Comment threadimpl.go
return p[0] == '"' || p[len(p)-1] == '"'
}

func trimPathSeg(p []rune) []rune {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

trimQuote

Comment threadimpl.go

for len(remain) > 0 {
var seg []rune
var more bool

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

very optional: change more to done, because done is marginally nicer than !more as a condition.

@EliSauder

Copy link
Copy Markdown
Author

@josharian I realized, without handling those test cases for findInterfaces, this won't actually resolve #13. I don't think it makes sense to merge in without that. So, I'll take a look at it along with your comments.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@EliSauder@josharian
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Handle Quoted Paths - #56

Open
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths
Open

Handle Quoted Paths#56
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths

Conversation

@EliSauder

Copy link
Copy Markdown

Since I was in here and the parsing is updated, I figured #13 probably wouldn't be that bad to add. Here is my go at it :)

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thanks. Always a good sign when a change makes other fixes easier…

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
Comment threadimpl.go
Comment threadimpl_test.go Outdated

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

what do you think about these simplifcations? (i haven't confirmed they pass all the tests, including the new ones i suggested! apologies if i'm leading you astray...)

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
@EliSauder

Copy link
Copy Markdown
Author

@josharian I was looking over the stripPaths test cases, why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

I think it would make more sense for all of these to expect an error.

 {desc: "equals terminates path", input: "Iface[a/b=c.T]", want: "Iface[b=c.T]"},
// Exclamation mark is excluded - path ends at !
{desc: "exclamation terminates path", input: "Iface[a/b!c.T]", want: "Iface[b!c.T]"},
// Semicolon is excluded - path ends at ;
{desc: "semicolon terminates path", input: "Iface[a/b;c.T]", want: "Iface[b;c.T]"},
// Question mark is excluded
{desc: "question mark terminates path", input: "Iface[a/b?c.T]", want: "Iface[b?c.T]"},
// Colon is excluded
{desc: "colon terminates path", input: "Iface[a/b:c.T]", want: "Iface[b:c.T]"},
// Space terminates path (spec says "graphic chars without spaces")
{desc: "space terminates path", input: "Iface[a/b c.T]", want: "Iface[b c.T]"},
// Unicode replacement character U+FFFD is excluded
{desc: "replacement char terminates path", input: "Iface[a/b\uFFFDc.T]", want: "Iface[b\uFFFDc.T]"},

@josharian

Copy link
Copy Markdown
Owner

why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

Time box expired, decided to just ship, same as above.

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

OK, basically there. bunch of little nits. if you want, say the word and i'll make the last few changes myself. otherwise, comments below. things that occur multiple places i've noted only once. oh, and please run gofumpt at the end.

Comment threadimpl_test.go
{input: "github.com/go-chi/chi.Router[github.com/some-org/pkg.SomeType]", path: "github.com/go-chi/chi", typ: Type{Name: "Router", Params: []string{"pkg.SomeType"}}},

// Quoted path edge cases - unbalanced/double quotes
//// missing closing quote

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Add a comment above these explaining why they are here-but-commented-out.

Comment threadimpl.go
return string(out)

// We want balanced quotes for our paths
if quotesRemoved % 2 != 0 {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

nice

Comment threadimpl.go
return string(out), nil
}

func getNonPathSeg(runes []rune, quotesRemoved *int) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

please return quotesRemoved instead of passing pointer. and it looks like it can be a bool (singular quoteRemoved), not an int, which makes it clearer.

Comment threadimpl.go
*quotesRemoved += lenPreTrim - len(seg)
// If there are no path like characters, we are done
if n == -1 {
return seg, []rune{}, false

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

use nil instead of []rune{}

Comment threadimpl.go
return seg, remain, true
}

func getPathSeg(runes []rune) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

seg, remain []rune

Comment threadimpl.go
return seg, remain, true
}

func checkForQuote(p []rune) bool {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

call this hasQuote

Comment threadimpl.go
return p[0] == '"' || p[len(p)-1] == '"'
}

func trimPathSeg(p []rune) []rune {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

trimQuote

Comment threadimpl.go

for len(remain) > 0 {
var seg []rune
var more bool

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

very optional: change more to done, because done is marginally nicer than !more as a condition.

@EliSauder

Copy link
Copy Markdown
Author

@josharian I realized, without handling those test cases for findInterfaces, this won't actually resolve #13. I don't think it makes sense to merge in without that. So, I'll take a look at it along with your comments.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@EliSauder@josharian
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Handle Quoted Paths - #56

Open
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths
Open

Handle Quoted Paths#56
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths

Conversation

@EliSauder

Copy link
Copy Markdown

Since I was in here and the parsing is updated, I figured #13 probably wouldn't be that bad to add. Here is my go at it :)

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thanks. Always a good sign when a change makes other fixes easier…

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
Comment threadimpl.go
Comment threadimpl_test.go Outdated

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

what do you think about these simplifcations? (i haven't confirmed they pass all the tests, including the new ones i suggested! apologies if i'm leading you astray...)

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
@EliSauder

Copy link
Copy Markdown
Author

@josharian I was looking over the stripPaths test cases, why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

I think it would make more sense for all of these to expect an error.

 {desc: "equals terminates path", input: "Iface[a/b=c.T]", want: "Iface[b=c.T]"},
// Exclamation mark is excluded - path ends at !
{desc: "exclamation terminates path", input: "Iface[a/b!c.T]", want: "Iface[b!c.T]"},
// Semicolon is excluded - path ends at ;
{desc: "semicolon terminates path", input: "Iface[a/b;c.T]", want: "Iface[b;c.T]"},
// Question mark is excluded
{desc: "question mark terminates path", input: "Iface[a/b?c.T]", want: "Iface[b?c.T]"},
// Colon is excluded
{desc: "colon terminates path", input: "Iface[a/b:c.T]", want: "Iface[b:c.T]"},
// Space terminates path (spec says "graphic chars without spaces")
{desc: "space terminates path", input: "Iface[a/b c.T]", want: "Iface[b c.T]"},
// Unicode replacement character U+FFFD is excluded
{desc: "replacement char terminates path", input: "Iface[a/b\uFFFDc.T]", want: "Iface[b\uFFFDc.T]"},

@josharian

Copy link
Copy Markdown
Owner

why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

Time box expired, decided to just ship, same as above.

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

OK, basically there. bunch of little nits. if you want, say the word and i'll make the last few changes myself. otherwise, comments below. things that occur multiple places i've noted only once. oh, and please run gofumpt at the end.

Comment threadimpl_test.go
{input: "github.com/go-chi/chi.Router[github.com/some-org/pkg.SomeType]", path: "github.com/go-chi/chi", typ: Type{Name: "Router", Params: []string{"pkg.SomeType"}}},

// Quoted path edge cases - unbalanced/double quotes
//// missing closing quote

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Add a comment above these explaining why they are here-but-commented-out.

Comment threadimpl.go
return string(out)

// We want balanced quotes for our paths
if quotesRemoved % 2 != 0 {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

nice

Comment threadimpl.go
return string(out), nil
}

func getNonPathSeg(runes []rune, quotesRemoved *int) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

please return quotesRemoved instead of passing pointer. and it looks like it can be a bool (singular quoteRemoved), not an int, which makes it clearer.

Comment threadimpl.go
*quotesRemoved += lenPreTrim - len(seg)
// If there are no path like characters, we are done
if n == -1 {
return seg, []rune{}, false

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

use nil instead of []rune{}

Comment threadimpl.go
return seg, remain, true
}

func getPathSeg(runes []rune) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

seg, remain []rune

Comment threadimpl.go
return seg, remain, true
}

func checkForQuote(p []rune) bool {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

call this hasQuote

Comment threadimpl.go
return p[0] == '"' || p[len(p)-1] == '"'
}

func trimPathSeg(p []rune) []rune {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

trimQuote

Comment threadimpl.go

for len(remain) > 0 {
var seg []rune
var more bool

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

very optional: change more to done, because done is marginally nicer than !more as a condition.

@EliSauder

Copy link
Copy Markdown
Author

@josharian I realized, without handling those test cases for findInterfaces, this won't actually resolve #13. I don't think it makes sense to merge in without that. So, I'll take a look at it along with your comments.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@EliSauder@josharian
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Handle Quoted Paths - #56

Open
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths
Open

Handle Quoted Paths#56
EliSauder wants to merge 10 commits into
josharian:mainfrom
EliSauder:issue/13/handlequotedpaths

Conversation

@EliSauder

Copy link
Copy Markdown

Since I was in here and the parsing is updated, I figured #13 probably wouldn't be that bad to add. Here is my go at it :)

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Thanks. Always a good sign when a change makes other fixes easier…

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
Comment threadimpl.go
Comment threadimpl_test.go Outdated

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

what do you think about these simplifcations? (i haven't confirmed they pass all the tests, including the new ones i suggested! apologies if i'm leading you astray...)

Comment threadimpl.go Outdated
Comment threadimpl.go Outdated
@EliSauder

Copy link
Copy Markdown
Author

@josharian I was looking over the stripPaths test cases, why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

I think it would make more sense for all of these to expect an error.

 {desc: "equals terminates path", input: "Iface[a/b=c.T]", want: "Iface[b=c.T]"},
// Exclamation mark is excluded - path ends at !
{desc: "exclamation terminates path", input: "Iface[a/b!c.T]", want: "Iface[b!c.T]"},
// Semicolon is excluded - path ends at ;
{desc: "semicolon terminates path", input: "Iface[a/b;c.T]", want: "Iface[b;c.T]"},
// Question mark is excluded
{desc: "question mark terminates path", input: "Iface[a/b?c.T]", want: "Iface[b?c.T]"},
// Colon is excluded
{desc: "colon terminates path", input: "Iface[a/b:c.T]", want: "Iface[b:c.T]"},
// Space terminates path (spec says "graphic chars without spaces")
{desc: "space terminates path", input: "Iface[a/b c.T]", want: "Iface[b c.T]"},
// Unicode replacement character U+FFFD is excluded
{desc: "replacement char terminates path", input: "Iface[a/b\uFFFDc.T]", want: "Iface[b\uFFFDc.T]"},

@josharian

Copy link
Copy Markdown
Owner

why did you decide to have non-path characters terminate the path segment rather than just have them be invalid?

Time box expired, decided to just ship, same as above.

@josharianjosharian left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

OK, basically there. bunch of little nits. if you want, say the word and i'll make the last few changes myself. otherwise, comments below. things that occur multiple places i've noted only once. oh, and please run gofumpt at the end.

Comment threadimpl_test.go
{input: "github.com/go-chi/chi.Router[github.com/some-org/pkg.SomeType]", path: "github.com/go-chi/chi", typ: Type{Name: "Router", Params: []string{"pkg.SomeType"}}},

// Quoted path edge cases - unbalanced/double quotes
//// missing closing quote

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Add a comment above these explaining why they are here-but-commented-out.

Comment threadimpl.go
return string(out)

// We want balanced quotes for our paths
if quotesRemoved % 2 != 0 {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

nice

Comment threadimpl.go
return string(out), nil
}

func getNonPathSeg(runes []rune, quotesRemoved *int) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

please return quotesRemoved instead of passing pointer. and it looks like it can be a bool (singular quoteRemoved), not an int, which makes it clearer.

Comment threadimpl.go
*quotesRemoved += lenPreTrim - len(seg)
// If there are no path like characters, we are done
if n == -1 {
return seg, []rune{}, false

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

use nil instead of []rune{}

Comment threadimpl.go
return seg, remain, true
}

func getPathSeg(runes []rune) (seg []rune, remain []rune, more bool) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

seg, remain []rune

Comment threadimpl.go
return seg, remain, true
}

func checkForQuote(p []rune) bool {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

call this hasQuote

Comment threadimpl.go
return p[0] == '"' || p[len(p)-1] == '"'
}

func trimPathSeg(p []rune) []rune {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

trimQuote

Comment threadimpl.go

for len(remain) > 0 {
var seg []rune
var more bool

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

very optional: change more to done, because done is marginally nicer than !more as a condition.

@EliSauder

Copy link
Copy Markdown
Author

@josharian I realized, without handling those test cases for findInterfaces, this won't actually resolve #13. I don't think it makes sense to merge in without that. So, I'll take a look at it along with your comments.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@EliSauder@josharian