This repository was archived by the owner on Dec 30, 2022. It is now read-only.
/idomizerPublic archive

Repository files navigation

idomizer

Continous Integration

idomizer is an HTML template compiler providing an incremental-dom render factory. idomizer can be used at compile time (front end projects) or runtime time(back end projects).

Versions and compatibilities:

  • idomizer <= 0.5 -> incremental-dom 0.4 and below.
  • idomizer >= 0.6 -> incremental-dom 0.5 and above.
  • idomizer >= 1.0.0 -> incremental-dom 0.6 and above.

Installation

$ npm install idomizer
<scriptsrc="https://ajax.googleapis.com/ajax/libs/incrementaldom/0.6.0/incremental-dom-min.js"></script><scriptsrc="https://unpkg.com/idomizer/dist/idomizer.min.js"></script><script>varfactory=idomizer.compile('<h1>Hello!</h1>');varrender=factory(IncrementalDOM);IncrementalDOM.patch(document.body,render);</script>

Babel

A babel's plugin is available to compile an idomizer template into an incremental-dom render factory.

See the babel's plugins page to get more information about plugins in babel.

{plugins: ['idomizer/lib/plugins/babel-idomizer.js']}

Presently the plugin only support ES6 Template literals tagged with idomizer.

For instance,

consttemplate=idomizer`<h1 class="{{data.h1Class}}">Hello</h1>`;

will be compiled into:

vartemplate=function(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',data.h1Class);_text('Hello');_elementClose('h1');};};

Be aware the template can not contain expressions like ${anExpression}.

Webpack

A webpack's loader is available to compile an idomizer file into an incremental-dom render factory.

See module.rules to get more information about loaders in webpack.

module.loaders: [
{test: /\.idomizer$/, loader: 'idomizer/lib/plugins/idomizer-loader'}
];

Browserify

A browserify's transform module is available to compile an idomizer file into an incremental-dom render factory.

See transforms to get more information about the transform system in browserify.

browserify -t idomizer/lib/plugins/idomizerify main.js > bundle.js
constbrowserify=require('browserify');constidomizerify=require('idomizer/lib/plugins/idomizerify');constbundle=browserify();bundle.transform({extension: 'html'},idomizerify);

API

idomizer.compile transforms an HTML template into a factory method.

// idomizer.compile('<h1 class="main">Hello</h1>') will return:functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

The factory method requires the incremental-dom library and an optional map of helpers. The factory returns the incremental-dom's render method.

Syntax

Static attributes

From

idomizer.compile(`<h1 class="main">Hello</h1>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

Dynamic attributes

From

idomizer.compile(`<h1 class="{{data.h1Class}}">Hello</h1>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',(data.h1Class));_text('Hello');_elementClose('h1');};}

Self closing elements

From

idomizer.compile(`<input type="text" value="{{data.value}}">`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementVoid('input',null,['type','text'],'value',(data.value));};}

Dynamic text nodes

From

idomizer.compile(`<strong><tpl-text value="data.value"/></strong>`)(IncrementalDOM)// oridomizer.compile(`<strong>{{ data.value }}</strong>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text(data.value);_elementClose('strong');};}

Condition with the tags if, else-if and else

From

idomizer.compile(` <tpl-if expression="data.yes"> YES! <tpl-else-if expression="data.yes !== false" /> MAY BE! <tpl-else/> NO! </tpl-if>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};if(data.yes){_text('YES!');}elseif(data.yes!==false){_text('MAY BE!');}else{_text('NO!');}};}

Iteration with the tag each

From

idomizer.compile(` <tpl-each items="data.items"> <strong tpl-key="{{index}}"> <tpl-text value="index"/>-<tpl-text value="item"/> </strong> </tpl-each>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};(data.items||[]).forEach(function(item,index){_elementOpen('strong',(index),null,null);_text(index);_text('-');_text(item);_elementClose('strong');});};}

Iteration with inline javascript

From

idomizer.compile(` [[ data.items.forEach(function (item, i) { ]] <strong tpl-key="{{i}}"> <tpl-text value="i"/>-<tpl-text value="item"/> </strong> [[ }); ]]`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};data.items.forEach(function(item,i){_elementOpen('strong',(i),null,null);_text(i);_text('-');_text(item);_elementClose('strong');});};}

Custom tags

From

idomizer.compile(`<strong>strong text</strong><x-test></x-test><strong>strong text</strong>`,{tags: {'x-test': {onopentag(name,attrs,key,statics,varArgs,options){return`t('${name} element');`;}}}})(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');_text('x-test element');_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom helpers

From

constsubRender=compile(`helper content`)(IncrementalDOM);idomizer.compile(` <strong>strong text</strong> <tpl-call name="subRender" /> <strong>strong text</strong>`)(IncrementalDOM,{subRender});

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');helpers.subRender(data);_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom elements

For incremental-dom, custom elements are regular HTML elements. So, if a custom element generates a sub-tree (i.e. a light DOM) outside of a ShadowDOM node, it will be overridden during the execution of the function patch(). To control this default behavior, incremental-dom provides the function skip() saying: don't touch the inner light DOM of the just opened node!

By default, idomizier detects the custom elements and force the call of the function skip() to protect their light DOM nodes. Custom elements are detected according to the following rules:

  • from the name, because of the - character
  • from the attribute ìs

Obviously, this behavior can be deactivated:

  • globally (for a whole HTML template)
    constrender=compile(`<x-element><p>will part of the light DOM</p></x-element>`,{skipCustomElements : false})
  • locally (an HTML element), ``
    constrender=compile(`<x-element tpl-skip="deactivated"><p>will part of the light DOM</p></x-element>`)

About

An HTML template parser compiling an incremental-dom render factory.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

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" + '
Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.
/idomizerPublic archive

Repository files navigation

idomizer

Continous Integration

idomizer is an HTML template compiler providing an incremental-dom render factory. idomizer can be used at compile time (front end projects) or runtime time(back end projects).

Versions and compatibilities:

  • idomizer <= 0.5 -> incremental-dom 0.4 and below.
  • idomizer >= 0.6 -> incremental-dom 0.5 and above.
  • idomizer >= 1.0.0 -> incremental-dom 0.6 and above.

Installation

$ npm install idomizer
<scriptsrc="https://ajax.googleapis.com/ajax/libs/incrementaldom/0.6.0/incremental-dom-min.js"></script><scriptsrc="https://unpkg.com/idomizer/dist/idomizer.min.js"></script><script>varfactory=idomizer.compile('<h1>Hello!</h1>');varrender=factory(IncrementalDOM);IncrementalDOM.patch(document.body,render);</script>

Babel

A babel's plugin is available to compile an idomizer template into an incremental-dom render factory.

See the babel's plugins page to get more information about plugins in babel.

{plugins: ['idomizer/lib/plugins/babel-idomizer.js']}

Presently the plugin only support ES6 Template literals tagged with idomizer.

For instance,

consttemplate=idomizer`<h1 class="{{data.h1Class}}">Hello</h1>`;

will be compiled into:

vartemplate=function(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',data.h1Class);_text('Hello');_elementClose('h1');};};

Be aware the template can not contain expressions like ${anExpression}.

Webpack

A webpack's loader is available to compile an idomizer file into an incremental-dom render factory.

See module.rules to get more information about loaders in webpack.

module.loaders: [
{test: /\.idomizer$/, loader: 'idomizer/lib/plugins/idomizer-loader'}
];

Browserify

A browserify's transform module is available to compile an idomizer file into an incremental-dom render factory.

See transforms to get more information about the transform system in browserify.

browserify -t idomizer/lib/plugins/idomizerify main.js > bundle.js
constbrowserify=require('browserify');constidomizerify=require('idomizer/lib/plugins/idomizerify');constbundle=browserify();bundle.transform({extension: 'html'},idomizerify);

API

idomizer.compile transforms an HTML template into a factory method.

// idomizer.compile('<h1 class="main">Hello</h1>') will return:functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

The factory method requires the incremental-dom library and an optional map of helpers. The factory returns the incremental-dom's render method.

Syntax

Static attributes

From

idomizer.compile(`<h1 class="main">Hello</h1>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

Dynamic attributes

From

idomizer.compile(`<h1 class="{{data.h1Class}}">Hello</h1>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',(data.h1Class));_text('Hello');_elementClose('h1');};}

Self closing elements

From

idomizer.compile(`<input type="text" value="{{data.value}}">`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementVoid('input',null,['type','text'],'value',(data.value));};}

Dynamic text nodes

From

idomizer.compile(`<strong><tpl-text value="data.value"/></strong>`)(IncrementalDOM)// oridomizer.compile(`<strong>{{ data.value }}</strong>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text(data.value);_elementClose('strong');};}

Condition with the tags if, else-if and else

From

idomizer.compile(` <tpl-if expression="data.yes"> YES! <tpl-else-if expression="data.yes !== false" /> MAY BE! <tpl-else/> NO! </tpl-if>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};if(data.yes){_text('YES!');}elseif(data.yes!==false){_text('MAY BE!');}else{_text('NO!');}};}

Iteration with the tag each

From

idomizer.compile(` <tpl-each items="data.items"> <strong tpl-key="{{index}}"> <tpl-text value="index"/>-<tpl-text value="item"/> </strong> </tpl-each>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};(data.items||[]).forEach(function(item,index){_elementOpen('strong',(index),null,null);_text(index);_text('-');_text(item);_elementClose('strong');});};}

Iteration with inline javascript

From

idomizer.compile(` [[ data.items.forEach(function (item, i) { ]] <strong tpl-key="{{i}}"> <tpl-text value="i"/>-<tpl-text value="item"/> </strong> [[ }); ]]`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};data.items.forEach(function(item,i){_elementOpen('strong',(i),null,null);_text(i);_text('-');_text(item);_elementClose('strong');});};}

Custom tags

From

idomizer.compile(`<strong>strong text</strong><x-test></x-test><strong>strong text</strong>`,{tags: {'x-test': {onopentag(name,attrs,key,statics,varArgs,options){return`t('${name} element');`;}}}})(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');_text('x-test element');_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom helpers

From

constsubRender=compile(`helper content`)(IncrementalDOM);idomizer.compile(` <strong>strong text</strong> <tpl-call name="subRender" /> <strong>strong text</strong>`)(IncrementalDOM,{subRender});

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');helpers.subRender(data);_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom elements

For incremental-dom, custom elements are regular HTML elements. So, if a custom element generates a sub-tree (i.e. a light DOM) outside of a ShadowDOM node, it will be overridden during the execution of the function patch(). To control this default behavior, incremental-dom provides the function skip() saying: don't touch the inner light DOM of the just opened node!

By default, idomizier detects the custom elements and force the call of the function skip() to protect their light DOM nodes. Custom elements are detected according to the following rules:

  • from the name, because of the - character
  • from the attribute ìs

Obviously, this behavior can be deactivated:

  • globally (for a whole HTML template)
    constrender=compile(`<x-element><p>will part of the light DOM</p></x-element>`,{skipCustomElements : false})
  • locally (an HTML element), ``
    constrender=compile(`<x-element tpl-skip="deactivated"><p>will part of the light DOM</p></x-element>`)

About

An HTML template parser compiling an incremental-dom render factory.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

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('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.
/idomizerPublic archive

Repository files navigation

idomizer

Continous Integration

idomizer is an HTML template compiler providing an incremental-dom render factory. idomizer can be used at compile time (front end projects) or runtime time(back end projects).

Versions and compatibilities:

  • idomizer <= 0.5 -> incremental-dom 0.4 and below.
  • idomizer >= 0.6 -> incremental-dom 0.5 and above.
  • idomizer >= 1.0.0 -> incremental-dom 0.6 and above.

Installation

$ npm install idomizer
<scriptsrc="https://ajax.googleapis.com/ajax/libs/incrementaldom/0.6.0/incremental-dom-min.js"></script><scriptsrc="https://unpkg.com/idomizer/dist/idomizer.min.js"></script><script>varfactory=idomizer.compile('<h1>Hello!</h1>');varrender=factory(IncrementalDOM);IncrementalDOM.patch(document.body,render);</script>

Babel

A babel's plugin is available to compile an idomizer template into an incremental-dom render factory.

See the babel's plugins page to get more information about plugins in babel.

{plugins: ['idomizer/lib/plugins/babel-idomizer.js']}

Presently the plugin only support ES6 Template literals tagged with idomizer.

For instance,

consttemplate=idomizer`<h1 class="{{data.h1Class}}">Hello</h1>`;

will be compiled into:

vartemplate=function(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',data.h1Class);_text('Hello');_elementClose('h1');};};

Be aware the template can not contain expressions like ${anExpression}.

Webpack

A webpack's loader is available to compile an idomizer file into an incremental-dom render factory.

See module.rules to get more information about loaders in webpack.

module.loaders: [
{test: /\.idomizer$/, loader: 'idomizer/lib/plugins/idomizer-loader'}
];

Browserify

A browserify's transform module is available to compile an idomizer file into an incremental-dom render factory.

See transforms to get more information about the transform system in browserify.

browserify -t idomizer/lib/plugins/idomizerify main.js > bundle.js
constbrowserify=require('browserify');constidomizerify=require('idomizer/lib/plugins/idomizerify');constbundle=browserify();bundle.transform({extension: 'html'},idomizerify);

API

idomizer.compile transforms an HTML template into a factory method.

// idomizer.compile('<h1 class="main">Hello</h1>') will return:functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

The factory method requires the incremental-dom library and an optional map of helpers. The factory returns the incremental-dom's render method.

Syntax

Static attributes

From

idomizer.compile(`<h1 class="main">Hello</h1>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

Dynamic attributes

From

idomizer.compile(`<h1 class="{{data.h1Class}}">Hello</h1>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',(data.h1Class));_text('Hello');_elementClose('h1');};}

Self closing elements

From

idomizer.compile(`<input type="text" value="{{data.value}}">`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementVoid('input',null,['type','text'],'value',(data.value));};}

Dynamic text nodes

From

idomizer.compile(`<strong><tpl-text value="data.value"/></strong>`)(IncrementalDOM)// oridomizer.compile(`<strong>{{ data.value }}</strong>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text(data.value);_elementClose('strong');};}

Condition with the tags if, else-if and else

From

idomizer.compile(` <tpl-if expression="data.yes"> YES! <tpl-else-if expression="data.yes !== false" /> MAY BE! <tpl-else/> NO! </tpl-if>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};if(data.yes){_text('YES!');}elseif(data.yes!==false){_text('MAY BE!');}else{_text('NO!');}};}

Iteration with the tag each

From

idomizer.compile(` <tpl-each items="data.items"> <strong tpl-key="{{index}}"> <tpl-text value="index"/>-<tpl-text value="item"/> </strong> </tpl-each>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};(data.items||[]).forEach(function(item,index){_elementOpen('strong',(index),null,null);_text(index);_text('-');_text(item);_elementClose('strong');});};}

Iteration with inline javascript

From

idomizer.compile(` [[ data.items.forEach(function (item, i) { ]] <strong tpl-key="{{i}}"> <tpl-text value="i"/>-<tpl-text value="item"/> </strong> [[ }); ]]`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};data.items.forEach(function(item,i){_elementOpen('strong',(i),null,null);_text(i);_text('-');_text(item);_elementClose('strong');});};}

Custom tags

From

idomizer.compile(`<strong>strong text</strong><x-test></x-test><strong>strong text</strong>`,{tags: {'x-test': {onopentag(name,attrs,key,statics,varArgs,options){return`t('${name} element');`;}}}})(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');_text('x-test element');_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom helpers

From

constsubRender=compile(`helper content`)(IncrementalDOM);idomizer.compile(` <strong>strong text</strong> <tpl-call name="subRender" /> <strong>strong text</strong>`)(IncrementalDOM,{subRender});

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');helpers.subRender(data);_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom elements

For incremental-dom, custom elements are regular HTML elements. So, if a custom element generates a sub-tree (i.e. a light DOM) outside of a ShadowDOM node, it will be overridden during the execution of the function patch(). To control this default behavior, incremental-dom provides the function skip() saying: don't touch the inner light DOM of the just opened node!

By default, idomizier detects the custom elements and force the call of the function skip() to protect their light DOM nodes. Custom elements are detected according to the following rules:

  • from the name, because of the - character
  • from the attribute ìs

Obviously, this behavior can be deactivated:

  • globally (for a whole HTML template)
    constrender=compile(`<x-element><p>will part of the light DOM</p></x-element>`,{skipCustomElements : false})
  • locally (an HTML element), ``
    constrender=compile(`<x-element tpl-skip="deactivated"><p>will part of the light DOM</p></x-element>`)

About

An HTML template parser compiling an incremental-dom render factory.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

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('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.
/idomizerPublic archive

Repository files navigation

idomizer

Continous Integration

idomizer is an HTML template compiler providing an incremental-dom render factory. idomizer can be used at compile time (front end projects) or runtime time(back end projects).

Versions and compatibilities:

  • idomizer <= 0.5 -> incremental-dom 0.4 and below.
  • idomizer >= 0.6 -> incremental-dom 0.5 and above.
  • idomizer >= 1.0.0 -> incremental-dom 0.6 and above.

Installation

$ npm install idomizer
<scriptsrc="https://ajax.googleapis.com/ajax/libs/incrementaldom/0.6.0/incremental-dom-min.js"></script><scriptsrc="https://unpkg.com/idomizer/dist/idomizer.min.js"></script><script>varfactory=idomizer.compile('<h1>Hello!</h1>');varrender=factory(IncrementalDOM);IncrementalDOM.patch(document.body,render);</script>

Babel

A babel's plugin is available to compile an idomizer template into an incremental-dom render factory.

See the babel's plugins page to get more information about plugins in babel.

{plugins: ['idomizer/lib/plugins/babel-idomizer.js']}

Presently the plugin only support ES6 Template literals tagged with idomizer.

For instance,

consttemplate=idomizer`<h1 class="{{data.h1Class}}">Hello</h1>`;

will be compiled into:

vartemplate=function(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',data.h1Class);_text('Hello');_elementClose('h1');};};

Be aware the template can not contain expressions like ${anExpression}.

Webpack

A webpack's loader is available to compile an idomizer file into an incremental-dom render factory.

See module.rules to get more information about loaders in webpack.

module.loaders: [
{test: /\.idomizer$/, loader: 'idomizer/lib/plugins/idomizer-loader'}
];

Browserify

A browserify's transform module is available to compile an idomizer file into an incremental-dom render factory.

See transforms to get more information about the transform system in browserify.

browserify -t idomizer/lib/plugins/idomizerify main.js > bundle.js
constbrowserify=require('browserify');constidomizerify=require('idomizer/lib/plugins/idomizerify');constbundle=browserify();bundle.transform({extension: 'html'},idomizerify);

API

idomizer.compile transforms an HTML template into a factory method.

// idomizer.compile('<h1 class="main">Hello</h1>') will return:functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

The factory method requires the incremental-dom library and an optional map of helpers. The factory returns the incremental-dom's render method.

Syntax

Static attributes

From

idomizer.compile(`<h1 class="main">Hello</h1>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

Dynamic attributes

From

idomizer.compile(`<h1 class="{{data.h1Class}}">Hello</h1>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',(data.h1Class));_text('Hello');_elementClose('h1');};}

Self closing elements

From

idomizer.compile(`<input type="text" value="{{data.value}}">`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementVoid('input',null,['type','text'],'value',(data.value));};}

Dynamic text nodes

From

idomizer.compile(`<strong><tpl-text value="data.value"/></strong>`)(IncrementalDOM)// oridomizer.compile(`<strong>{{ data.value }}</strong>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text(data.value);_elementClose('strong');};}

Condition with the tags if, else-if and else

From

idomizer.compile(` <tpl-if expression="data.yes"> YES! <tpl-else-if expression="data.yes !== false" /> MAY BE! <tpl-else/> NO! </tpl-if>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};if(data.yes){_text('YES!');}elseif(data.yes!==false){_text('MAY BE!');}else{_text('NO!');}};}

Iteration with the tag each

From

idomizer.compile(` <tpl-each items="data.items"> <strong tpl-key="{{index}}"> <tpl-text value="index"/>-<tpl-text value="item"/> </strong> </tpl-each>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};(data.items||[]).forEach(function(item,index){_elementOpen('strong',(index),null,null);_text(index);_text('-');_text(item);_elementClose('strong');});};}

Iteration with inline javascript

From

idomizer.compile(` [[ data.items.forEach(function (item, i) { ]] <strong tpl-key="{{i}}"> <tpl-text value="i"/>-<tpl-text value="item"/> </strong> [[ }); ]]`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};data.items.forEach(function(item,i){_elementOpen('strong',(i),null,null);_text(i);_text('-');_text(item);_elementClose('strong');});};}

Custom tags

From

idomizer.compile(`<strong>strong text</strong><x-test></x-test><strong>strong text</strong>`,{tags: {'x-test': {onopentag(name,attrs,key,statics,varArgs,options){return`t('${name} element');`;}}}})(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');_text('x-test element');_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom helpers

From

constsubRender=compile(`helper content`)(IncrementalDOM);idomizer.compile(` <strong>strong text</strong> <tpl-call name="subRender" /> <strong>strong text</strong>`)(IncrementalDOM,{subRender});

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');helpers.subRender(data);_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom elements

For incremental-dom, custom elements are regular HTML elements. So, if a custom element generates a sub-tree (i.e. a light DOM) outside of a ShadowDOM node, it will be overridden during the execution of the function patch(). To control this default behavior, incremental-dom provides the function skip() saying: don't touch the inner light DOM of the just opened node!

By default, idomizier detects the custom elements and force the call of the function skip() to protect their light DOM nodes. Custom elements are detected according to the following rules:

  • from the name, because of the - character
  • from the attribute ìs

Obviously, this behavior can be deactivated:

  • globally (for a whole HTML template)
    constrender=compile(`<x-element><p>will part of the light DOM</p></x-element>`,{skipCustomElements : false})
  • locally (an HTML element), ``
    constrender=compile(`<x-element tpl-skip="deactivated"><p>will part of the light DOM</p></x-element>`)

About

An HTML template parser compiling an incremental-dom render factory.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

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" + '
Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.
/idomizerPublic archive

Repository files navigation

idomizer

Continous Integration

idomizer is an HTML template compiler providing an incremental-dom render factory. idomizer can be used at compile time (front end projects) or runtime time(back end projects).

Versions and compatibilities:

  • idomizer <= 0.5 -> incremental-dom 0.4 and below.
  • idomizer >= 0.6 -> incremental-dom 0.5 and above.
  • idomizer >= 1.0.0 -> incremental-dom 0.6 and above.

Installation

$ npm install idomizer
<scriptsrc="https://ajax.googleapis.com/ajax/libs/incrementaldom/0.6.0/incremental-dom-min.js"></script><scriptsrc="https://unpkg.com/idomizer/dist/idomizer.min.js"></script><script>varfactory=idomizer.compile('<h1>Hello!</h1>');varrender=factory(IncrementalDOM);IncrementalDOM.patch(document.body,render);</script>

Babel

A babel's plugin is available to compile an idomizer template into an incremental-dom render factory.

See the babel's plugins page to get more information about plugins in babel.

{plugins: ['idomizer/lib/plugins/babel-idomizer.js']}

Presently the plugin only support ES6 Template literals tagged with idomizer.

For instance,

consttemplate=idomizer`<h1 class="{{data.h1Class}}">Hello</h1>`;

will be compiled into:

vartemplate=function(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',data.h1Class);_text('Hello');_elementClose('h1');};};

Be aware the template can not contain expressions like ${anExpression}.

Webpack

A webpack's loader is available to compile an idomizer file into an incremental-dom render factory.

See module.rules to get more information about loaders in webpack.

module.loaders: [
{test: /\.idomizer$/, loader: 'idomizer/lib/plugins/idomizer-loader'}
];

Browserify

A browserify's transform module is available to compile an idomizer file into an incremental-dom render factory.

See transforms to get more information about the transform system in browserify.

browserify -t idomizer/lib/plugins/idomizerify main.js > bundle.js
constbrowserify=require('browserify');constidomizerify=require('idomizer/lib/plugins/idomizerify');constbundle=browserify();bundle.transform({extension: 'html'},idomizerify);

API

idomizer.compile transforms an HTML template into a factory method.

// idomizer.compile('<h1 class="main">Hello</h1>') will return:functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

The factory method requires the incremental-dom library and an optional map of helpers. The factory returns the incremental-dom's render method.

Syntax

Static attributes

From

idomizer.compile(`<h1 class="main">Hello</h1>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

Dynamic attributes

From

idomizer.compile(`<h1 class="{{data.h1Class}}">Hello</h1>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',(data.h1Class));_text('Hello');_elementClose('h1');};}

Self closing elements

From

idomizer.compile(`<input type="text" value="{{data.value}}">`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementVoid('input',null,['type','text'],'value',(data.value));};}

Dynamic text nodes

From

idomizer.compile(`<strong><tpl-text value="data.value"/></strong>`)(IncrementalDOM)// oridomizer.compile(`<strong>{{ data.value }}</strong>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text(data.value);_elementClose('strong');};}

Condition with the tags if, else-if and else

From

idomizer.compile(` <tpl-if expression="data.yes"> YES! <tpl-else-if expression="data.yes !== false" /> MAY BE! <tpl-else/> NO! </tpl-if>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};if(data.yes){_text('YES!');}elseif(data.yes!==false){_text('MAY BE!');}else{_text('NO!');}};}

Iteration with the tag each

From

idomizer.compile(` <tpl-each items="data.items"> <strong tpl-key="{{index}}"> <tpl-text value="index"/>-<tpl-text value="item"/> </strong> </tpl-each>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};(data.items||[]).forEach(function(item,index){_elementOpen('strong',(index),null,null);_text(index);_text('-');_text(item);_elementClose('strong');});};}

Iteration with inline javascript

From

idomizer.compile(` [[ data.items.forEach(function (item, i) { ]] <strong tpl-key="{{i}}"> <tpl-text value="i"/>-<tpl-text value="item"/> </strong> [[ }); ]]`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};data.items.forEach(function(item,i){_elementOpen('strong',(i),null,null);_text(i);_text('-');_text(item);_elementClose('strong');});};}

Custom tags

From

idomizer.compile(`<strong>strong text</strong><x-test></x-test><strong>strong text</strong>`,{tags: {'x-test': {onopentag(name,attrs,key,statics,varArgs,options){return`t('${name} element');`;}}}})(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');_text('x-test element');_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom helpers

From

constsubRender=compile(`helper content`)(IncrementalDOM);idomizer.compile(` <strong>strong text</strong> <tpl-call name="subRender" /> <strong>strong text</strong>`)(IncrementalDOM,{subRender});

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');helpers.subRender(data);_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom elements

For incremental-dom, custom elements are regular HTML elements. So, if a custom element generates a sub-tree (i.e. a light DOM) outside of a ShadowDOM node, it will be overridden during the execution of the function patch(). To control this default behavior, incremental-dom provides the function skip() saying: don't touch the inner light DOM of the just opened node!

By default, idomizier detects the custom elements and force the call of the function skip() to protect their light DOM nodes. Custom elements are detected according to the following rules:

  • from the name, because of the - character
  • from the attribute ìs

Obviously, this behavior can be deactivated:

  • globally (for a whole HTML template)
    constrender=compile(`<x-element><p>will part of the light DOM</p></x-element>`,{skipCustomElements : false})
  • locally (an HTML element), ``
    constrender=compile(`<x-element tpl-skip="deactivated"><p>will part of the light DOM</p></x-element>`)

About

An HTML template parser compiling an incremental-dom render factory.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

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('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.
/idomizerPublic archive

Repository files navigation

idomizer

Continous Integration

idomizer is an HTML template compiler providing an incremental-dom render factory. idomizer can be used at compile time (front end projects) or runtime time(back end projects).

Versions and compatibilities:

  • idomizer <= 0.5 -> incremental-dom 0.4 and below.
  • idomizer >= 0.6 -> incremental-dom 0.5 and above.
  • idomizer >= 1.0.0 -> incremental-dom 0.6 and above.

Installation

$ npm install idomizer
<scriptsrc="https://ajax.googleapis.com/ajax/libs/incrementaldom/0.6.0/incremental-dom-min.js"></script><scriptsrc="https://unpkg.com/idomizer/dist/idomizer.min.js"></script><script>varfactory=idomizer.compile('<h1>Hello!</h1>');varrender=factory(IncrementalDOM);IncrementalDOM.patch(document.body,render);</script>

Babel

A babel's plugin is available to compile an idomizer template into an incremental-dom render factory.

See the babel's plugins page to get more information about plugins in babel.

{plugins: ['idomizer/lib/plugins/babel-idomizer.js']}

Presently the plugin only support ES6 Template literals tagged with idomizer.

For instance,

consttemplate=idomizer`<h1 class="{{data.h1Class}}">Hello</h1>`;

will be compiled into:

vartemplate=function(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',data.h1Class);_text('Hello');_elementClose('h1');};};

Be aware the template can not contain expressions like ${anExpression}.

Webpack

A webpack's loader is available to compile an idomizer file into an incremental-dom render factory.

See module.rules to get more information about loaders in webpack.

module.loaders: [
{test: /\.idomizer$/, loader: 'idomizer/lib/plugins/idomizer-loader'}
];

Browserify

A browserify's transform module is available to compile an idomizer file into an incremental-dom render factory.

See transforms to get more information about the transform system in browserify.

browserify -t idomizer/lib/plugins/idomizerify main.js > bundle.js
constbrowserify=require('browserify');constidomizerify=require('idomizer/lib/plugins/idomizerify');constbundle=browserify();bundle.transform({extension: 'html'},idomizerify);

API

idomizer.compile transforms an HTML template into a factory method.

// idomizer.compile('<h1 class="main">Hello</h1>') will return:functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

The factory method requires the incremental-dom library and an optional map of helpers. The factory returns the incremental-dom's render method.

Syntax

Static attributes

From

idomizer.compile(`<h1 class="main">Hello</h1>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

Dynamic attributes

From

idomizer.compile(`<h1 class="{{data.h1Class}}">Hello</h1>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',(data.h1Class));_text('Hello');_elementClose('h1');};}

Self closing elements

From

idomizer.compile(`<input type="text" value="{{data.value}}">`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementVoid('input',null,['type','text'],'value',(data.value));};}

Dynamic text nodes

From

idomizer.compile(`<strong><tpl-text value="data.value"/></strong>`)(IncrementalDOM)// oridomizer.compile(`<strong>{{ data.value }}</strong>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text(data.value);_elementClose('strong');};}

Condition with the tags if, else-if and else

From

idomizer.compile(` <tpl-if expression="data.yes"> YES! <tpl-else-if expression="data.yes !== false" /> MAY BE! <tpl-else/> NO! </tpl-if>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};if(data.yes){_text('YES!');}elseif(data.yes!==false){_text('MAY BE!');}else{_text('NO!');}};}

Iteration with the tag each

From

idomizer.compile(` <tpl-each items="data.items"> <strong tpl-key="{{index}}"> <tpl-text value="index"/>-<tpl-text value="item"/> </strong> </tpl-each>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};(data.items||[]).forEach(function(item,index){_elementOpen('strong',(index),null,null);_text(index);_text('-');_text(item);_elementClose('strong');});};}

Iteration with inline javascript

From

idomizer.compile(` [[ data.items.forEach(function (item, i) { ]] <strong tpl-key="{{i}}"> <tpl-text value="i"/>-<tpl-text value="item"/> </strong> [[ }); ]]`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};data.items.forEach(function(item,i){_elementOpen('strong',(i),null,null);_text(i);_text('-');_text(item);_elementClose('strong');});};}

Custom tags

From

idomizer.compile(`<strong>strong text</strong><x-test></x-test><strong>strong text</strong>`,{tags: {'x-test': {onopentag(name,attrs,key,statics,varArgs,options){return`t('${name} element');`;}}}})(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');_text('x-test element');_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom helpers

From

constsubRender=compile(`helper content`)(IncrementalDOM);idomizer.compile(` <strong>strong text</strong> <tpl-call name="subRender" /> <strong>strong text</strong>`)(IncrementalDOM,{subRender});

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');helpers.subRender(data);_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom elements

For incremental-dom, custom elements are regular HTML elements. So, if a custom element generates a sub-tree (i.e. a light DOM) outside of a ShadowDOM node, it will be overridden during the execution of the function patch(). To control this default behavior, incremental-dom provides the function skip() saying: don't touch the inner light DOM of the just opened node!

By default, idomizier detects the custom elements and force the call of the function skip() to protect their light DOM nodes. Custom elements are detected according to the following rules:

  • from the name, because of the - character
  • from the attribute ìs

Obviously, this behavior can be deactivated:

  • globally (for a whole HTML template)
    constrender=compile(`<x-element><p>will part of the light DOM</p></x-element>`,{skipCustomElements : false})
  • locally (an HTML element), ``
    constrender=compile(`<x-element tpl-skip="deactivated"><p>will part of the light DOM</p></x-element>`)

About

An HTML template parser compiling an incremental-dom render factory.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

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('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.
/idomizerPublic archive

Repository files navigation

idomizer

Continous Integration

idomizer is an HTML template compiler providing an incremental-dom render factory. idomizer can be used at compile time (front end projects) or runtime time(back end projects).

Versions and compatibilities:

  • idomizer <= 0.5 -> incremental-dom 0.4 and below.
  • idomizer >= 0.6 -> incremental-dom 0.5 and above.
  • idomizer >= 1.0.0 -> incremental-dom 0.6 and above.

Installation

$ npm install idomizer
<scriptsrc="https://ajax.googleapis.com/ajax/libs/incrementaldom/0.6.0/incremental-dom-min.js"></script><scriptsrc="https://unpkg.com/idomizer/dist/idomizer.min.js"></script><script>varfactory=idomizer.compile('<h1>Hello!</h1>');varrender=factory(IncrementalDOM);IncrementalDOM.patch(document.body,render);</script>

Babel

A babel's plugin is available to compile an idomizer template into an incremental-dom render factory.

See the babel's plugins page to get more information about plugins in babel.

{plugins: ['idomizer/lib/plugins/babel-idomizer.js']}

Presently the plugin only support ES6 Template literals tagged with idomizer.

For instance,

consttemplate=idomizer`<h1 class="{{data.h1Class}}">Hello</h1>`;

will be compiled into:

vartemplate=function(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',data.h1Class);_text('Hello');_elementClose('h1');};};

Be aware the template can not contain expressions like ${anExpression}.

Webpack

A webpack's loader is available to compile an idomizer file into an incremental-dom render factory.

See module.rules to get more information about loaders in webpack.

module.loaders: [
{test: /\.idomizer$/, loader: 'idomizer/lib/plugins/idomizer-loader'}
];

Browserify

A browserify's transform module is available to compile an idomizer file into an incremental-dom render factory.

See transforms to get more information about the transform system in browserify.

browserify -t idomizer/lib/plugins/idomizerify main.js > bundle.js
constbrowserify=require('browserify');constidomizerify=require('idomizer/lib/plugins/idomizerify');constbundle=browserify();bundle.transform({extension: 'html'},idomizerify);

API

idomizer.compile transforms an HTML template into a factory method.

// idomizer.compile('<h1 class="main">Hello</h1>') will return:functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

The factory method requires the incremental-dom library and an optional map of helpers. The factory returns the incremental-dom's render method.

Syntax

Static attributes

From

idomizer.compile(`<h1 class="main">Hello</h1>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

Dynamic attributes

From

idomizer.compile(`<h1 class="{{data.h1Class}}">Hello</h1>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',(data.h1Class));_text('Hello');_elementClose('h1');};}

Self closing elements

From

idomizer.compile(`<input type="text" value="{{data.value}}">`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementVoid('input',null,['type','text'],'value',(data.value));};}

Dynamic text nodes

From

idomizer.compile(`<strong><tpl-text value="data.value"/></strong>`)(IncrementalDOM)// oridomizer.compile(`<strong>{{ data.value }}</strong>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text(data.value);_elementClose('strong');};}

Condition with the tags if, else-if and else

From

idomizer.compile(` <tpl-if expression="data.yes"> YES! <tpl-else-if expression="data.yes !== false" /> MAY BE! <tpl-else/> NO! </tpl-if>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};if(data.yes){_text('YES!');}elseif(data.yes!==false){_text('MAY BE!');}else{_text('NO!');}};}

Iteration with the tag each

From

idomizer.compile(` <tpl-each items="data.items"> <strong tpl-key="{{index}}"> <tpl-text value="index"/>-<tpl-text value="item"/> </strong> </tpl-each>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};(data.items||[]).forEach(function(item,index){_elementOpen('strong',(index),null,null);_text(index);_text('-');_text(item);_elementClose('strong');});};}

Iteration with inline javascript

From

idomizer.compile(` [[ data.items.forEach(function (item, i) { ]] <strong tpl-key="{{i}}"> <tpl-text value="i"/>-<tpl-text value="item"/> </strong> [[ }); ]]`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};data.items.forEach(function(item,i){_elementOpen('strong',(i),null,null);_text(i);_text('-');_text(item);_elementClose('strong');});};}

Custom tags

From

idomizer.compile(`<strong>strong text</strong><x-test></x-test><strong>strong text</strong>`,{tags: {'x-test': {onopentag(name,attrs,key,statics,varArgs,options){return`t('${name} element');`;}}}})(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');_text('x-test element');_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom helpers

From

constsubRender=compile(`helper content`)(IncrementalDOM);idomizer.compile(` <strong>strong text</strong> <tpl-call name="subRender" /> <strong>strong text</strong>`)(IncrementalDOM,{subRender});

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');helpers.subRender(data);_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom elements

For incremental-dom, custom elements are regular HTML elements. So, if a custom element generates a sub-tree (i.e. a light DOM) outside of a ShadowDOM node, it will be overridden during the execution of the function patch(). To control this default behavior, incremental-dom provides the function skip() saying: don't touch the inner light DOM of the just opened node!

By default, idomizier detects the custom elements and force the call of the function skip() to protect their light DOM nodes. Custom elements are detected according to the following rules:

  • from the name, because of the - character
  • from the attribute ìs

Obviously, this behavior can be deactivated:

  • globally (for a whole HTML template)
    constrender=compile(`<x-element><p>will part of the light DOM</p></x-element>`,{skipCustomElements : false})
  • locally (an HTML element), ``
    constrender=compile(`<x-element tpl-skip="deactivated"><p>will part of the light DOM</p></x-element>`)

About

An HTML template parser compiling an incremental-dom render factory.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

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); } })(); })();
Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.
/idomizerPublic archive

Repository files navigation

idomizer

Continous Integration

idomizer is an HTML template compiler providing an incremental-dom render factory. idomizer can be used at compile time (front end projects) or runtime time(back end projects).

Versions and compatibilities:

  • idomizer <= 0.5 -> incremental-dom 0.4 and below.
  • idomizer >= 0.6 -> incremental-dom 0.5 and above.
  • idomizer >= 1.0.0 -> incremental-dom 0.6 and above.

Installation

$ npm install idomizer
<scriptsrc="https://ajax.googleapis.com/ajax/libs/incrementaldom/0.6.0/incremental-dom-min.js"></script><scriptsrc="https://unpkg.com/idomizer/dist/idomizer.min.js"></script><script>varfactory=idomizer.compile('<h1>Hello!</h1>');varrender=factory(IncrementalDOM);IncrementalDOM.patch(document.body,render);</script>

Babel

A babel's plugin is available to compile an idomizer template into an incremental-dom render factory.

See the babel's plugins page to get more information about plugins in babel.

{plugins: ['idomizer/lib/plugins/babel-idomizer.js']}

Presently the plugin only support ES6 Template literals tagged with idomizer.

For instance,

consttemplate=idomizer`<h1 class="{{data.h1Class}}">Hello</h1>`;

will be compiled into:

vartemplate=function(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',data.h1Class);_text('Hello');_elementClose('h1');};};

Be aware the template can not contain expressions like ${anExpression}.

Webpack

A webpack's loader is available to compile an idomizer file into an incremental-dom render factory.

See module.rules to get more information about loaders in webpack.

module.loaders: [
{test: /\.idomizer$/, loader: 'idomizer/lib/plugins/idomizer-loader'}
];

Browserify

A browserify's transform module is available to compile an idomizer file into an incremental-dom render factory.

See transforms to get more information about the transform system in browserify.

browserify -t idomizer/lib/plugins/idomizerify main.js > bundle.js
constbrowserify=require('browserify');constidomizerify=require('idomizer/lib/plugins/idomizerify');constbundle=browserify();bundle.transform({extension: 'html'},idomizerify);

API

idomizer.compile transforms an HTML template into a factory method.

// idomizer.compile('<h1 class="main">Hello</h1>') will return:functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

The factory method requires the incremental-dom library and an optional map of helpers. The factory returns the incremental-dom's render method.

Syntax

Static attributes

From

idomizer.compile(`<h1 class="main">Hello</h1>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,['class','main'],null);_text('Hello');_elementClose('h1');};}

Dynamic attributes

From

idomizer.compile(`<h1 class="{{data.h1Class}}">Hello</h1>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('h1',null,null,'class',(data.h1Class));_text('Hello');_elementClose('h1');};}

Self closing elements

From

idomizer.compile(`<input type="text" value="{{data.value}}">`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementVoid('input',null,['type','text'],'value',(data.value));};}

Dynamic text nodes

From

idomizer.compile(`<strong><tpl-text value="data.value"/></strong>`)(IncrementalDOM)// oridomizer.compile(`<strong>{{ data.value }}</strong>`)(IncrementalDOM)

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text(data.value);_elementClose('strong');};}

Condition with the tags if, else-if and else

From

idomizer.compile(` <tpl-if expression="data.yes"> YES! <tpl-else-if expression="data.yes !== false" /> MAY BE! <tpl-else/> NO! </tpl-if>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};if(data.yes){_text('YES!');}elseif(data.yes!==false){_text('MAY BE!');}else{_text('NO!');}};}

Iteration with the tag each

From

idomizer.compile(` <tpl-each items="data.items"> <strong tpl-key="{{index}}"> <tpl-text value="index"/>-<tpl-text value="item"/> </strong> </tpl-each>`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};(data.items||[]).forEach(function(item,index){_elementOpen('strong',(index),null,null);_text(index);_text('-');_text(item);_elementClose('strong');});};}

Iteration with inline javascript

From

idomizer.compile(` [[ data.items.forEach(function (item, i) { ]] <strong tpl-key="{{i}}"> <tpl-text value="i"/>-<tpl-text value="item"/> </strong> [[ }); ]]`)(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};data.items.forEach(function(item,i){_elementOpen('strong',(i),null,null);_text(i);_text('-');_text(item);_elementClose('strong');});};}

Custom tags

From

idomizer.compile(`<strong>strong text</strong><x-test></x-test><strong>strong text</strong>`,{tags: {'x-test': {onopentag(name,attrs,key,statics,varArgs,options){return`t('${name} element');`;}}}})(IncrementalDOM);

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');_text('x-test element');_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom helpers

From

constsubRender=compile(`helper content`)(IncrementalDOM);idomizer.compile(` <strong>strong text</strong> <tpl-call name="subRender" /> <strong>strong text</strong>`)(IncrementalDOM,{subRender});

To

functiontemplate(_i,_h){var_elementOpen=_i.elementOpen,_elementClose=_i.elementClose,_elementVoid=_i.elementVoid,_text=_i.text,_skip=_i.skip;returnfunction(_data_){varhelpers=_h||{},data=_data_||{};_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');helpers.subRender(data);_elementOpen('strong',null,null,null);_text('strong text');_elementClose('strong');};}

Custom elements

For incremental-dom, custom elements are regular HTML elements. So, if a custom element generates a sub-tree (i.e. a light DOM) outside of a ShadowDOM node, it will be overridden during the execution of the function patch(). To control this default behavior, incremental-dom provides the function skip() saying: don't touch the inner light DOM of the just opened node!

By default, idomizier detects the custom elements and force the call of the function skip() to protect their light DOM nodes. Custom elements are detected according to the following rules:

  • from the name, because of the - character
  • from the attribute ìs

Obviously, this behavior can be deactivated:

  • globally (for a whole HTML template)
    constrender=compile(`<x-element><p>will part of the light DOM</p></x-element>`,{skipCustomElements : false})
  • locally (an HTML element), ``
    constrender=compile(`<x-element tpl-skip="deactivated"><p>will part of the light DOM</p></x-element>`)

About

An HTML template parser compiling an incremental-dom render factory.

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages