Repository files navigation

parser

Parser logo

Build StatusCode QualityNPM versionNPM downloadsMIT LicenseCoverage Status

Minimal, loose html parser for Riot tags

Install

npm i @riotjs/parser --save

The package has two modules:

// Use as: parser(options).parse(code, startPosition)constparser=require('@riotjs/parser').default// The enum NodeTypes (a plain JS object) that contains the values of the// type property of the nodes emited by tagParser (and more).constnodeTypes=require('@riotjs/parser').nodeTypes

ES6 modules export:

importparser,{nodeTypes}from'@riotjs/parser'

This parser is a low-level tool that builds a simple array of objects with information about the given html fragment, readed secuencially. It is designed to parse one single tag and not entire html pages, the tag closing the root element ends the parsing.

There are 3 main node types:

  • Tags - HTMLElements, including SCRIPT and STYLE elements.
  • Comments - Ignored by default.
  • Text - Text nodes.

Opening tags can contain attributes. Text and attribute values can contain expressions.

There's no support for untagged JavaScript block.

The value returned by the parser is an object like this:

{;(data,// String of the given html fragment with no changes.output)// Array of objects with information about the parsed tags.}

The first element of output is the opening tag of the root element.

The parsing stops when the closing tag of the root is found, so the last node have the ending position.

Commands

  • Build: npm run build
  • Test: npm t
  • Samples: npm run samples

Tag names

Both, html and Riot tag names must start with a 7 bit letter ([a-zA-Z]) followed by zero o more ISO-8859-1 characters, except those in [\x00-\x2F\x7F-\xA0>/].

If the first letter is not found, it becomes simple text. Any non-recognized character ends the tag name ('/' behaves like whitespace).

All the tag names are converted to lower case.

Openning Tags

Start with a '<' followed by a tag name or the character '!' that signals the start of a comment, DOCTYPE or CDATA declaration (last two are parsed as comments).

Against the html5 specs, tags ending with '/>' are preserved as self-closing tags (the builder must handle this).

Closing tags

They are included in the output, except for void or self-closing tags, and its name include the first slash.

Attributes

Accepts all characters as the tag names and more.

An equal sign ('=') separates the name of the value. If there's no name, this '=' is the first character of the name (yes). The value can be empty.

One or more slashes ('/') behaves like whitespace. In the name, the slash splits the name generating two attributes, even if the name was quoted.

The first > anywhere in the openning tag ends the attribute list, except if this is in a quoted value.

All attribute names are converted to lowercase and the unquoted values are trimmed.

Comments

Must start with '<!--'. The next following '-->' or the end of file ends the comment.

Comments in short notation, starting with '<!' (without '--'), ends at the first '>'.

By default, comments are discarted.

Expressions

Expressions may be contained in attribute values or text nodes. The default delimiters are '{' and '}'.

There may be more tan one expression as part of one attribute value or text node, or only one replacing the entire value or node.

When used as the whole attribute value, there's no need to enclose the expression inside quotes, even if the expression contains whitespace.

Single and double quotes can be nested inside the expression.

To emit opening (left) brackets as literal text wherever an opening bracket is expected, the bracket must be prefixed with a backslash (the JS escape char '\'). This character is preserved in the output, but the parser will add a replace property for the attribute or node containing the escaped bracket, whose value is the bracket itself.

Options

  • comments - Pass true to preserve the comments.
  • brackets - Array of two string with the left/right brackets used to extract expressions.

About

Parser for the riot tags

Resources

Stars

11 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

parser

Parser logo

Build StatusCode QualityNPM versionNPM downloadsMIT LicenseCoverage Status

Minimal, loose html parser for Riot tags

Install

npm i @riotjs/parser --save

The package has two modules:

// Use as: parser(options).parse(code, startPosition)constparser=require('@riotjs/parser').default// The enum NodeTypes (a plain JS object) that contains the values of the// type property of the nodes emited by tagParser (and more).constnodeTypes=require('@riotjs/parser').nodeTypes

ES6 modules export:

importparser,{nodeTypes}from'@riotjs/parser'

This parser is a low-level tool that builds a simple array of objects with information about the given html fragment, readed secuencially. It is designed to parse one single tag and not entire html pages, the tag closing the root element ends the parsing.

There are 3 main node types:

  • Tags - HTMLElements, including SCRIPT and STYLE elements.
  • Comments - Ignored by default.
  • Text - Text nodes.

Opening tags can contain attributes. Text and attribute values can contain expressions.

There's no support for untagged JavaScript block.

The value returned by the parser is an object like this:

{;(data,// String of the given html fragment with no changes.output)// Array of objects with information about the parsed tags.}

The first element of output is the opening tag of the root element.

The parsing stops when the closing tag of the root is found, so the last node have the ending position.

Commands

  • Build: npm run build
  • Test: npm t
  • Samples: npm run samples

Tag names

Both, html and Riot tag names must start with a 7 bit letter ([a-zA-Z]) followed by zero o more ISO-8859-1 characters, except those in [\x00-\x2F\x7F-\xA0>/].

If the first letter is not found, it becomes simple text. Any non-recognized character ends the tag name ('/' behaves like whitespace).

All the tag names are converted to lower case.

Openning Tags

Start with a '<' followed by a tag name or the character '!' that signals the start of a comment, DOCTYPE or CDATA declaration (last two are parsed as comments).

Against the html5 specs, tags ending with '/>' are preserved as self-closing tags (the builder must handle this).

Closing tags

They are included in the output, except for void or self-closing tags, and its name include the first slash.

Attributes

Accepts all characters as the tag names and more.

An equal sign ('=') separates the name of the value. If there's no name, this '=' is the first character of the name (yes). The value can be empty.

One or more slashes ('/') behaves like whitespace. In the name, the slash splits the name generating two attributes, even if the name was quoted.

The first > anywhere in the openning tag ends the attribute list, except if this is in a quoted value.

All attribute names are converted to lowercase and the unquoted values are trimmed.

Comments

Must start with '<!--'. The next following '-->' or the end of file ends the comment.

Comments in short notation, starting with '<!' (without '--'), ends at the first '>'.

By default, comments are discarted.

Expressions

Expressions may be contained in attribute values or text nodes. The default delimiters are '{' and '}'.

There may be more tan one expression as part of one attribute value or text node, or only one replacing the entire value or node.

When used as the whole attribute value, there's no need to enclose the expression inside quotes, even if the expression contains whitespace.

Single and double quotes can be nested inside the expression.

To emit opening (left) brackets as literal text wherever an opening bracket is expected, the bracket must be prefixed with a backslash (the JS escape char '\'). This character is preserved in the output, but the parser will add a replace property for the attribute or node containing the escaped bracket, whose value is the bracket itself.

Options

  • comments - Pass true to preserve the comments.
  • brackets - Array of two string with the left/right brackets used to extract expressions.

About

Parser for the riot tags

Resources

Stars

11 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

parser

Parser logo

Build StatusCode QualityNPM versionNPM downloadsMIT LicenseCoverage Status

Minimal, loose html parser for Riot tags

Install

npm i @riotjs/parser --save

The package has two modules:

// Use as: parser(options).parse(code, startPosition)constparser=require('@riotjs/parser').default// The enum NodeTypes (a plain JS object) that contains the values of the// type property of the nodes emited by tagParser (and more).constnodeTypes=require('@riotjs/parser').nodeTypes

ES6 modules export:

importparser,{nodeTypes}from'@riotjs/parser'

This parser is a low-level tool that builds a simple array of objects with information about the given html fragment, readed secuencially. It is designed to parse one single tag and not entire html pages, the tag closing the root element ends the parsing.

There are 3 main node types:

  • Tags - HTMLElements, including SCRIPT and STYLE elements.
  • Comments - Ignored by default.
  • Text - Text nodes.

Opening tags can contain attributes. Text and attribute values can contain expressions.

There's no support for untagged JavaScript block.

The value returned by the parser is an object like this:

{;(data,// String of the given html fragment with no changes.output)// Array of objects with information about the parsed tags.}

The first element of output is the opening tag of the root element.

The parsing stops when the closing tag of the root is found, so the last node have the ending position.

Commands

  • Build: npm run build
  • Test: npm t
  • Samples: npm run samples

Tag names

Both, html and Riot tag names must start with a 7 bit letter ([a-zA-Z]) followed by zero o more ISO-8859-1 characters, except those in [\x00-\x2F\x7F-\xA0>/].

If the first letter is not found, it becomes simple text. Any non-recognized character ends the tag name ('/' behaves like whitespace).

All the tag names are converted to lower case.

Openning Tags

Start with a '<' followed by a tag name or the character '!' that signals the start of a comment, DOCTYPE or CDATA declaration (last two are parsed as comments).

Against the html5 specs, tags ending with '/>' are preserved as self-closing tags (the builder must handle this).

Closing tags

They are included in the output, except for void or self-closing tags, and its name include the first slash.

Attributes

Accepts all characters as the tag names and more.

An equal sign ('=') separates the name of the value. If there's no name, this '=' is the first character of the name (yes). The value can be empty.

One or more slashes ('/') behaves like whitespace. In the name, the slash splits the name generating two attributes, even if the name was quoted.

The first > anywhere in the openning tag ends the attribute list, except if this is in a quoted value.

All attribute names are converted to lowercase and the unquoted values are trimmed.

Comments

Must start with '<!--'. The next following '-->' or the end of file ends the comment.

Comments in short notation, starting with '<!' (without '--'), ends at the first '>'.

By default, comments are discarted.

Expressions

Expressions may be contained in attribute values or text nodes. The default delimiters are '{' and '}'.

There may be more tan one expression as part of one attribute value or text node, or only one replacing the entire value or node.

When used as the whole attribute value, there's no need to enclose the expression inside quotes, even if the expression contains whitespace.

Single and double quotes can be nested inside the expression.

To emit opening (left) brackets as literal text wherever an opening bracket is expected, the bracket must be prefixed with a backslash (the JS escape char '\'). This character is preserved in the output, but the parser will add a replace property for the attribute or node containing the escaped bracket, whose value is the bracket itself.

Options

  • comments - Pass true to preserve the comments.
  • brackets - Array of two string with the left/right brackets used to extract expressions.

About

Parser for the riot tags

Resources

Stars

11 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

parser

Parser logo

Build StatusCode QualityNPM versionNPM downloadsMIT LicenseCoverage Status

Minimal, loose html parser for Riot tags

Install

npm i @riotjs/parser --save

The package has two modules:

// Use as: parser(options).parse(code, startPosition)constparser=require('@riotjs/parser').default// The enum NodeTypes (a plain JS object) that contains the values of the// type property of the nodes emited by tagParser (and more).constnodeTypes=require('@riotjs/parser').nodeTypes

ES6 modules export:

importparser,{nodeTypes}from'@riotjs/parser'

This parser is a low-level tool that builds a simple array of objects with information about the given html fragment, readed secuencially. It is designed to parse one single tag and not entire html pages, the tag closing the root element ends the parsing.

There are 3 main node types:

  • Tags - HTMLElements, including SCRIPT and STYLE elements.
  • Comments - Ignored by default.
  • Text - Text nodes.

Opening tags can contain attributes. Text and attribute values can contain expressions.

There's no support for untagged JavaScript block.

The value returned by the parser is an object like this:

{;(data,// String of the given html fragment with no changes.output)// Array of objects with information about the parsed tags.}

The first element of output is the opening tag of the root element.

The parsing stops when the closing tag of the root is found, so the last node have the ending position.

Commands

  • Build: npm run build
  • Test: npm t
  • Samples: npm run samples

Tag names

Both, html and Riot tag names must start with a 7 bit letter ([a-zA-Z]) followed by zero o more ISO-8859-1 characters, except those in [\x00-\x2F\x7F-\xA0>/].

If the first letter is not found, it becomes simple text. Any non-recognized character ends the tag name ('/' behaves like whitespace).

All the tag names are converted to lower case.

Openning Tags

Start with a '<' followed by a tag name or the character '!' that signals the start of a comment, DOCTYPE or CDATA declaration (last two are parsed as comments).

Against the html5 specs, tags ending with '/>' are preserved as self-closing tags (the builder must handle this).

Closing tags

They are included in the output, except for void or self-closing tags, and its name include the first slash.

Attributes

Accepts all characters as the tag names and more.

An equal sign ('=') separates the name of the value. If there's no name, this '=' is the first character of the name (yes). The value can be empty.

One or more slashes ('/') behaves like whitespace. In the name, the slash splits the name generating two attributes, even if the name was quoted.

The first > anywhere in the openning tag ends the attribute list, except if this is in a quoted value.

All attribute names are converted to lowercase and the unquoted values are trimmed.

Comments

Must start with '<!--'. The next following '-->' or the end of file ends the comment.

Comments in short notation, starting with '<!' (without '--'), ends at the first '>'.

By default, comments are discarted.

Expressions

Expressions may be contained in attribute values or text nodes. The default delimiters are '{' and '}'.

There may be more tan one expression as part of one attribute value or text node, or only one replacing the entire value or node.

When used as the whole attribute value, there's no need to enclose the expression inside quotes, even if the expression contains whitespace.

Single and double quotes can be nested inside the expression.

To emit opening (left) brackets as literal text wherever an opening bracket is expected, the bracket must be prefixed with a backslash (the JS escape char '\'). This character is preserved in the output, but the parser will add a replace property for the attribute or node containing the escaped bracket, whose value is the bracket itself.

Options

  • comments - Pass true to preserve the comments.
  • brackets - Array of two string with the left/right brackets used to extract expressions.

About

Parser for the riot tags

Resources

Stars

11 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

parser

Parser logo

Build StatusCode QualityNPM versionNPM downloadsMIT LicenseCoverage Status

Minimal, loose html parser for Riot tags

Install

npm i @riotjs/parser --save

The package has two modules:

// Use as: parser(options).parse(code, startPosition)constparser=require('@riotjs/parser').default// The enum NodeTypes (a plain JS object) that contains the values of the// type property of the nodes emited by tagParser (and more).constnodeTypes=require('@riotjs/parser').nodeTypes

ES6 modules export:

importparser,{nodeTypes}from'@riotjs/parser'

This parser is a low-level tool that builds a simple array of objects with information about the given html fragment, readed secuencially. It is designed to parse one single tag and not entire html pages, the tag closing the root element ends the parsing.

There are 3 main node types:

  • Tags - HTMLElements, including SCRIPT and STYLE elements.
  • Comments - Ignored by default.
  • Text - Text nodes.

Opening tags can contain attributes. Text and attribute values can contain expressions.

There's no support for untagged JavaScript block.

The value returned by the parser is an object like this:

{;(data,// String of the given html fragment with no changes.output)// Array of objects with information about the parsed tags.}

The first element of output is the opening tag of the root element.

The parsing stops when the closing tag of the root is found, so the last node have the ending position.

Commands

  • Build: npm run build
  • Test: npm t
  • Samples: npm run samples

Tag names

Both, html and Riot tag names must start with a 7 bit letter ([a-zA-Z]) followed by zero o more ISO-8859-1 characters, except those in [\x00-\x2F\x7F-\xA0>/].

If the first letter is not found, it becomes simple text. Any non-recognized character ends the tag name ('/' behaves like whitespace).

All the tag names are converted to lower case.

Openning Tags

Start with a '<' followed by a tag name or the character '!' that signals the start of a comment, DOCTYPE or CDATA declaration (last two are parsed as comments).

Against the html5 specs, tags ending with '/>' are preserved as self-closing tags (the builder must handle this).

Closing tags

They are included in the output, except for void or self-closing tags, and its name include the first slash.

Attributes

Accepts all characters as the tag names and more.

An equal sign ('=') separates the name of the value. If there's no name, this '=' is the first character of the name (yes). The value can be empty.

One or more slashes ('/') behaves like whitespace. In the name, the slash splits the name generating two attributes, even if the name was quoted.

The first > anywhere in the openning tag ends the attribute list, except if this is in a quoted value.

All attribute names are converted to lowercase and the unquoted values are trimmed.

Comments

Must start with '<!--'. The next following '-->' or the end of file ends the comment.

Comments in short notation, starting with '<!' (without '--'), ends at the first '>'.

By default, comments are discarted.

Expressions

Expressions may be contained in attribute values or text nodes. The default delimiters are '{' and '}'.

There may be more tan one expression as part of one attribute value or text node, or only one replacing the entire value or node.

When used as the whole attribute value, there's no need to enclose the expression inside quotes, even if the expression contains whitespace.

Single and double quotes can be nested inside the expression.

To emit opening (left) brackets as literal text wherever an opening bracket is expected, the bracket must be prefixed with a backslash (the JS escape char '\'). This character is preserved in the output, but the parser will add a replace property for the attribute or node containing the escaped bracket, whose value is the bracket itself.

Options

  • comments - Pass true to preserve the comments.
  • brackets - Array of two string with the left/right brackets used to extract expressions.

About

Parser for the riot tags

Resources

Stars

11 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

parser

Parser logo

Build StatusCode QualityNPM versionNPM downloadsMIT LicenseCoverage Status

Minimal, loose html parser for Riot tags

Install

npm i @riotjs/parser --save

The package has two modules:

// Use as: parser(options).parse(code, startPosition)constparser=require('@riotjs/parser').default// The enum NodeTypes (a plain JS object) that contains the values of the// type property of the nodes emited by tagParser (and more).constnodeTypes=require('@riotjs/parser').nodeTypes

ES6 modules export:

importparser,{nodeTypes}from'@riotjs/parser'

This parser is a low-level tool that builds a simple array of objects with information about the given html fragment, readed secuencially. It is designed to parse one single tag and not entire html pages, the tag closing the root element ends the parsing.

There are 3 main node types:

  • Tags - HTMLElements, including SCRIPT and STYLE elements.
  • Comments - Ignored by default.
  • Text - Text nodes.

Opening tags can contain attributes. Text and attribute values can contain expressions.

There's no support for untagged JavaScript block.

The value returned by the parser is an object like this:

{;(data,// String of the given html fragment with no changes.output)// Array of objects with information about the parsed tags.}

The first element of output is the opening tag of the root element.

The parsing stops when the closing tag of the root is found, so the last node have the ending position.

Commands

  • Build: npm run build
  • Test: npm t
  • Samples: npm run samples

Tag names

Both, html and Riot tag names must start with a 7 bit letter ([a-zA-Z]) followed by zero o more ISO-8859-1 characters, except those in [\x00-\x2F\x7F-\xA0>/].

If the first letter is not found, it becomes simple text. Any non-recognized character ends the tag name ('/' behaves like whitespace).

All the tag names are converted to lower case.

Openning Tags

Start with a '<' followed by a tag name or the character '!' that signals the start of a comment, DOCTYPE or CDATA declaration (last two are parsed as comments).

Against the html5 specs, tags ending with '/>' are preserved as self-closing tags (the builder must handle this).

Closing tags

They are included in the output, except for void or self-closing tags, and its name include the first slash.

Attributes

Accepts all characters as the tag names and more.

An equal sign ('=') separates the name of the value. If there's no name, this '=' is the first character of the name (yes). The value can be empty.

One or more slashes ('/') behaves like whitespace. In the name, the slash splits the name generating two attributes, even if the name was quoted.

The first > anywhere in the openning tag ends the attribute list, except if this is in a quoted value.

All attribute names are converted to lowercase and the unquoted values are trimmed.

Comments

Must start with '<!--'. The next following '-->' or the end of file ends the comment.

Comments in short notation, starting with '<!' (without '--'), ends at the first '>'.

By default, comments are discarted.

Expressions

Expressions may be contained in attribute values or text nodes. The default delimiters are '{' and '}'.

There may be more tan one expression as part of one attribute value or text node, or only one replacing the entire value or node.

When used as the whole attribute value, there's no need to enclose the expression inside quotes, even if the expression contains whitespace.

Single and double quotes can be nested inside the expression.

To emit opening (left) brackets as literal text wherever an opening bracket is expected, the bracket must be prefixed with a backslash (the JS escape char '\'). This character is preserved in the output, but the parser will add a replace property for the attribute or node containing the escaped bracket, whose value is the bracket itself.

Options

  • comments - Pass true to preserve the comments.
  • brackets - Array of two string with the left/right brackets used to extract expressions.

About

Parser for the riot tags

Resources

Stars

11 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

parser

Parser logo

Build StatusCode QualityNPM versionNPM downloadsMIT LicenseCoverage Status

Minimal, loose html parser for Riot tags

Install

npm i @riotjs/parser --save

The package has two modules:

// Use as: parser(options).parse(code, startPosition)constparser=require('@riotjs/parser').default// The enum NodeTypes (a plain JS object) that contains the values of the// type property of the nodes emited by tagParser (and more).constnodeTypes=require('@riotjs/parser').nodeTypes

ES6 modules export:

importparser,{nodeTypes}from'@riotjs/parser'

This parser is a low-level tool that builds a simple array of objects with information about the given html fragment, readed secuencially. It is designed to parse one single tag and not entire html pages, the tag closing the root element ends the parsing.

There are 3 main node types:

  • Tags - HTMLElements, including SCRIPT and STYLE elements.
  • Comments - Ignored by default.
  • Text - Text nodes.

Opening tags can contain attributes. Text and attribute values can contain expressions.

There's no support for untagged JavaScript block.

The value returned by the parser is an object like this:

{;(data,// String of the given html fragment with no changes.output)// Array of objects with information about the parsed tags.}

The first element of output is the opening tag of the root element.

The parsing stops when the closing tag of the root is found, so the last node have the ending position.

Commands

  • Build: npm run build
  • Test: npm t
  • Samples: npm run samples

Tag names

Both, html and Riot tag names must start with a 7 bit letter ([a-zA-Z]) followed by zero o more ISO-8859-1 characters, except those in [\x00-\x2F\x7F-\xA0>/].

If the first letter is not found, it becomes simple text. Any non-recognized character ends the tag name ('/' behaves like whitespace).

All the tag names are converted to lower case.

Openning Tags

Start with a '<' followed by a tag name or the character '!' that signals the start of a comment, DOCTYPE or CDATA declaration (last two are parsed as comments).

Against the html5 specs, tags ending with '/>' are preserved as self-closing tags (the builder must handle this).

Closing tags

They are included in the output, except for void or self-closing tags, and its name include the first slash.

Attributes

Accepts all characters as the tag names and more.

An equal sign ('=') separates the name of the value. If there's no name, this '=' is the first character of the name (yes). The value can be empty.

One or more slashes ('/') behaves like whitespace. In the name, the slash splits the name generating two attributes, even if the name was quoted.

The first > anywhere in the openning tag ends the attribute list, except if this is in a quoted value.

All attribute names are converted to lowercase and the unquoted values are trimmed.

Comments

Must start with '<!--'. The next following '-->' or the end of file ends the comment.

Comments in short notation, starting with '<!' (without '--'), ends at the first '>'.

By default, comments are discarted.

Expressions

Expressions may be contained in attribute values or text nodes. The default delimiters are '{' and '}'.

There may be more tan one expression as part of one attribute value or text node, or only one replacing the entire value or node.

When used as the whole attribute value, there's no need to enclose the expression inside quotes, even if the expression contains whitespace.

Single and double quotes can be nested inside the expression.

To emit opening (left) brackets as literal text wherever an opening bracket is expected, the bracket must be prefixed with a backslash (the JS escape char '\'). This character is preserved in the output, but the parser will add a replace property for the attribute or node containing the escaped bracket, whose value is the bracket itself.

Options

  • comments - Pass true to preserve the comments.
  • brackets - Array of two string with the left/right brackets used to extract expressions.

About

Parser for the riot tags

Resources

Stars

11 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

parser

Parser logo

Build StatusCode QualityNPM versionNPM downloadsMIT LicenseCoverage Status

Minimal, loose html parser for Riot tags

Install

npm i @riotjs/parser --save

The package has two modules:

// Use as: parser(options).parse(code, startPosition)constparser=require('@riotjs/parser').default// The enum NodeTypes (a plain JS object) that contains the values of the// type property of the nodes emited by tagParser (and more).constnodeTypes=require('@riotjs/parser').nodeTypes

ES6 modules export:

importparser,{nodeTypes}from'@riotjs/parser'

This parser is a low-level tool that builds a simple array of objects with information about the given html fragment, readed secuencially. It is designed to parse one single tag and not entire html pages, the tag closing the root element ends the parsing.

There are 3 main node types:

  • Tags - HTMLElements, including SCRIPT and STYLE elements.
  • Comments - Ignored by default.
  • Text - Text nodes.

Opening tags can contain attributes. Text and attribute values can contain expressions.

There's no support for untagged JavaScript block.

The value returned by the parser is an object like this:

{;(data,// String of the given html fragment with no changes.output)// Array of objects with information about the parsed tags.}

The first element of output is the opening tag of the root element.

The parsing stops when the closing tag of the root is found, so the last node have the ending position.

Commands

  • Build: npm run build
  • Test: npm t
  • Samples: npm run samples

Tag names

Both, html and Riot tag names must start with a 7 bit letter ([a-zA-Z]) followed by zero o more ISO-8859-1 characters, except those in [\x00-\x2F\x7F-\xA0>/].

If the first letter is not found, it becomes simple text. Any non-recognized character ends the tag name ('/' behaves like whitespace).

All the tag names are converted to lower case.

Openning Tags

Start with a '<' followed by a tag name or the character '!' that signals the start of a comment, DOCTYPE or CDATA declaration (last two are parsed as comments).

Against the html5 specs, tags ending with '/>' are preserved as self-closing tags (the builder must handle this).

Closing tags

They are included in the output, except for void or self-closing tags, and its name include the first slash.

Attributes

Accepts all characters as the tag names and more.

An equal sign ('=') separates the name of the value. If there's no name, this '=' is the first character of the name (yes). The value can be empty.

One or more slashes ('/') behaves like whitespace. In the name, the slash splits the name generating two attributes, even if the name was quoted.

The first > anywhere in the openning tag ends the attribute list, except if this is in a quoted value.

All attribute names are converted to lowercase and the unquoted values are trimmed.

Comments

Must start with '<!--'. The next following '-->' or the end of file ends the comment.

Comments in short notation, starting with '<!' (without '--'), ends at the first '>'.

By default, comments are discarted.

Expressions

Expressions may be contained in attribute values or text nodes. The default delimiters are '{' and '}'.

There may be more tan one expression as part of one attribute value or text node, or only one replacing the entire value or node.

When used as the whole attribute value, there's no need to enclose the expression inside quotes, even if the expression contains whitespace.

Single and double quotes can be nested inside the expression.

To emit opening (left) brackets as literal text wherever an opening bracket is expected, the bracket must be prefixed with a backslash (the JS escape char '\'). This character is preserved in the output, but the parser will add a replace property for the attribute or node containing the escaped bracket, whose value is the bracket itself.

Options

  • comments - Pass true to preserve the comments.
  • brackets - Array of two string with the left/right brackets used to extract expressions.

About

Parser for the riot tags

Resources

Stars

11 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages