Skip to content

Repository files navigation

Overly simplistic XML parser

This is an overly simplistic non-validating XML parser with utilities. It will indiscriminately parse most well-formed XML documents that don't try to do anything clever.

The purpose of this library to allow easy parsing and consuming XML files. Does the world really need it? No, probably not. But all the other available packages the author tested were either a massive overkill or failed to parse fairly simplistic XML correctly. So here we are.

There are some limitations:

  • Comments are discarded.
  • Processing instructions are discarded.
  • Namespace prefixes are preserved but otherwise ignored.
  • Doctypes are discarded.
  • Nested doctypes are not supported and will cause errors.
  • Nodes have a limited interface.
  • Made for a node.js environment with no browser build provided.

But on the upside:

  • Built in selector engine.
  • No dependencies.

Installing

The usual:

$ npm i @borgar/simple-xml

Parsing XML

import{parseXML}from'@borgar/simple-xml';constdom=parseXML('<root><node>Lorem ipsum</node></root>');console.log(dom.getElementsByTagName('node').textContent);

The parse function accepts two arguments, the first is an XML source. The second is an options object. There are two options:

Allow normally forbidden unquoted attributes with laxAttr:

parseXML('<root><node foo=bar /></root>',{laxAttr: true});

Allow normally forbidden "rootless" documents with emptyDoc:

parseXML('',{emptyDoc: true});

As well as a parse method, the package exports Node classes: Node, Element, Document, TextNode, and CDataNode. They are pretty much what you expect but with an incomplete or altered set of DOM API functions.

See the API documentation.

Nodes have the following methods and properties

Name & identity

  • .nodeName An uppercase tag name. (BAR in the case of <foo:bar>)

  • .tagName A case preserved tag (bar in the case of <foo:bar>)

  • .nodeType A node type number (e.g. Element.ELEMENT_NODE === 1)

  • .ns A namespace identifier (foo in the case of <foo:bar>)

  • .fullName A full tag name with identifier (foo:bar in the case of <foo:bar>)

Attributes

  • .getAttribute( attrName )
  • .setAttribute( attrName, attrValue )
  • .hasAttribute( attrName )
  • .removeAttribute( attrName )

Attributes are not stored as attribute nodes in a list, but rather they are a simple { name: value } style object on the node.

Tree & traversal

  • .appendChild( Node ) Inserts a new node as the last child of a parent. If a node already has a parent, it is removed from that parent when inserted in the target.

  • .children Emits an array of direct child nodes that are of type Element.

  • .parentNode A direct reference to the node's container.

  • .childNodes An array of all direct child nodes.

  • .textContent Emits the text content of the target's subtree.

    Text is preserved as-is in the tree but whitespace is cleaned (unless xml:space dictates otherwise) when using .textContent.

  • .getElementsByTagName( tagName ) Lists all Elements in the target's subtree, traversal order, that have .tagName equal to the argument. Function is case-sensitive.

  • .querySelectorAll( cssSelector ) Lists all Elements in the target's subtree, traversal order, that match the supplied CSS selector. Function should be case-sensitive but may be case insensitive for some.

  • .toJS() Returns the target node's subtree in a JsonML-like structure.

Roughly, if you supply this:

<x:tagfoo="bar">Text content</x:tag>

It will parse to a document which has a .root node looking roughly like this:

{nodeType: 1,nodeName: 'TAG',ns: 'x',tagName: 'tag',fullName: 'x:tag',attr: {'foo': 'bar'}parentNode: null,childNodes=[{nodeName: '#text',nodeType: 3,value: 'Text content',parentNode: {...},}]}

About

A reasonably fast, simple and pure-JS XML parser with no dependencies

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - borgar/simple-xml: A reasonably fast, simple and pure-JS XML parser with no dependencies · GitHub
Skip to content

Repository files navigation

Overly simplistic XML parser

This is an overly simplistic non-validating XML parser with utilities. It will indiscriminately parse most well-formed XML documents that don't try to do anything clever.

The purpose of this library to allow easy parsing and consuming XML files. Does the world really need it? No, probably not. But all the other available packages the author tested were either a massive overkill or failed to parse fairly simplistic XML correctly. So here we are.

There are some limitations:

  • Comments are discarded.
  • Processing instructions are discarded.
  • Namespace prefixes are preserved but otherwise ignored.
  • Doctypes are discarded.
  • Nested doctypes are not supported and will cause errors.
  • Nodes have a limited interface.
  • Made for a node.js environment with no browser build provided.

But on the upside:

  • Built in selector engine.
  • No dependencies.

Installing

The usual:

$ npm i @borgar/simple-xml

Parsing XML

import{parseXML}from'@borgar/simple-xml';constdom=parseXML('<root><node>Lorem ipsum</node></root>');console.log(dom.getElementsByTagName('node').textContent);

The parse function accepts two arguments, the first is an XML source. The second is an options object. There are two options:

Allow normally forbidden unquoted attributes with laxAttr:

parseXML('<root><node foo=bar /></root>',{laxAttr: true});

Allow normally forbidden "rootless" documents with emptyDoc:

parseXML('',{emptyDoc: true});

As well as a parse method, the package exports Node classes: Node, Element, Document, TextNode, and CDataNode. They are pretty much what you expect but with an incomplete or altered set of DOM API functions.

See the API documentation.

Nodes have the following methods and properties

Name & identity

  • .nodeName An uppercase tag name. (BAR in the case of <foo:bar>)

  • .tagName A case preserved tag (bar in the case of <foo:bar>)

  • .nodeType A node type number (e.g. Element.ELEMENT_NODE === 1)

  • .ns A namespace identifier (foo in the case of <foo:bar>)

  • .fullName A full tag name with identifier (foo:bar in the case of <foo:bar>)

Attributes

  • .getAttribute( attrName )
  • .setAttribute( attrName, attrValue )
  • .hasAttribute( attrName )
  • .removeAttribute( attrName )

Attributes are not stored as attribute nodes in a list, but rather they are a simple { name: value } style object on the node.

Tree & traversal

  • .appendChild( Node ) Inserts a new node as the last child of a parent. If a node already has a parent, it is removed from that parent when inserted in the target.

  • .children Emits an array of direct child nodes that are of type Element.

  • .parentNode A direct reference to the node's container.

  • .childNodes An array of all direct child nodes.

  • .textContent Emits the text content of the target's subtree.

    Text is preserved as-is in the tree but whitespace is cleaned (unless xml:space dictates otherwise) when using .textContent.

  • .getElementsByTagName( tagName ) Lists all Elements in the target's subtree, traversal order, that have .tagName equal to the argument. Function is case-sensitive.

  • .querySelectorAll( cssSelector ) Lists all Elements in the target's subtree, traversal order, that match the supplied CSS selector. Function should be case-sensitive but may be case insensitive for some.

  • .toJS() Returns the target node's subtree in a JsonML-like structure.

Roughly, if you supply this:

<x:tagfoo="bar">Text content</x:tag>

It will parse to a document which has a .root node looking roughly like this:

{nodeType: 1,nodeName: 'TAG',ns: 'x',tagName: 'tag',fullName: 'x:tag',attr: {'foo': 'bar'}parentNode: null,childNodes=[{nodeName: '#text',nodeType: 3,value: 'Text content',parentNode: {...},}]}

About

A reasonably fast, simple and pure-JS XML parser with no dependencies

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Overly simplistic XML parser

This is an overly simplistic non-validating XML parser with utilities. It will indiscriminately parse most well-formed XML documents that don't try to do anything clever.

The purpose of this library to allow easy parsing and consuming XML files. Does the world really need it? No, probably not. But all the other available packages the author tested were either a massive overkill or failed to parse fairly simplistic XML correctly. So here we are.

There are some limitations:

  • Comments are discarded.
  • Processing instructions are discarded.
  • Namespace prefixes are preserved but otherwise ignored.
  • Doctypes are discarded.
  • Nested doctypes are not supported and will cause errors.
  • Nodes have a limited interface.
  • Made for a node.js environment with no browser build provided.

But on the upside:

  • Built in selector engine.
  • No dependencies.

Installing

The usual:

$ npm i @borgar/simple-xml

Parsing XML

import{parseXML}from'@borgar/simple-xml';constdom=parseXML('<root><node>Lorem ipsum</node></root>');console.log(dom.getElementsByTagName('node').textContent);

The parse function accepts two arguments, the first is an XML source. The second is an options object. There are two options:

Allow normally forbidden unquoted attributes with laxAttr:

parseXML('<root><node foo=bar /></root>',{laxAttr: true});

Allow normally forbidden "rootless" documents with emptyDoc:

parseXML('',{emptyDoc: true});

As well as a parse method, the package exports Node classes: Node, Element, Document, TextNode, and CDataNode. They are pretty much what you expect but with an incomplete or altered set of DOM API functions.

See the API documentation.

Nodes have the following methods and properties

Name & identity

  • .nodeName An uppercase tag name. (BAR in the case of <foo:bar>)

  • .tagName A case preserved tag (bar in the case of <foo:bar>)

  • .nodeType A node type number (e.g. Element.ELEMENT_NODE === 1)

  • .ns A namespace identifier (foo in the case of <foo:bar>)

  • .fullName A full tag name with identifier (foo:bar in the case of <foo:bar>)

Attributes

  • .getAttribute( attrName )
  • .setAttribute( attrName, attrValue )
  • .hasAttribute( attrName )
  • .removeAttribute( attrName )

Attributes are not stored as attribute nodes in a list, but rather they are a simple { name: value } style object on the node.

Tree & traversal

  • .appendChild( Node ) Inserts a new node as the last child of a parent. If a node already has a parent, it is removed from that parent when inserted in the target.

  • .children Emits an array of direct child nodes that are of type Element.

  • .parentNode A direct reference to the node's container.

  • .childNodes An array of all direct child nodes.

  • .textContent Emits the text content of the target's subtree.

    Text is preserved as-is in the tree but whitespace is cleaned (unless xml:space dictates otherwise) when using .textContent.

  • .getElementsByTagName( tagName ) Lists all Elements in the target's subtree, traversal order, that have .tagName equal to the argument. Function is case-sensitive.

  • .querySelectorAll( cssSelector ) Lists all Elements in the target's subtree, traversal order, that match the supplied CSS selector. Function should be case-sensitive but may be case insensitive for some.

  • .toJS() Returns the target node's subtree in a JsonML-like structure.

Roughly, if you supply this:

<x:tagfoo="bar">Text content</x:tag>

It will parse to a document which has a .root node looking roughly like this:

{nodeType: 1,nodeName: 'TAG',ns: 'x',tagName: 'tag',fullName: 'x:tag',attr: {'foo': 'bar'}parentNode: null,childNodes=[{nodeName: '#text',nodeType: 3,value: 'Text content',parentNode: {...},}]}

About

A reasonably fast, simple and pure-JS XML parser with no dependencies

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Overly simplistic XML parser

This is an overly simplistic non-validating XML parser with utilities. It will indiscriminately parse most well-formed XML documents that don't try to do anything clever.

The purpose of this library to allow easy parsing and consuming XML files. Does the world really need it? No, probably not. But all the other available packages the author tested were either a massive overkill or failed to parse fairly simplistic XML correctly. So here we are.

There are some limitations:

  • Comments are discarded.
  • Processing instructions are discarded.
  • Namespace prefixes are preserved but otherwise ignored.
  • Doctypes are discarded.
  • Nested doctypes are not supported and will cause errors.
  • Nodes have a limited interface.
  • Made for a node.js environment with no browser build provided.

But on the upside:

  • Built in selector engine.
  • No dependencies.

Installing

The usual:

$ npm i @borgar/simple-xml

Parsing XML

import{parseXML}from'@borgar/simple-xml';constdom=parseXML('<root><node>Lorem ipsum</node></root>');console.log(dom.getElementsByTagName('node').textContent);

The parse function accepts two arguments, the first is an XML source. The second is an options object. There are two options:

Allow normally forbidden unquoted attributes with laxAttr:

parseXML('<root><node foo=bar /></root>',{laxAttr: true});

Allow normally forbidden "rootless" documents with emptyDoc:

parseXML('',{emptyDoc: true});

As well as a parse method, the package exports Node classes: Node, Element, Document, TextNode, and CDataNode. They are pretty much what you expect but with an incomplete or altered set of DOM API functions.

See the API documentation.

Nodes have the following methods and properties

Name & identity

  • .nodeName An uppercase tag name. (BAR in the case of <foo:bar>)

  • .tagName A case preserved tag (bar in the case of <foo:bar>)

  • .nodeType A node type number (e.g. Element.ELEMENT_NODE === 1)

  • .ns A namespace identifier (foo in the case of <foo:bar>)

  • .fullName A full tag name with identifier (foo:bar in the case of <foo:bar>)

Attributes

  • .getAttribute( attrName )
  • .setAttribute( attrName, attrValue )
  • .hasAttribute( attrName )
  • .removeAttribute( attrName )

Attributes are not stored as attribute nodes in a list, but rather they are a simple { name: value } style object on the node.

Tree & traversal

  • .appendChild( Node ) Inserts a new node as the last child of a parent. If a node already has a parent, it is removed from that parent when inserted in the target.

  • .children Emits an array of direct child nodes that are of type Element.

  • .parentNode A direct reference to the node's container.

  • .childNodes An array of all direct child nodes.

  • .textContent Emits the text content of the target's subtree.

    Text is preserved as-is in the tree but whitespace is cleaned (unless xml:space dictates otherwise) when using .textContent.

  • .getElementsByTagName( tagName ) Lists all Elements in the target's subtree, traversal order, that have .tagName equal to the argument. Function is case-sensitive.

  • .querySelectorAll( cssSelector ) Lists all Elements in the target's subtree, traversal order, that match the supplied CSS selector. Function should be case-sensitive but may be case insensitive for some.

  • .toJS() Returns the target node's subtree in a JsonML-like structure.

Roughly, if you supply this:

<x:tagfoo="bar">Text content</x:tag>

It will parse to a document which has a .root node looking roughly like this:

{nodeType: 1,nodeName: 'TAG',ns: 'x',tagName: 'tag',fullName: 'x:tag',attr: {'foo': 'bar'}parentNode: null,childNodes=[{nodeName: '#text',nodeType: 3,value: 'Text content',parentNode: {...},}]}

About

A reasonably fast, simple and pure-JS XML parser with no dependencies

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Overly simplistic XML parser

This is an overly simplistic non-validating XML parser with utilities. It will indiscriminately parse most well-formed XML documents that don't try to do anything clever.

The purpose of this library to allow easy parsing and consuming XML files. Does the world really need it? No, probably not. But all the other available packages the author tested were either a massive overkill or failed to parse fairly simplistic XML correctly. So here we are.

There are some limitations:

  • Comments are discarded.
  • Processing instructions are discarded.
  • Namespace prefixes are preserved but otherwise ignored.
  • Doctypes are discarded.
  • Nested doctypes are not supported and will cause errors.
  • Nodes have a limited interface.
  • Made for a node.js environment with no browser build provided.

But on the upside:

  • Built in selector engine.
  • No dependencies.

Installing

The usual:

$ npm i @borgar/simple-xml

Parsing XML

import{parseXML}from'@borgar/simple-xml';constdom=parseXML('<root><node>Lorem ipsum</node></root>');console.log(dom.getElementsByTagName('node').textContent);

The parse function accepts two arguments, the first is an XML source. The second is an options object. There are two options:

Allow normally forbidden unquoted attributes with laxAttr:

parseXML('<root><node foo=bar /></root>',{laxAttr: true});

Allow normally forbidden "rootless" documents with emptyDoc:

parseXML('',{emptyDoc: true});

As well as a parse method, the package exports Node classes: Node, Element, Document, TextNode, and CDataNode. They are pretty much what you expect but with an incomplete or altered set of DOM API functions.

See the API documentation.

Nodes have the following methods and properties

Name & identity

  • .nodeName An uppercase tag name. (BAR in the case of <foo:bar>)

  • .tagName A case preserved tag (bar in the case of <foo:bar>)

  • .nodeType A node type number (e.g. Element.ELEMENT_NODE === 1)

  • .ns A namespace identifier (foo in the case of <foo:bar>)

  • .fullName A full tag name with identifier (foo:bar in the case of <foo:bar>)

Attributes

  • .getAttribute( attrName )
  • .setAttribute( attrName, attrValue )
  • .hasAttribute( attrName )
  • .removeAttribute( attrName )

Attributes are not stored as attribute nodes in a list, but rather they are a simple { name: value } style object on the node.

Tree & traversal

  • .appendChild( Node ) Inserts a new node as the last child of a parent. If a node already has a parent, it is removed from that parent when inserted in the target.

  • .children Emits an array of direct child nodes that are of type Element.

  • .parentNode A direct reference to the node's container.

  • .childNodes An array of all direct child nodes.

  • .textContent Emits the text content of the target's subtree.

    Text is preserved as-is in the tree but whitespace is cleaned (unless xml:space dictates otherwise) when using .textContent.

  • .getElementsByTagName( tagName ) Lists all Elements in the target's subtree, traversal order, that have .tagName equal to the argument. Function is case-sensitive.

  • .querySelectorAll( cssSelector ) Lists all Elements in the target's subtree, traversal order, that match the supplied CSS selector. Function should be case-sensitive but may be case insensitive for some.

  • .toJS() Returns the target node's subtree in a JsonML-like structure.

Roughly, if you supply this:

<x:tagfoo="bar">Text content</x:tag>

It will parse to a document which has a .root node looking roughly like this:

{nodeType: 1,nodeName: 'TAG',ns: 'x',tagName: 'tag',fullName: 'x:tag',attr: {'foo': 'bar'}parentNode: null,childNodes=[{nodeName: '#text',nodeType: 3,value: 'Text content',parentNode: {...},}]}

About

A reasonably fast, simple and pure-JS XML parser with no dependencies

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - borgar/simple-xml: A reasonably fast, simple and pure-JS XML parser with no dependencies · GitHub
Skip to content

Repository files navigation

Overly simplistic XML parser

This is an overly simplistic non-validating XML parser with utilities. It will indiscriminately parse most well-formed XML documents that don't try to do anything clever.

The purpose of this library to allow easy parsing and consuming XML files. Does the world really need it? No, probably not. But all the other available packages the author tested were either a massive overkill or failed to parse fairly simplistic XML correctly. So here we are.

There are some limitations:

  • Comments are discarded.
  • Processing instructions are discarded.
  • Namespace prefixes are preserved but otherwise ignored.
  • Doctypes are discarded.
  • Nested doctypes are not supported and will cause errors.
  • Nodes have a limited interface.
  • Made for a node.js environment with no browser build provided.

But on the upside:

  • Built in selector engine.
  • No dependencies.

Installing

The usual:

$ npm i @borgar/simple-xml

Parsing XML

import{parseXML}from'@borgar/simple-xml';constdom=parseXML('<root><node>Lorem ipsum</node></root>');console.log(dom.getElementsByTagName('node').textContent);

The parse function accepts two arguments, the first is an XML source. The second is an options object. There are two options:

Allow normally forbidden unquoted attributes with laxAttr:

parseXML('<root><node foo=bar /></root>',{laxAttr: true});

Allow normally forbidden "rootless" documents with emptyDoc:

parseXML('',{emptyDoc: true});

As well as a parse method, the package exports Node classes: Node, Element, Document, TextNode, and CDataNode. They are pretty much what you expect but with an incomplete or altered set of DOM API functions.

See the API documentation.

Nodes have the following methods and properties

Name & identity

  • .nodeName An uppercase tag name. (BAR in the case of <foo:bar>)

  • .tagName A case preserved tag (bar in the case of <foo:bar>)

  • .nodeType A node type number (e.g. Element.ELEMENT_NODE === 1)

  • .ns A namespace identifier (foo in the case of <foo:bar>)

  • .fullName A full tag name with identifier (foo:bar in the case of <foo:bar>)

Attributes

  • .getAttribute( attrName )
  • .setAttribute( attrName, attrValue )
  • .hasAttribute( attrName )
  • .removeAttribute( attrName )

Attributes are not stored as attribute nodes in a list, but rather they are a simple { name: value } style object on the node.

Tree & traversal

  • .appendChild( Node ) Inserts a new node as the last child of a parent. If a node already has a parent, it is removed from that parent when inserted in the target.

  • .children Emits an array of direct child nodes that are of type Element.

  • .parentNode A direct reference to the node's container.

  • .childNodes An array of all direct child nodes.

  • .textContent Emits the text content of the target's subtree.

    Text is preserved as-is in the tree but whitespace is cleaned (unless xml:space dictates otherwise) when using .textContent.

  • .getElementsByTagName( tagName ) Lists all Elements in the target's subtree, traversal order, that have .tagName equal to the argument. Function is case-sensitive.

  • .querySelectorAll( cssSelector ) Lists all Elements in the target's subtree, traversal order, that match the supplied CSS selector. Function should be case-sensitive but may be case insensitive for some.

  • .toJS() Returns the target node's subtree in a JsonML-like structure.

Roughly, if you supply this:

<x:tagfoo="bar">Text content</x:tag>

It will parse to a document which has a .root node looking roughly like this:

{nodeType: 1,nodeName: 'TAG',ns: 'x',tagName: 'tag',fullName: 'x:tag',attr: {'foo': 'bar'}parentNode: null,childNodes=[{nodeName: '#text',nodeType: 3,value: 'Text content',parentNode: {...},}]}

About

A reasonably fast, simple and pure-JS XML parser with no dependencies

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - borgar/simple-xml: A reasonably fast, simple and pure-JS XML parser with no dependencies · GitHub
Skip to content

Repository files navigation

Overly simplistic XML parser

This is an overly simplistic non-validating XML parser with utilities. It will indiscriminately parse most well-formed XML documents that don't try to do anything clever.

The purpose of this library to allow easy parsing and consuming XML files. Does the world really need it? No, probably not. But all the other available packages the author tested were either a massive overkill or failed to parse fairly simplistic XML correctly. So here we are.

There are some limitations:

  • Comments are discarded.
  • Processing instructions are discarded.
  • Namespace prefixes are preserved but otherwise ignored.
  • Doctypes are discarded.
  • Nested doctypes are not supported and will cause errors.
  • Nodes have a limited interface.
  • Made for a node.js environment with no browser build provided.

But on the upside:

  • Built in selector engine.
  • No dependencies.

Installing

The usual:

$ npm i @borgar/simple-xml

Parsing XML

import{parseXML}from'@borgar/simple-xml';constdom=parseXML('<root><node>Lorem ipsum</node></root>');console.log(dom.getElementsByTagName('node').textContent);

The parse function accepts two arguments, the first is an XML source. The second is an options object. There are two options:

Allow normally forbidden unquoted attributes with laxAttr:

parseXML('<root><node foo=bar /></root>',{laxAttr: true});

Allow normally forbidden "rootless" documents with emptyDoc:

parseXML('',{emptyDoc: true});

As well as a parse method, the package exports Node classes: Node, Element, Document, TextNode, and CDataNode. They are pretty much what you expect but with an incomplete or altered set of DOM API functions.

See the API documentation.

Nodes have the following methods and properties

Name & identity

  • .nodeName An uppercase tag name. (BAR in the case of <foo:bar>)

  • .tagName A case preserved tag (bar in the case of <foo:bar>)

  • .nodeType A node type number (e.g. Element.ELEMENT_NODE === 1)

  • .ns A namespace identifier (foo in the case of <foo:bar>)

  • .fullName A full tag name with identifier (foo:bar in the case of <foo:bar>)

Attributes

  • .getAttribute( attrName )
  • .setAttribute( attrName, attrValue )
  • .hasAttribute( attrName )
  • .removeAttribute( attrName )

Attributes are not stored as attribute nodes in a list, but rather they are a simple { name: value } style object on the node.

Tree & traversal

  • .appendChild( Node ) Inserts a new node as the last child of a parent. If a node already has a parent, it is removed from that parent when inserted in the target.

  • .children Emits an array of direct child nodes that are of type Element.

  • .parentNode A direct reference to the node's container.

  • .childNodes An array of all direct child nodes.

  • .textContent Emits the text content of the target's subtree.

    Text is preserved as-is in the tree but whitespace is cleaned (unless xml:space dictates otherwise) when using .textContent.

  • .getElementsByTagName( tagName ) Lists all Elements in the target's subtree, traversal order, that have .tagName equal to the argument. Function is case-sensitive.

  • .querySelectorAll( cssSelector ) Lists all Elements in the target's subtree, traversal order, that match the supplied CSS selector. Function should be case-sensitive but may be case insensitive for some.

  • .toJS() Returns the target node's subtree in a JsonML-like structure.

Roughly, if you supply this:

<x:tagfoo="bar">Text content</x:tag>

It will parse to a document which has a .root node looking roughly like this:

{nodeType: 1,nodeName: 'TAG',ns: 'x',tagName: 'tag',fullName: 'x:tag',attr: {'foo': 'bar'}parentNode: null,childNodes=[{nodeName: '#text',nodeType: 3,value: 'Text content',parentNode: {...},}]}

About

A reasonably fast, simple and pure-JS XML parser with no dependencies

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Repository files navigation

Overly simplistic XML parser

This is an overly simplistic non-validating XML parser with utilities. It will indiscriminately parse most well-formed XML documents that don't try to do anything clever.

The purpose of this library to allow easy parsing and consuming XML files. Does the world really need it? No, probably not. But all the other available packages the author tested were either a massive overkill or failed to parse fairly simplistic XML correctly. So here we are.

There are some limitations:

  • Comments are discarded.
  • Processing instructions are discarded.
  • Namespace prefixes are preserved but otherwise ignored.
  • Doctypes are discarded.
  • Nested doctypes are not supported and will cause errors.
  • Nodes have a limited interface.
  • Made for a node.js environment with no browser build provided.

But on the upside:

  • Built in selector engine.
  • No dependencies.

Installing

The usual:

$ npm i @borgar/simple-xml

Parsing XML

import{parseXML}from'@borgar/simple-xml';constdom=parseXML('<root><node>Lorem ipsum</node></root>');console.log(dom.getElementsByTagName('node').textContent);

The parse function accepts two arguments, the first is an XML source. The second is an options object. There are two options:

Allow normally forbidden unquoted attributes with laxAttr:

parseXML('<root><node foo=bar /></root>',{laxAttr: true});

Allow normally forbidden "rootless" documents with emptyDoc:

parseXML('',{emptyDoc: true});

As well as a parse method, the package exports Node classes: Node, Element, Document, TextNode, and CDataNode. They are pretty much what you expect but with an incomplete or altered set of DOM API functions.

See the API documentation.

Nodes have the following methods and properties

Name & identity

  • .nodeName An uppercase tag name. (BAR in the case of <foo:bar>)

  • .tagName A case preserved tag (bar in the case of <foo:bar>)

  • .nodeType A node type number (e.g. Element.ELEMENT_NODE === 1)

  • .ns A namespace identifier (foo in the case of <foo:bar>)

  • .fullName A full tag name with identifier (foo:bar in the case of <foo:bar>)

Attributes

  • .getAttribute( attrName )
  • .setAttribute( attrName, attrValue )
  • .hasAttribute( attrName )
  • .removeAttribute( attrName )

Attributes are not stored as attribute nodes in a list, but rather they are a simple { name: value } style object on the node.

Tree & traversal

  • .appendChild( Node ) Inserts a new node as the last child of a parent. If a node already has a parent, it is removed from that parent when inserted in the target.

  • .children Emits an array of direct child nodes that are of type Element.

  • .parentNode A direct reference to the node's container.

  • .childNodes An array of all direct child nodes.

  • .textContent Emits the text content of the target's subtree.

    Text is preserved as-is in the tree but whitespace is cleaned (unless xml:space dictates otherwise) when using .textContent.

  • .getElementsByTagName( tagName ) Lists all Elements in the target's subtree, traversal order, that have .tagName equal to the argument. Function is case-sensitive.

  • .querySelectorAll( cssSelector ) Lists all Elements in the target's subtree, traversal order, that match the supplied CSS selector. Function should be case-sensitive but may be case insensitive for some.

  • .toJS() Returns the target node's subtree in a JsonML-like structure.

Roughly, if you supply this:

<x:tagfoo="bar">Text content</x:tag>

It will parse to a document which has a .root node looking roughly like this:

{nodeType: 1,nodeName: 'TAG',ns: 'x',tagName: 'tag',fullName: 'x:tag',attr: {'foo': 'bar'}parentNode: null,childNodes=[{nodeName: '#text',nodeType: 3,value: 'Text content',parentNode: {...},}]}

About

A reasonably fast, simple and pure-JS XML parser with no dependencies

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages