Repository files navigation

eXtensible Tag Language (XTL)

A new way to write XML, but as a programming language!

TravisGitHub issuesnpmGitHub Release Date

Example

#define[key="mobile", true];
html {
// Include some CSS
head {
@external-css["style.scss"] {}
@google-font["Encode Sans Expanded"];
}
body {
p <Hello World>
// If we're mobile, display that we are. Otherwise display that we're desktop.
// Compile-time for testing.
#if[$mobile] {
h1 <Welcome to the Example Mobile site!>
} else {
h1 <Welcome to the Example Desktop site!>
}
p <This is an amazing site.>
^ [style="font-family: sans-serif"] <
Woah, this is multi-line!
>
// The below code will throw an error as there is no semicolon.
@js["code.js"];
img;
}
}

How It Works

It's quite simple: you write XTL code, run the compiler (optionally with a target runtime language) and use the generated code in your application or website.

XTL is not just another alternative XML language, however. A common annoyance with writing XML is that there is no actual programming - you cannot create variables, use conditionals or loops, or use maths. That is where XTL aims to help.

XTL has tags called 'actions' that can run code depending on arguments. These then output new XML that is displayed on the page. Actions can be run either during compile time or on the client.

Targets

  • Compiler has not been created yet (only parser) so there are not any targets.

Future Targets

  • Plain XML (no runtime)
  • HTML and JavaScript
  • XAML and C#.net (WPF)
  • XAML and VB.net (WPF)
  • AXML and Java (Android)

If you can think of any other XML-based targets, please create an issue.

Custom Action API

Note: No API has been created yet, this is just an idea of what it will be.

Custom actions are created using NodeJS. Actions are supported in every language, but you will need to create an individual file for each language (other than JavaScript).

constxtl=require("xtl-lang");

Create an action

Use the xtl.registerAction(string actionName, object options) method to create a new action.

  • actionName: The tag name that the action will use. Must be a valid tag name.
  • options
    • object targets: JS target will be used for
      • string cs: The path to the action's C# equivalent. If not specified, no c# code will be generated.
      • string vb: The path to the action's VB equivalent. If not specified, no VB code will be generated.
      • string js: The path to the action's JS equivalent. If not specified, no JS code will be generated.
      • string jar: The path to the action's Java equivalent. If not specified, no Java code will be generated.

Target method format: xtl.tag[] method({string: object} args, xtl.tag[] children)

Action Examples:

C#
//! BEGIN IMPORTSusing ...;//! BEGIN DELEGATEdelegate(Tagtag,Dictionary<string,object>args,Tag[]children){if(args.ContainsKey("foo")){returnchildren;}else{returnnewTag[0];}};
Visual Basic
'! BEGIN IMPORTSImports...'! BEGIN DELEGATEFunction(ByValtagAsTag,ByValargsAsDictionary(OfString,Object),ByValchildrenAsTag())Ifargs.ContainsKey("foo")ThenReturnchildrenElseReturnNewTag(){}EndIfEndFunction
JavaScript
function(tag,args,children){if(typeofargs.foo!=="undefined"){returnchildren;}else{return[];}}
Java
//! BEGIN IMPORTSimport ...;
//! BEGIN DELEGATE
(tag, args, children) -> {
if (args.containsKey("foo")) {
returnchildren;
} else {
returnnewTag[0];
}
}

The API

The API is the same for everything. However, names will follow that language's conventions so it is recommended to either follow them yourself or use autocomplete. Styles below are for C# and VB. Builtin class names may be different.

Xtl.Tag

The tag class. Stores information about a tag, including its name, args and children.

Fields:
  • string Name: The tag's name.
  • Dictionary<string, object> Attributes: Tag attributes. Value may be a string, number, boolean or Xtl.Tag.
  • Xtl.Tag[] Children: The tag's children tags.
  • Dictionary<string, object> CustomProperties: Custom properties.
  • Xlt.TagMeta Meta: Meta information.
Constructors
  • Xtl.Tag(string name): Create an empty tag
  • Xtl.Tag(string name, Dictionary<string, object> attributes): Create an empty tag with attributes
  • Xtl.Tag(string name, Xtl.Tag[] children): Create a tag with specified children.
  • Xtl.Tag(string name, Dictionary<string, object> attributes, Xtl.Tag[] children): Create a tag with children and attributes.

Xlt.TagMeta

Instances of this class contain meta information about a tag.

Fields:
  • Tag PreviousTag: The previous tag.
  • Tag NextTag: The next tag.
  • Tag[] Tags: A list of every tag.
  • int TagIndex: The index of this tag in the Tags array.
Methods:
  • void DefineTempConstantAction(Tag tag): Defines a new action.

License

FOSSA Status

About

eXtensible Tag Language

Topics

Resources

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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

eXtensible Tag Language (XTL)

A new way to write XML, but as a programming language!

TravisGitHub issuesnpmGitHub Release Date

Example

#define[key="mobile", true];
html {
// Include some CSS
head {
@external-css["style.scss"] {}
@google-font["Encode Sans Expanded"];
}
body {
p <Hello World>
// If we're mobile, display that we are. Otherwise display that we're desktop.
// Compile-time for testing.
#if[$mobile] {
h1 <Welcome to the Example Mobile site!>
} else {
h1 <Welcome to the Example Desktop site!>
}
p <This is an amazing site.>
^ [style="font-family: sans-serif"] <
Woah, this is multi-line!
>
// The below code will throw an error as there is no semicolon.
@js["code.js"];
img;
}
}

How It Works

It's quite simple: you write XTL code, run the compiler (optionally with a target runtime language) and use the generated code in your application or website.

XTL is not just another alternative XML language, however. A common annoyance with writing XML is that there is no actual programming - you cannot create variables, use conditionals or loops, or use maths. That is where XTL aims to help.

XTL has tags called 'actions' that can run code depending on arguments. These then output new XML that is displayed on the page. Actions can be run either during compile time or on the client.

Targets

  • Compiler has not been created yet (only parser) so there are not any targets.

Future Targets

  • Plain XML (no runtime)
  • HTML and JavaScript
  • XAML and C#.net (WPF)
  • XAML and VB.net (WPF)
  • AXML and Java (Android)

If you can think of any other XML-based targets, please create an issue.

Custom Action API

Note: No API has been created yet, this is just an idea of what it will be.

Custom actions are created using NodeJS. Actions are supported in every language, but you will need to create an individual file for each language (other than JavaScript).

constxtl=require("xtl-lang");

Create an action

Use the xtl.registerAction(string actionName, object options) method to create a new action.

  • actionName: The tag name that the action will use. Must be a valid tag name.
  • options
    • object targets: JS target will be used for
      • string cs: The path to the action's C# equivalent. If not specified, no c# code will be generated.
      • string vb: The path to the action's VB equivalent. If not specified, no VB code will be generated.
      • string js: The path to the action's JS equivalent. If not specified, no JS code will be generated.
      • string jar: The path to the action's Java equivalent. If not specified, no Java code will be generated.

Target method format: xtl.tag[] method({string: object} args, xtl.tag[] children)

Action Examples:

C#
//! BEGIN IMPORTSusing ...;//! BEGIN DELEGATEdelegate(Tagtag,Dictionary<string,object>args,Tag[]children){if(args.ContainsKey("foo")){returnchildren;}else{returnnewTag[0];}};
Visual Basic
'! BEGIN IMPORTSImports...'! BEGIN DELEGATEFunction(ByValtagAsTag,ByValargsAsDictionary(OfString,Object),ByValchildrenAsTag())Ifargs.ContainsKey("foo")ThenReturnchildrenElseReturnNewTag(){}EndIfEndFunction
JavaScript
function(tag,args,children){if(typeofargs.foo!=="undefined"){returnchildren;}else{return[];}}
Java
//! BEGIN IMPORTSimport ...;
//! BEGIN DELEGATE
(tag, args, children) -> {
if (args.containsKey("foo")) {
returnchildren;
} else {
returnnewTag[0];
}
}

The API

The API is the same for everything. However, names will follow that language's conventions so it is recommended to either follow them yourself or use autocomplete. Styles below are for C# and VB. Builtin class names may be different.

Xtl.Tag

The tag class. Stores information about a tag, including its name, args and children.

Fields:
  • string Name: The tag's name.
  • Dictionary<string, object> Attributes: Tag attributes. Value may be a string, number, boolean or Xtl.Tag.
  • Xtl.Tag[] Children: The tag's children tags.
  • Dictionary<string, object> CustomProperties: Custom properties.
  • Xlt.TagMeta Meta: Meta information.
Constructors
  • Xtl.Tag(string name): Create an empty tag
  • Xtl.Tag(string name, Dictionary<string, object> attributes): Create an empty tag with attributes
  • Xtl.Tag(string name, Xtl.Tag[] children): Create a tag with specified children.
  • Xtl.Tag(string name, Dictionary<string, object> attributes, Xtl.Tag[] children): Create a tag with children and attributes.

Xlt.TagMeta

Instances of this class contain meta information about a tag.

Fields:
  • Tag PreviousTag: The previous tag.
  • Tag NextTag: The next tag.
  • Tag[] Tags: A list of every tag.
  • int TagIndex: The index of this tag in the Tags array.
Methods:
  • void DefineTempConstantAction(Tag tag): Defines a new action.

License

FOSSA Status

About

eXtensible Tag Language

Topics

Resources

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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

eXtensible Tag Language (XTL)

A new way to write XML, but as a programming language!

TravisGitHub issuesnpmGitHub Release Date

Example

#define[key="mobile", true];
html {
// Include some CSS
head {
@external-css["style.scss"] {}
@google-font["Encode Sans Expanded"];
}
body {
p <Hello World>
// If we're mobile, display that we are. Otherwise display that we're desktop.
// Compile-time for testing.
#if[$mobile] {
h1 <Welcome to the Example Mobile site!>
} else {
h1 <Welcome to the Example Desktop site!>
}
p <This is an amazing site.>
^ [style="font-family: sans-serif"] <
Woah, this is multi-line!
>
// The below code will throw an error as there is no semicolon.
@js["code.js"];
img;
}
}

How It Works

It's quite simple: you write XTL code, run the compiler (optionally with a target runtime language) and use the generated code in your application or website.

XTL is not just another alternative XML language, however. A common annoyance with writing XML is that there is no actual programming - you cannot create variables, use conditionals or loops, or use maths. That is where XTL aims to help.

XTL has tags called 'actions' that can run code depending on arguments. These then output new XML that is displayed on the page. Actions can be run either during compile time or on the client.

Targets

  • Compiler has not been created yet (only parser) so there are not any targets.

Future Targets

  • Plain XML (no runtime)
  • HTML and JavaScript
  • XAML and C#.net (WPF)
  • XAML and VB.net (WPF)
  • AXML and Java (Android)

If you can think of any other XML-based targets, please create an issue.

Custom Action API

Note: No API has been created yet, this is just an idea of what it will be.

Custom actions are created using NodeJS. Actions are supported in every language, but you will need to create an individual file for each language (other than JavaScript).

constxtl=require("xtl-lang");

Create an action

Use the xtl.registerAction(string actionName, object options) method to create a new action.

  • actionName: The tag name that the action will use. Must be a valid tag name.
  • options
    • object targets: JS target will be used for
      • string cs: The path to the action's C# equivalent. If not specified, no c# code will be generated.
      • string vb: The path to the action's VB equivalent. If not specified, no VB code will be generated.
      • string js: The path to the action's JS equivalent. If not specified, no JS code will be generated.
      • string jar: The path to the action's Java equivalent. If not specified, no Java code will be generated.

Target method format: xtl.tag[] method({string: object} args, xtl.tag[] children)

Action Examples:

C#
//! BEGIN IMPORTSusing ...;//! BEGIN DELEGATEdelegate(Tagtag,Dictionary<string,object>args,Tag[]children){if(args.ContainsKey("foo")){returnchildren;}else{returnnewTag[0];}};
Visual Basic
'! BEGIN IMPORTSImports...'! BEGIN DELEGATEFunction(ByValtagAsTag,ByValargsAsDictionary(OfString,Object),ByValchildrenAsTag())Ifargs.ContainsKey("foo")ThenReturnchildrenElseReturnNewTag(){}EndIfEndFunction
JavaScript
function(tag,args,children){if(typeofargs.foo!=="undefined"){returnchildren;}else{return[];}}
Java
//! BEGIN IMPORTSimport ...;
//! BEGIN DELEGATE
(tag, args, children) -> {
if (args.containsKey("foo")) {
returnchildren;
} else {
returnnewTag[0];
}
}

The API

The API is the same for everything. However, names will follow that language's conventions so it is recommended to either follow them yourself or use autocomplete. Styles below are for C# and VB. Builtin class names may be different.

Xtl.Tag

The tag class. Stores information about a tag, including its name, args and children.

Fields:
  • string Name: The tag's name.
  • Dictionary<string, object> Attributes: Tag attributes. Value may be a string, number, boolean or Xtl.Tag.
  • Xtl.Tag[] Children: The tag's children tags.
  • Dictionary<string, object> CustomProperties: Custom properties.
  • Xlt.TagMeta Meta: Meta information.
Constructors
  • Xtl.Tag(string name): Create an empty tag
  • Xtl.Tag(string name, Dictionary<string, object> attributes): Create an empty tag with attributes
  • Xtl.Tag(string name, Xtl.Tag[] children): Create a tag with specified children.
  • Xtl.Tag(string name, Dictionary<string, object> attributes, Xtl.Tag[] children): Create a tag with children and attributes.

Xlt.TagMeta

Instances of this class contain meta information about a tag.

Fields:
  • Tag PreviousTag: The previous tag.
  • Tag NextTag: The next tag.
  • Tag[] Tags: A list of every tag.
  • int TagIndex: The index of this tag in the Tags array.
Methods:
  • void DefineTempConstantAction(Tag tag): Defines a new action.

License

FOSSA Status

About

eXtensible Tag Language

Topics

Resources

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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

eXtensible Tag Language (XTL)

A new way to write XML, but as a programming language!

TravisGitHub issuesnpmGitHub Release Date

Example

#define[key="mobile", true];
html {
// Include some CSS
head {
@external-css["style.scss"] {}
@google-font["Encode Sans Expanded"];
}
body {
p <Hello World>
// If we're mobile, display that we are. Otherwise display that we're desktop.
// Compile-time for testing.
#if[$mobile] {
h1 <Welcome to the Example Mobile site!>
} else {
h1 <Welcome to the Example Desktop site!>
}
p <This is an amazing site.>
^ [style="font-family: sans-serif"] <
Woah, this is multi-line!
>
// The below code will throw an error as there is no semicolon.
@js["code.js"];
img;
}
}

How It Works

It's quite simple: you write XTL code, run the compiler (optionally with a target runtime language) and use the generated code in your application or website.

XTL is not just another alternative XML language, however. A common annoyance with writing XML is that there is no actual programming - you cannot create variables, use conditionals or loops, or use maths. That is where XTL aims to help.

XTL has tags called 'actions' that can run code depending on arguments. These then output new XML that is displayed on the page. Actions can be run either during compile time or on the client.

Targets

  • Compiler has not been created yet (only parser) so there are not any targets.

Future Targets

  • Plain XML (no runtime)
  • HTML and JavaScript
  • XAML and C#.net (WPF)
  • XAML and VB.net (WPF)
  • AXML and Java (Android)

If you can think of any other XML-based targets, please create an issue.

Custom Action API

Note: No API has been created yet, this is just an idea of what it will be.

Custom actions are created using NodeJS. Actions are supported in every language, but you will need to create an individual file for each language (other than JavaScript).

constxtl=require("xtl-lang");

Create an action

Use the xtl.registerAction(string actionName, object options) method to create a new action.

  • actionName: The tag name that the action will use. Must be a valid tag name.
  • options
    • object targets: JS target will be used for
      • string cs: The path to the action's C# equivalent. If not specified, no c# code will be generated.
      • string vb: The path to the action's VB equivalent. If not specified, no VB code will be generated.
      • string js: The path to the action's JS equivalent. If not specified, no JS code will be generated.
      • string jar: The path to the action's Java equivalent. If not specified, no Java code will be generated.

Target method format: xtl.tag[] method({string: object} args, xtl.tag[] children)

Action Examples:

C#
//! BEGIN IMPORTSusing ...;//! BEGIN DELEGATEdelegate(Tagtag,Dictionary<string,object>args,Tag[]children){if(args.ContainsKey("foo")){returnchildren;}else{returnnewTag[0];}};
Visual Basic
'! BEGIN IMPORTSImports...'! BEGIN DELEGATEFunction(ByValtagAsTag,ByValargsAsDictionary(OfString,Object),ByValchildrenAsTag())Ifargs.ContainsKey("foo")ThenReturnchildrenElseReturnNewTag(){}EndIfEndFunction
JavaScript
function(tag,args,children){if(typeofargs.foo!=="undefined"){returnchildren;}else{return[];}}
Java
//! BEGIN IMPORTSimport ...;
//! BEGIN DELEGATE
(tag, args, children) -> {
if (args.containsKey("foo")) {
returnchildren;
} else {
returnnewTag[0];
}
}

The API

The API is the same for everything. However, names will follow that language's conventions so it is recommended to either follow them yourself or use autocomplete. Styles below are for C# and VB. Builtin class names may be different.

Xtl.Tag

The tag class. Stores information about a tag, including its name, args and children.

Fields:
  • string Name: The tag's name.
  • Dictionary<string, object> Attributes: Tag attributes. Value may be a string, number, boolean or Xtl.Tag.
  • Xtl.Tag[] Children: The tag's children tags.
  • Dictionary<string, object> CustomProperties: Custom properties.
  • Xlt.TagMeta Meta: Meta information.
Constructors
  • Xtl.Tag(string name): Create an empty tag
  • Xtl.Tag(string name, Dictionary<string, object> attributes): Create an empty tag with attributes
  • Xtl.Tag(string name, Xtl.Tag[] children): Create a tag with specified children.
  • Xtl.Tag(string name, Dictionary<string, object> attributes, Xtl.Tag[] children): Create a tag with children and attributes.

Xlt.TagMeta

Instances of this class contain meta information about a tag.

Fields:
  • Tag PreviousTag: The previous tag.
  • Tag NextTag: The next tag.
  • Tag[] Tags: A list of every tag.
  • int TagIndex: The index of this tag in the Tags array.
Methods:
  • void DefineTempConstantAction(Tag tag): Defines a new action.

License

FOSSA Status

About

eXtensible Tag Language

Topics

Resources

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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

eXtensible Tag Language (XTL)

A new way to write XML, but as a programming language!

TravisGitHub issuesnpmGitHub Release Date

Example

#define[key="mobile", true];
html {
// Include some CSS
head {
@external-css["style.scss"] {}
@google-font["Encode Sans Expanded"];
}
body {
p <Hello World>
// If we're mobile, display that we are. Otherwise display that we're desktop.
// Compile-time for testing.
#if[$mobile] {
h1 <Welcome to the Example Mobile site!>
} else {
h1 <Welcome to the Example Desktop site!>
}
p <This is an amazing site.>
^ [style="font-family: sans-serif"] <
Woah, this is multi-line!
>
// The below code will throw an error as there is no semicolon.
@js["code.js"];
img;
}
}

How It Works

It's quite simple: you write XTL code, run the compiler (optionally with a target runtime language) and use the generated code in your application or website.

XTL is not just another alternative XML language, however. A common annoyance with writing XML is that there is no actual programming - you cannot create variables, use conditionals or loops, or use maths. That is where XTL aims to help.

XTL has tags called 'actions' that can run code depending on arguments. These then output new XML that is displayed on the page. Actions can be run either during compile time or on the client.

Targets

  • Compiler has not been created yet (only parser) so there are not any targets.

Future Targets

  • Plain XML (no runtime)
  • HTML and JavaScript
  • XAML and C#.net (WPF)
  • XAML and VB.net (WPF)
  • AXML and Java (Android)

If you can think of any other XML-based targets, please create an issue.

Custom Action API

Note: No API has been created yet, this is just an idea of what it will be.

Custom actions are created using NodeJS. Actions are supported in every language, but you will need to create an individual file for each language (other than JavaScript).

constxtl=require("xtl-lang");

Create an action

Use the xtl.registerAction(string actionName, object options) method to create a new action.

  • actionName: The tag name that the action will use. Must be a valid tag name.
  • options
    • object targets: JS target will be used for
      • string cs: The path to the action's C# equivalent. If not specified, no c# code will be generated.
      • string vb: The path to the action's VB equivalent. If not specified, no VB code will be generated.
      • string js: The path to the action's JS equivalent. If not specified, no JS code will be generated.
      • string jar: The path to the action's Java equivalent. If not specified, no Java code will be generated.

Target method format: xtl.tag[] method({string: object} args, xtl.tag[] children)

Action Examples:

C#
//! BEGIN IMPORTSusing ...;//! BEGIN DELEGATEdelegate(Tagtag,Dictionary<string,object>args,Tag[]children){if(args.ContainsKey("foo")){returnchildren;}else{returnnewTag[0];}};
Visual Basic
'! BEGIN IMPORTSImports...'! BEGIN DELEGATEFunction(ByValtagAsTag,ByValargsAsDictionary(OfString,Object),ByValchildrenAsTag())Ifargs.ContainsKey("foo")ThenReturnchildrenElseReturnNewTag(){}EndIfEndFunction
JavaScript
function(tag,args,children){if(typeofargs.foo!=="undefined"){returnchildren;}else{return[];}}
Java
//! BEGIN IMPORTSimport ...;
//! BEGIN DELEGATE
(tag, args, children) -> {
if (args.containsKey("foo")) {
returnchildren;
} else {
returnnewTag[0];
}
}

The API

The API is the same for everything. However, names will follow that language's conventions so it is recommended to either follow them yourself or use autocomplete. Styles below are for C# and VB. Builtin class names may be different.

Xtl.Tag

The tag class. Stores information about a tag, including its name, args and children.

Fields:
  • string Name: The tag's name.
  • Dictionary<string, object> Attributes: Tag attributes. Value may be a string, number, boolean or Xtl.Tag.
  • Xtl.Tag[] Children: The tag's children tags.
  • Dictionary<string, object> CustomProperties: Custom properties.
  • Xlt.TagMeta Meta: Meta information.
Constructors
  • Xtl.Tag(string name): Create an empty tag
  • Xtl.Tag(string name, Dictionary<string, object> attributes): Create an empty tag with attributes
  • Xtl.Tag(string name, Xtl.Tag[] children): Create a tag with specified children.
  • Xtl.Tag(string name, Dictionary<string, object> attributes, Xtl.Tag[] children): Create a tag with children and attributes.

Xlt.TagMeta

Instances of this class contain meta information about a tag.

Fields:
  • Tag PreviousTag: The previous tag.
  • Tag NextTag: The next tag.
  • Tag[] Tags: A list of every tag.
  • int TagIndex: The index of this tag in the Tags array.
Methods:
  • void DefineTempConstantAction(Tag tag): Defines a new action.

License

FOSSA Status

About

eXtensible Tag Language

Topics

Resources

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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

eXtensible Tag Language (XTL)

A new way to write XML, but as a programming language!

TravisGitHub issuesnpmGitHub Release Date

Example

#define[key="mobile", true];
html {
// Include some CSS
head {
@external-css["style.scss"] {}
@google-font["Encode Sans Expanded"];
}
body {
p <Hello World>
// If we're mobile, display that we are. Otherwise display that we're desktop.
// Compile-time for testing.
#if[$mobile] {
h1 <Welcome to the Example Mobile site!>
} else {
h1 <Welcome to the Example Desktop site!>
}
p <This is an amazing site.>
^ [style="font-family: sans-serif"] <
Woah, this is multi-line!
>
// The below code will throw an error as there is no semicolon.
@js["code.js"];
img;
}
}

How It Works

It's quite simple: you write XTL code, run the compiler (optionally with a target runtime language) and use the generated code in your application or website.

XTL is not just another alternative XML language, however. A common annoyance with writing XML is that there is no actual programming - you cannot create variables, use conditionals or loops, or use maths. That is where XTL aims to help.

XTL has tags called 'actions' that can run code depending on arguments. These then output new XML that is displayed on the page. Actions can be run either during compile time or on the client.

Targets

  • Compiler has not been created yet (only parser) so there are not any targets.

Future Targets

  • Plain XML (no runtime)
  • HTML and JavaScript
  • XAML and C#.net (WPF)
  • XAML and VB.net (WPF)
  • AXML and Java (Android)

If you can think of any other XML-based targets, please create an issue.

Custom Action API

Note: No API has been created yet, this is just an idea of what it will be.

Custom actions are created using NodeJS. Actions are supported in every language, but you will need to create an individual file for each language (other than JavaScript).

constxtl=require("xtl-lang");

Create an action

Use the xtl.registerAction(string actionName, object options) method to create a new action.

  • actionName: The tag name that the action will use. Must be a valid tag name.
  • options
    • object targets: JS target will be used for
      • string cs: The path to the action's C# equivalent. If not specified, no c# code will be generated.
      • string vb: The path to the action's VB equivalent. If not specified, no VB code will be generated.
      • string js: The path to the action's JS equivalent. If not specified, no JS code will be generated.
      • string jar: The path to the action's Java equivalent. If not specified, no Java code will be generated.

Target method format: xtl.tag[] method({string: object} args, xtl.tag[] children)

Action Examples:

C#
//! BEGIN IMPORTSusing ...;//! BEGIN DELEGATEdelegate(Tagtag,Dictionary<string,object>args,Tag[]children){if(args.ContainsKey("foo")){returnchildren;}else{returnnewTag[0];}};
Visual Basic
'! BEGIN IMPORTSImports...'! BEGIN DELEGATEFunction(ByValtagAsTag,ByValargsAsDictionary(OfString,Object),ByValchildrenAsTag())Ifargs.ContainsKey("foo")ThenReturnchildrenElseReturnNewTag(){}EndIfEndFunction
JavaScript
function(tag,args,children){if(typeofargs.foo!=="undefined"){returnchildren;}else{return[];}}
Java
//! BEGIN IMPORTSimport ...;
//! BEGIN DELEGATE
(tag, args, children) -> {
if (args.containsKey("foo")) {
returnchildren;
} else {
returnnewTag[0];
}
}

The API

The API is the same for everything. However, names will follow that language's conventions so it is recommended to either follow them yourself or use autocomplete. Styles below are for C# and VB. Builtin class names may be different.

Xtl.Tag

The tag class. Stores information about a tag, including its name, args and children.

Fields:
  • string Name: The tag's name.
  • Dictionary<string, object> Attributes: Tag attributes. Value may be a string, number, boolean or Xtl.Tag.
  • Xtl.Tag[] Children: The tag's children tags.
  • Dictionary<string, object> CustomProperties: Custom properties.
  • Xlt.TagMeta Meta: Meta information.
Constructors
  • Xtl.Tag(string name): Create an empty tag
  • Xtl.Tag(string name, Dictionary<string, object> attributes): Create an empty tag with attributes
  • Xtl.Tag(string name, Xtl.Tag[] children): Create a tag with specified children.
  • Xtl.Tag(string name, Dictionary<string, object> attributes, Xtl.Tag[] children): Create a tag with children and attributes.

Xlt.TagMeta

Instances of this class contain meta information about a tag.

Fields:
  • Tag PreviousTag: The previous tag.
  • Tag NextTag: The next tag.
  • Tag[] Tags: A list of every tag.
  • int TagIndex: The index of this tag in the Tags array.
Methods:
  • void DefineTempConstantAction(Tag tag): Defines a new action.

License

FOSSA Status

About

eXtensible Tag Language

Topics

Resources

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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

eXtensible Tag Language (XTL)

A new way to write XML, but as a programming language!

TravisGitHub issuesnpmGitHub Release Date

Example

#define[key="mobile", true];
html {
// Include some CSS
head {
@external-css["style.scss"] {}
@google-font["Encode Sans Expanded"];
}
body {
p <Hello World>
// If we're mobile, display that we are. Otherwise display that we're desktop.
// Compile-time for testing.
#if[$mobile] {
h1 <Welcome to the Example Mobile site!>
} else {
h1 <Welcome to the Example Desktop site!>
}
p <This is an amazing site.>
^ [style="font-family: sans-serif"] <
Woah, this is multi-line!
>
// The below code will throw an error as there is no semicolon.
@js["code.js"];
img;
}
}

How It Works

It's quite simple: you write XTL code, run the compiler (optionally with a target runtime language) and use the generated code in your application or website.

XTL is not just another alternative XML language, however. A common annoyance with writing XML is that there is no actual programming - you cannot create variables, use conditionals or loops, or use maths. That is where XTL aims to help.

XTL has tags called 'actions' that can run code depending on arguments. These then output new XML that is displayed on the page. Actions can be run either during compile time or on the client.

Targets

  • Compiler has not been created yet (only parser) so there are not any targets.

Future Targets

  • Plain XML (no runtime)
  • HTML and JavaScript
  • XAML and C#.net (WPF)
  • XAML and VB.net (WPF)
  • AXML and Java (Android)

If you can think of any other XML-based targets, please create an issue.

Custom Action API

Note: No API has been created yet, this is just an idea of what it will be.

Custom actions are created using NodeJS. Actions are supported in every language, but you will need to create an individual file for each language (other than JavaScript).

constxtl=require("xtl-lang");

Create an action

Use the xtl.registerAction(string actionName, object options) method to create a new action.

  • actionName: The tag name that the action will use. Must be a valid tag name.
  • options
    • object targets: JS target will be used for
      • string cs: The path to the action's C# equivalent. If not specified, no c# code will be generated.
      • string vb: The path to the action's VB equivalent. If not specified, no VB code will be generated.
      • string js: The path to the action's JS equivalent. If not specified, no JS code will be generated.
      • string jar: The path to the action's Java equivalent. If not specified, no Java code will be generated.

Target method format: xtl.tag[] method({string: object} args, xtl.tag[] children)

Action Examples:

C#
//! BEGIN IMPORTSusing ...;//! BEGIN DELEGATEdelegate(Tagtag,Dictionary<string,object>args,Tag[]children){if(args.ContainsKey("foo")){returnchildren;}else{returnnewTag[0];}};
Visual Basic
'! BEGIN IMPORTSImports...'! BEGIN DELEGATEFunction(ByValtagAsTag,ByValargsAsDictionary(OfString,Object),ByValchildrenAsTag())Ifargs.ContainsKey("foo")ThenReturnchildrenElseReturnNewTag(){}EndIfEndFunction
JavaScript
function(tag,args,children){if(typeofargs.foo!=="undefined"){returnchildren;}else{return[];}}
Java
//! BEGIN IMPORTSimport ...;
//! BEGIN DELEGATE
(tag, args, children) -> {
if (args.containsKey("foo")) {
returnchildren;
} else {
returnnewTag[0];
}
}

The API

The API is the same for everything. However, names will follow that language's conventions so it is recommended to either follow them yourself or use autocomplete. Styles below are for C# and VB. Builtin class names may be different.

Xtl.Tag

The tag class. Stores information about a tag, including its name, args and children.

Fields:
  • string Name: The tag's name.
  • Dictionary<string, object> Attributes: Tag attributes. Value may be a string, number, boolean or Xtl.Tag.
  • Xtl.Tag[] Children: The tag's children tags.
  • Dictionary<string, object> CustomProperties: Custom properties.
  • Xlt.TagMeta Meta: Meta information.
Constructors
  • Xtl.Tag(string name): Create an empty tag
  • Xtl.Tag(string name, Dictionary<string, object> attributes): Create an empty tag with attributes
  • Xtl.Tag(string name, Xtl.Tag[] children): Create a tag with specified children.
  • Xtl.Tag(string name, Dictionary<string, object> attributes, Xtl.Tag[] children): Create a tag with children and attributes.

Xlt.TagMeta

Instances of this class contain meta information about a tag.

Fields:
  • Tag PreviousTag: The previous tag.
  • Tag NextTag: The next tag.
  • Tag[] Tags: A list of every tag.
  • int TagIndex: The index of this tag in the Tags array.
Methods:
  • void DefineTempConstantAction(Tag tag): Defines a new action.

License

FOSSA Status

About

eXtensible Tag Language

Topics

Resources

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

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

eXtensible Tag Language (XTL)

A new way to write XML, but as a programming language!

TravisGitHub issuesnpmGitHub Release Date

Example

#define[key="mobile", true];
html {
// Include some CSS
head {
@external-css["style.scss"] {}
@google-font["Encode Sans Expanded"];
}
body {
p <Hello World>
// If we're mobile, display that we are. Otherwise display that we're desktop.
// Compile-time for testing.
#if[$mobile] {
h1 <Welcome to the Example Mobile site!>
} else {
h1 <Welcome to the Example Desktop site!>
}
p <This is an amazing site.>
^ [style="font-family: sans-serif"] <
Woah, this is multi-line!
>
// The below code will throw an error as there is no semicolon.
@js["code.js"];
img;
}
}

How It Works

It's quite simple: you write XTL code, run the compiler (optionally with a target runtime language) and use the generated code in your application or website.

XTL is not just another alternative XML language, however. A common annoyance with writing XML is that there is no actual programming - you cannot create variables, use conditionals or loops, or use maths. That is where XTL aims to help.

XTL has tags called 'actions' that can run code depending on arguments. These then output new XML that is displayed on the page. Actions can be run either during compile time or on the client.

Targets

  • Compiler has not been created yet (only parser) so there are not any targets.

Future Targets

  • Plain XML (no runtime)
  • HTML and JavaScript
  • XAML and C#.net (WPF)
  • XAML and VB.net (WPF)
  • AXML and Java (Android)

If you can think of any other XML-based targets, please create an issue.

Custom Action API

Note: No API has been created yet, this is just an idea of what it will be.

Custom actions are created using NodeJS. Actions are supported in every language, but you will need to create an individual file for each language (other than JavaScript).

constxtl=require("xtl-lang");

Create an action

Use the xtl.registerAction(string actionName, object options) method to create a new action.

  • actionName: The tag name that the action will use. Must be a valid tag name.
  • options
    • object targets: JS target will be used for
      • string cs: The path to the action's C# equivalent. If not specified, no c# code will be generated.
      • string vb: The path to the action's VB equivalent. If not specified, no VB code will be generated.
      • string js: The path to the action's JS equivalent. If not specified, no JS code will be generated.
      • string jar: The path to the action's Java equivalent. If not specified, no Java code will be generated.

Target method format: xtl.tag[] method({string: object} args, xtl.tag[] children)

Action Examples:

C#
//! BEGIN IMPORTSusing ...;//! BEGIN DELEGATEdelegate(Tagtag,Dictionary<string,object>args,Tag[]children){if(args.ContainsKey("foo")){returnchildren;}else{returnnewTag[0];}};
Visual Basic
'! BEGIN IMPORTSImports...'! BEGIN DELEGATEFunction(ByValtagAsTag,ByValargsAsDictionary(OfString,Object),ByValchildrenAsTag())Ifargs.ContainsKey("foo")ThenReturnchildrenElseReturnNewTag(){}EndIfEndFunction
JavaScript
function(tag,args,children){if(typeofargs.foo!=="undefined"){returnchildren;}else{return[];}}
Java
//! BEGIN IMPORTSimport ...;
//! BEGIN DELEGATE
(tag, args, children) -> {
if (args.containsKey("foo")) {
returnchildren;
} else {
returnnewTag[0];
}
}

The API

The API is the same for everything. However, names will follow that language's conventions so it is recommended to either follow them yourself or use autocomplete. Styles below are for C# and VB. Builtin class names may be different.

Xtl.Tag

The tag class. Stores information about a tag, including its name, args and children.

Fields:
  • string Name: The tag's name.
  • Dictionary<string, object> Attributes: Tag attributes. Value may be a string, number, boolean or Xtl.Tag.
  • Xtl.Tag[] Children: The tag's children tags.
  • Dictionary<string, object> CustomProperties: Custom properties.
  • Xlt.TagMeta Meta: Meta information.
Constructors
  • Xtl.Tag(string name): Create an empty tag
  • Xtl.Tag(string name, Dictionary<string, object> attributes): Create an empty tag with attributes
  • Xtl.Tag(string name, Xtl.Tag[] children): Create a tag with specified children.
  • Xtl.Tag(string name, Dictionary<string, object> attributes, Xtl.Tag[] children): Create a tag with children and attributes.

Xlt.TagMeta

Instances of this class contain meta information about a tag.

Fields:
  • Tag PreviousTag: The previous tag.
  • Tag NextTag: The next tag.
  • Tag[] Tags: A list of every tag.
  • int TagIndex: The index of this tag in the Tags array.
Methods:
  • void DefineTempConstantAction(Tag tag): Defines a new action.

License

FOSSA Status

About

eXtensible Tag Language

Topics

Resources

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages