Add AST tree replacement class - #74

Closed
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master
Closed

Add AST tree replacement class#74
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master

Conversation

@BackTrackCRoot

@BackTrackCRootBackTrackCRoot commented Dec 9, 2025

Copy link
Copy Markdown

Support for replacing the current node during Visitor traversal.


While using it, I wanted to edit the tree to deobfuscate Lua code, but it seems editing functionality is not supported—only traversal is allowed. Of course, it's also possible that I'm not using it correctly. If that's the case, please close this issue. Currently, the code runs well in my project, though I’m not sure if there are any unknown bugs.

classNumberVisitor(ast.ASTReplaceVisitor):
defvisit_Number(self, node):
# Replace all Number types with a Number type of value 123. Of course, other types can be returned here, or conditional filtering can be applied.returnast.Number(123)
# If it is not necessary to replace the current one# return None

Support for replacing the current node during Visitor traversal.
@BackTrackCRoot

This comment was marked as resolved.

BackTrackCRoot

This comment was marked as abuse.

@boolangery

Copy link
Copy Markdown
Owner

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

@BackTrackCRoot

BackTrackCRoot commented Dec 11, 2025

Copy link
Copy Markdown
Author

Thank you very much! The code is currently working fine in my project without any blocking issues. Looking forward to hearing good news.
Additionally, I have resolved the issue regarding the incomplete type matching and have already updated it.

@LecrisUT

Copy link
Copy Markdown

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

Stumbled upon this project and this issue when trying to fix issues with Lua 5.5 making loop variables read-only. I got all the way up to encountering this issue. Hope this can get resolved, but I understand how tricky an issue this can become with trying to make sure the round-trip edit produces a minimum diff.

For my case I am able to work around this by querying the line and doing a regex substitution instead (incidentally the Node.lines property seems broken).

Wish you godspeed and success with this project.

@boolangery

Copy link
Copy Markdown
Owner

Superseded by #80 — production-grade ASTTransformer with proper parent tracking, root replacement, and comprehensive tests. Thanks for the idea @BackTrackCRoot!

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.

3 participants

@BackTrackCRoot@boolangery@LecrisUT
, '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

Add AST tree replacement class - #74

Closed
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master
Closed

Add AST tree replacement class#74
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master

Conversation

@BackTrackCRoot

@BackTrackCRootBackTrackCRoot commented Dec 9, 2025

Copy link
Copy Markdown

Support for replacing the current node during Visitor traversal.


While using it, I wanted to edit the tree to deobfuscate Lua code, but it seems editing functionality is not supported—only traversal is allowed. Of course, it's also possible that I'm not using it correctly. If that's the case, please close this issue. Currently, the code runs well in my project, though I’m not sure if there are any unknown bugs.

classNumberVisitor(ast.ASTReplaceVisitor):
defvisit_Number(self, node):
# Replace all Number types with a Number type of value 123. Of course, other types can be returned here, or conditional filtering can be applied.returnast.Number(123)
# If it is not necessary to replace the current one# return None

Support for replacing the current node during Visitor traversal.
@BackTrackCRoot

This comment was marked as resolved.

BackTrackCRoot

This comment was marked as abuse.

@boolangery

Copy link
Copy Markdown
Owner

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

@BackTrackCRoot

BackTrackCRoot commented Dec 11, 2025

Copy link
Copy Markdown
Author

Thank you very much! The code is currently working fine in my project without any blocking issues. Looking forward to hearing good news.
Additionally, I have resolved the issue regarding the incomplete type matching and have already updated it.

@LecrisUT

Copy link
Copy Markdown

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

Stumbled upon this project and this issue when trying to fix issues with Lua 5.5 making loop variables read-only. I got all the way up to encountering this issue. Hope this can get resolved, but I understand how tricky an issue this can become with trying to make sure the round-trip edit produces a minimum diff.

For my case I am able to work around this by querying the line and doing a regex substitution instead (incidentally the Node.lines property seems broken).

Wish you godspeed and success with this project.

@boolangery

Copy link
Copy Markdown
Owner

Superseded by #80 — production-grade ASTTransformer with proper parent tracking, root replacement, and comprehensive tests. Thanks for the idea @BackTrackCRoot!

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.

3 participants

@BackTrackCRoot@boolangery@LecrisUT
, '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

Add AST tree replacement class - #74

Closed
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master
Closed

Add AST tree replacement class#74
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master

Conversation

@BackTrackCRoot

@BackTrackCRootBackTrackCRoot commented Dec 9, 2025

Copy link
Copy Markdown

Support for replacing the current node during Visitor traversal.


While using it, I wanted to edit the tree to deobfuscate Lua code, but it seems editing functionality is not supported—only traversal is allowed. Of course, it's also possible that I'm not using it correctly. If that's the case, please close this issue. Currently, the code runs well in my project, though I’m not sure if there are any unknown bugs.

classNumberVisitor(ast.ASTReplaceVisitor):
defvisit_Number(self, node):
# Replace all Number types with a Number type of value 123. Of course, other types can be returned here, or conditional filtering can be applied.returnast.Number(123)
# If it is not necessary to replace the current one# return None

Support for replacing the current node during Visitor traversal.
@BackTrackCRoot

This comment was marked as resolved.

BackTrackCRoot

This comment was marked as abuse.

@boolangery

Copy link
Copy Markdown
Owner

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

@BackTrackCRoot

BackTrackCRoot commented Dec 11, 2025

Copy link
Copy Markdown
Author

Thank you very much! The code is currently working fine in my project without any blocking issues. Looking forward to hearing good news.
Additionally, I have resolved the issue regarding the incomplete type matching and have already updated it.

@LecrisUT

Copy link
Copy Markdown

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

Stumbled upon this project and this issue when trying to fix issues with Lua 5.5 making loop variables read-only. I got all the way up to encountering this issue. Hope this can get resolved, but I understand how tricky an issue this can become with trying to make sure the round-trip edit produces a minimum diff.

For my case I am able to work around this by querying the line and doing a regex substitution instead (incidentally the Node.lines property seems broken).

Wish you godspeed and success with this project.

@boolangery

Copy link
Copy Markdown
Owner

Superseded by #80 — production-grade ASTTransformer with proper parent tracking, root replacement, and comprehensive tests. Thanks for the idea @BackTrackCRoot!

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.

3 participants

@BackTrackCRoot@boolangery@LecrisUT
, '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

Add AST tree replacement class - #74

Closed
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master
Closed

Add AST tree replacement class#74
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master

Conversation

@BackTrackCRoot

@BackTrackCRootBackTrackCRoot commented Dec 9, 2025

Copy link
Copy Markdown

Support for replacing the current node during Visitor traversal.


While using it, I wanted to edit the tree to deobfuscate Lua code, but it seems editing functionality is not supported—only traversal is allowed. Of course, it's also possible that I'm not using it correctly. If that's the case, please close this issue. Currently, the code runs well in my project, though I’m not sure if there are any unknown bugs.

classNumberVisitor(ast.ASTReplaceVisitor):
defvisit_Number(self, node):
# Replace all Number types with a Number type of value 123. Of course, other types can be returned here, or conditional filtering can be applied.returnast.Number(123)
# If it is not necessary to replace the current one# return None

Support for replacing the current node during Visitor traversal.
@BackTrackCRoot

This comment was marked as resolved.

BackTrackCRoot

This comment was marked as abuse.

@boolangery

Copy link
Copy Markdown
Owner

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

@BackTrackCRoot

BackTrackCRoot commented Dec 11, 2025

Copy link
Copy Markdown
Author

Thank you very much! The code is currently working fine in my project without any blocking issues. Looking forward to hearing good news.
Additionally, I have resolved the issue regarding the incomplete type matching and have already updated it.

@LecrisUT

Copy link
Copy Markdown

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

Stumbled upon this project and this issue when trying to fix issues with Lua 5.5 making loop variables read-only. I got all the way up to encountering this issue. Hope this can get resolved, but I understand how tricky an issue this can become with trying to make sure the round-trip edit produces a minimum diff.

For my case I am able to work around this by querying the line and doing a regex substitution instead (incidentally the Node.lines property seems broken).

Wish you godspeed and success with this project.

@boolangery

Copy link
Copy Markdown
Owner

Superseded by #80 — production-grade ASTTransformer with proper parent tracking, root replacement, and comprehensive tests. Thanks for the idea @BackTrackCRoot!

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.

3 participants

@BackTrackCRoot@boolangery@LecrisUT
, '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

Add AST tree replacement class - #74

Closed
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master
Closed

Add AST tree replacement class#74
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master

Conversation

@BackTrackCRoot

@BackTrackCRootBackTrackCRoot commented Dec 9, 2025

Copy link
Copy Markdown

Support for replacing the current node during Visitor traversal.


While using it, I wanted to edit the tree to deobfuscate Lua code, but it seems editing functionality is not supported—only traversal is allowed. Of course, it's also possible that I'm not using it correctly. If that's the case, please close this issue. Currently, the code runs well in my project, though I’m not sure if there are any unknown bugs.

classNumberVisitor(ast.ASTReplaceVisitor):
defvisit_Number(self, node):
# Replace all Number types with a Number type of value 123. Of course, other types can be returned here, or conditional filtering can be applied.returnast.Number(123)
# If it is not necessary to replace the current one# return None

Support for replacing the current node during Visitor traversal.
@BackTrackCRoot

This comment was marked as resolved.

BackTrackCRoot

This comment was marked as abuse.

@boolangery

Copy link
Copy Markdown
Owner

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

@BackTrackCRoot

BackTrackCRoot commented Dec 11, 2025

Copy link
Copy Markdown
Author

Thank you very much! The code is currently working fine in my project without any blocking issues. Looking forward to hearing good news.
Additionally, I have resolved the issue regarding the incomplete type matching and have already updated it.

@LecrisUT

Copy link
Copy Markdown

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

Stumbled upon this project and this issue when trying to fix issues with Lua 5.5 making loop variables read-only. I got all the way up to encountering this issue. Hope this can get resolved, but I understand how tricky an issue this can become with trying to make sure the round-trip edit produces a minimum diff.

For my case I am able to work around this by querying the line and doing a regex substitution instead (incidentally the Node.lines property seems broken).

Wish you godspeed and success with this project.

@boolangery

Copy link
Copy Markdown
Owner

Superseded by #80 — production-grade ASTTransformer with proper parent tracking, root replacement, and comprehensive tests. Thanks for the idea @BackTrackCRoot!

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.

3 participants

@BackTrackCRoot@boolangery@LecrisUT
, '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

Add AST tree replacement class - #74

Closed
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master
Closed

Add AST tree replacement class#74
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master

Conversation

@BackTrackCRoot

@BackTrackCRootBackTrackCRoot commented Dec 9, 2025

Copy link
Copy Markdown

Support for replacing the current node during Visitor traversal.


While using it, I wanted to edit the tree to deobfuscate Lua code, but it seems editing functionality is not supported—only traversal is allowed. Of course, it's also possible that I'm not using it correctly. If that's the case, please close this issue. Currently, the code runs well in my project, though I’m not sure if there are any unknown bugs.

classNumberVisitor(ast.ASTReplaceVisitor):
defvisit_Number(self, node):
# Replace all Number types with a Number type of value 123. Of course, other types can be returned here, or conditional filtering can be applied.returnast.Number(123)
# If it is not necessary to replace the current one# return None

Support for replacing the current node during Visitor traversal.
@BackTrackCRoot

This comment was marked as resolved.

BackTrackCRoot

This comment was marked as abuse.

@boolangery

Copy link
Copy Markdown
Owner

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

@BackTrackCRoot

BackTrackCRoot commented Dec 11, 2025

Copy link
Copy Markdown
Author

Thank you very much! The code is currently working fine in my project without any blocking issues. Looking forward to hearing good news.
Additionally, I have resolved the issue regarding the incomplete type matching and have already updated it.

@LecrisUT

Copy link
Copy Markdown

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

Stumbled upon this project and this issue when trying to fix issues with Lua 5.5 making loop variables read-only. I got all the way up to encountering this issue. Hope this can get resolved, but I understand how tricky an issue this can become with trying to make sure the round-trip edit produces a minimum diff.

For my case I am able to work around this by querying the line and doing a regex substitution instead (incidentally the Node.lines property seems broken).

Wish you godspeed and success with this project.

@boolangery

Copy link
Copy Markdown
Owner

Superseded by #80 — production-grade ASTTransformer with proper parent tracking, root replacement, and comprehensive tests. Thanks for the idea @BackTrackCRoot!

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.

3 participants

@BackTrackCRoot@boolangery@LecrisUT
, '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

Add AST tree replacement class - #74

Closed
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master
Closed

Add AST tree replacement class#74
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master

Conversation

@BackTrackCRoot

@BackTrackCRootBackTrackCRoot commented Dec 9, 2025

Copy link
Copy Markdown

Support for replacing the current node during Visitor traversal.


While using it, I wanted to edit the tree to deobfuscate Lua code, but it seems editing functionality is not supported—only traversal is allowed. Of course, it's also possible that I'm not using it correctly. If that's the case, please close this issue. Currently, the code runs well in my project, though I’m not sure if there are any unknown bugs.

classNumberVisitor(ast.ASTReplaceVisitor):
defvisit_Number(self, node):
# Replace all Number types with a Number type of value 123. Of course, other types can be returned here, or conditional filtering can be applied.returnast.Number(123)
# If it is not necessary to replace the current one# return None

Support for replacing the current node during Visitor traversal.
@BackTrackCRoot

This comment was marked as resolved.

BackTrackCRoot

This comment was marked as abuse.

@boolangery

Copy link
Copy Markdown
Owner

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

@BackTrackCRoot

BackTrackCRoot commented Dec 11, 2025

Copy link
Copy Markdown
Author

Thank you very much! The code is currently working fine in my project without any blocking issues. Looking forward to hearing good news.
Additionally, I have resolved the issue regarding the incomplete type matching and have already updated it.

@LecrisUT

Copy link
Copy Markdown

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

Stumbled upon this project and this issue when trying to fix issues with Lua 5.5 making loop variables read-only. I got all the way up to encountering this issue. Hope this can get resolved, but I understand how tricky an issue this can become with trying to make sure the round-trip edit produces a minimum diff.

For my case I am able to work around this by querying the line and doing a regex substitution instead (incidentally the Node.lines property seems broken).

Wish you godspeed and success with this project.

@boolangery

Copy link
Copy Markdown
Owner

Superseded by #80 — production-grade ASTTransformer with proper parent tracking, root replacement, and comprehensive tests. Thanks for the idea @BackTrackCRoot!

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.

3 participants

@BackTrackCRoot@boolangery@LecrisUT
, '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

Add AST tree replacement class - #74

Closed
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master
Closed

Add AST tree replacement class#74
BackTrackCRoot wants to merge 4 commits into
boolangery:masterfrom
BackTrackCRoot:master

Conversation

@BackTrackCRoot

@BackTrackCRootBackTrackCRoot commented Dec 9, 2025

Copy link
Copy Markdown

Support for replacing the current node during Visitor traversal.


While using it, I wanted to edit the tree to deobfuscate Lua code, but it seems editing functionality is not supported—only traversal is allowed. Of course, it's also possible that I'm not using it correctly. If that's the case, please close this issue. Currently, the code runs well in my project, though I’m not sure if there are any unknown bugs.

classNumberVisitor(ast.ASTReplaceVisitor):
defvisit_Number(self, node):
# Replace all Number types with a Number type of value 123. Of course, other types can be returned here, or conditional filtering can be applied.returnast.Number(123)
# If it is not necessary to replace the current one# return None

Support for replacing the current node during Visitor traversal.
@BackTrackCRoot

This comment was marked as resolved.

BackTrackCRoot

This comment was marked as abuse.

@boolangery

Copy link
Copy Markdown
Owner

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

@BackTrackCRoot

BackTrackCRoot commented Dec 11, 2025

Copy link
Copy Markdown
Author

Thank you very much! The code is currently working fine in my project without any blocking issues. Looking forward to hearing good news.
Additionally, I have resolved the issue regarding the incomplete type matching and have already updated it.

@LecrisUT

Copy link
Copy Markdown

Thanks I'm looking how I can integrate this feature in a more generic way into the existing visitor, I'll keep you updated. But for now you can use your implem directly in your code there is no blocker right?

Stumbled upon this project and this issue when trying to fix issues with Lua 5.5 making loop variables read-only. I got all the way up to encountering this issue. Hope this can get resolved, but I understand how tricky an issue this can become with trying to make sure the round-trip edit produces a minimum diff.

For my case I am able to work around this by querying the line and doing a regex substitution instead (incidentally the Node.lines property seems broken).

Wish you godspeed and success with this project.

@boolangery

Copy link
Copy Markdown
Owner

Superseded by #80 — production-grade ASTTransformer with proper parent tracking, root replacement, and comprehensive tests. Thanks for the idea @BackTrackCRoot!

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.

3 participants

@BackTrackCRoot@boolangery@LecrisUT