Skip to content

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

temple

temple is an HTML templating library for Go. It doesn't use its own syntax, preferring to use the standard library's html/templates. temple's purpose is to make working with the standard library's templates a little bit more manageable.

It is for people who want to render HTML from their servers like it's 2003 again.

Approach

Component-driven

Go templates come in two parts: the template literal, and the data to render that template literal with. These two parts are tied together in a fragile protocol that the compiler does not help you at all with. You need to make sure that the data to render is passed in the format the template literal expects, and that when one changes the other changes, as well.

temple addresses this by wrapping both parts inside an abstraction called a "Component". A Component is anything that can surface a template literal.

A Component that can be rendered as a standalone page, instead of just being part of another page, is called a Page. When a Page is rendered the data passed to the template literal will contain the Page itself as $.Page. In this way, temple codifies the data being passed in, and identifies the template literal it is passed to at the same time. A Page can serve as the interface that a template is accessed through, exposing the data it expects and the format it expects it in. A Component allows a Page to reference another template through an interface that exposes the data it expects and the format it expects it in.

Access to global state

It's a pain to try and build everything out of Components that you explicitly pass state through. Sometimes you want something like your site's name to be configurable, and you don't want to pipe that through every Component. To that end, temple defines a "Site" type. The Site will be included in the data passed to every template, as $.Site.

JavaScript and CSS stay with their Components

A Component can optionally indicate that it embeds JavaScript directly into the HTML, links to a JavaScript file loaded at runtime, embeds CSS directly into the HTML, links to a CSS file loaded at runtime, or any combination of these approaches. JavaScript and CSS can get loaded only on the pages they are needed for by tagging along with Components when the Component is rendered.

Any of these resources can also declare a relationship to another resource, controlling the order in which they get rendered to the page, allowing for fine-grained control over how resources end up being loaded in the HTML. By default, if any Component's Embedder or Linker methods return more than one resource in a single slice, those resources will be rendered in the order they appear in the slice. Explicitly declaring a relationship to any other resources disables this implicit relationship, as does setting the DisableImplicitOrdering property on the resource to true.

HTML agnostic

temple is a layer on top of html/template, but it isn't attempting to proscribe how you write your HTML. It strives to offer the least-restrictive possible interface on top of html/template; just enough to create its Components system and resource-loading system.

Resilient to errors

Every Site can fill a ServerErrorPager interface, which describes an error page to render if there's a problem rendering the page. By default, Pages are rendered into memory before being copied over the wire, to prevent half a template from being sent. To disable this default behavior, have either a Site, Page, or Component (depending on whether you want the behavior disabled globally, per-Page, or only for Pages that include the Component) implement the RenderConfigurer interface, and have it return RenderOptionDisablePageBuffering as one of the RenderOptions:

func (Site) ConfigureRender() []temple.RenderOption {
return []temple.RenderOption{
temple.RenderOptionDisablePageBuffering(true),
}
}

This will disable the buffering, allowing the HTML to be written as a stream.

Examples

See the runnable, tested examples on pkg.go.dev.

About

A framework for rendering HTML templates in Go.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - impractical/temple: A framework for rendering HTML templates in Go. · GitHub
Skip to content

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

temple

temple is an HTML templating library for Go. It doesn't use its own syntax, preferring to use the standard library's html/templates. temple's purpose is to make working with the standard library's templates a little bit more manageable.

It is for people who want to render HTML from their servers like it's 2003 again.

Approach

Component-driven

Go templates come in two parts: the template literal, and the data to render that template literal with. These two parts are tied together in a fragile protocol that the compiler does not help you at all with. You need to make sure that the data to render is passed in the format the template literal expects, and that when one changes the other changes, as well.

temple addresses this by wrapping both parts inside an abstraction called a "Component". A Component is anything that can surface a template literal.

A Component that can be rendered as a standalone page, instead of just being part of another page, is called a Page. When a Page is rendered the data passed to the template literal will contain the Page itself as $.Page. In this way, temple codifies the data being passed in, and identifies the template literal it is passed to at the same time. A Page can serve as the interface that a template is accessed through, exposing the data it expects and the format it expects it in. A Component allows a Page to reference another template through an interface that exposes the data it expects and the format it expects it in.

Access to global state

It's a pain to try and build everything out of Components that you explicitly pass state through. Sometimes you want something like your site's name to be configurable, and you don't want to pipe that through every Component. To that end, temple defines a "Site" type. The Site will be included in the data passed to every template, as $.Site.

JavaScript and CSS stay with their Components

A Component can optionally indicate that it embeds JavaScript directly into the HTML, links to a JavaScript file loaded at runtime, embeds CSS directly into the HTML, links to a CSS file loaded at runtime, or any combination of these approaches. JavaScript and CSS can get loaded only on the pages they are needed for by tagging along with Components when the Component is rendered.

Any of these resources can also declare a relationship to another resource, controlling the order in which they get rendered to the page, allowing for fine-grained control over how resources end up being loaded in the HTML. By default, if any Component's Embedder or Linker methods return more than one resource in a single slice, those resources will be rendered in the order they appear in the slice. Explicitly declaring a relationship to any other resources disables this implicit relationship, as does setting the DisableImplicitOrdering property on the resource to true.

HTML agnostic

temple is a layer on top of html/template, but it isn't attempting to proscribe how you write your HTML. It strives to offer the least-restrictive possible interface on top of html/template; just enough to create its Components system and resource-loading system.

Resilient to errors

Every Site can fill a ServerErrorPager interface, which describes an error page to render if there's a problem rendering the page. By default, Pages are rendered into memory before being copied over the wire, to prevent half a template from being sent. To disable this default behavior, have either a Site, Page, or Component (depending on whether you want the behavior disabled globally, per-Page, or only for Pages that include the Component) implement the RenderConfigurer interface, and have it return RenderOptionDisablePageBuffering as one of the RenderOptions:

func (Site) ConfigureRender() []temple.RenderOption {
return []temple.RenderOption{
temple.RenderOptionDisablePageBuffering(true),
}
}

This will disable the buffering, allowing the HTML to be written as a stream.

Examples

See the runnable, tested examples on pkg.go.dev.

About

A framework for rendering HTML templates in Go.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

temple

temple is an HTML templating library for Go. It doesn't use its own syntax, preferring to use the standard library's html/templates. temple's purpose is to make working with the standard library's templates a little bit more manageable.

It is for people who want to render HTML from their servers like it's 2003 again.

Approach

Component-driven

Go templates come in two parts: the template literal, and the data to render that template literal with. These two parts are tied together in a fragile protocol that the compiler does not help you at all with. You need to make sure that the data to render is passed in the format the template literal expects, and that when one changes the other changes, as well.

temple addresses this by wrapping both parts inside an abstraction called a "Component". A Component is anything that can surface a template literal.

A Component that can be rendered as a standalone page, instead of just being part of another page, is called a Page. When a Page is rendered the data passed to the template literal will contain the Page itself as $.Page. In this way, temple codifies the data being passed in, and identifies the template literal it is passed to at the same time. A Page can serve as the interface that a template is accessed through, exposing the data it expects and the format it expects it in. A Component allows a Page to reference another template through an interface that exposes the data it expects and the format it expects it in.

Access to global state

It's a pain to try and build everything out of Components that you explicitly pass state through. Sometimes you want something like your site's name to be configurable, and you don't want to pipe that through every Component. To that end, temple defines a "Site" type. The Site will be included in the data passed to every template, as $.Site.

JavaScript and CSS stay with their Components

A Component can optionally indicate that it embeds JavaScript directly into the HTML, links to a JavaScript file loaded at runtime, embeds CSS directly into the HTML, links to a CSS file loaded at runtime, or any combination of these approaches. JavaScript and CSS can get loaded only on the pages they are needed for by tagging along with Components when the Component is rendered.

Any of these resources can also declare a relationship to another resource, controlling the order in which they get rendered to the page, allowing for fine-grained control over how resources end up being loaded in the HTML. By default, if any Component's Embedder or Linker methods return more than one resource in a single slice, those resources will be rendered in the order they appear in the slice. Explicitly declaring a relationship to any other resources disables this implicit relationship, as does setting the DisableImplicitOrdering property on the resource to true.

HTML agnostic

temple is a layer on top of html/template, but it isn't attempting to proscribe how you write your HTML. It strives to offer the least-restrictive possible interface on top of html/template; just enough to create its Components system and resource-loading system.

Resilient to errors

Every Site can fill a ServerErrorPager interface, which describes an error page to render if there's a problem rendering the page. By default, Pages are rendered into memory before being copied over the wire, to prevent half a template from being sent. To disable this default behavior, have either a Site, Page, or Component (depending on whether you want the behavior disabled globally, per-Page, or only for Pages that include the Component) implement the RenderConfigurer interface, and have it return RenderOptionDisablePageBuffering as one of the RenderOptions:

func (Site) ConfigureRender() []temple.RenderOption {
return []temple.RenderOption{
temple.RenderOptionDisablePageBuffering(true),
}
}

This will disable the buffering, allowing the HTML to be written as a stream.

Examples

See the runnable, tested examples on pkg.go.dev.

About

A framework for rendering HTML templates in Go.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

temple

temple is an HTML templating library for Go. It doesn't use its own syntax, preferring to use the standard library's html/templates. temple's purpose is to make working with the standard library's templates a little bit more manageable.

It is for people who want to render HTML from their servers like it's 2003 again.

Approach

Component-driven

Go templates come in two parts: the template literal, and the data to render that template literal with. These two parts are tied together in a fragile protocol that the compiler does not help you at all with. You need to make sure that the data to render is passed in the format the template literal expects, and that when one changes the other changes, as well.

temple addresses this by wrapping both parts inside an abstraction called a "Component". A Component is anything that can surface a template literal.

A Component that can be rendered as a standalone page, instead of just being part of another page, is called a Page. When a Page is rendered the data passed to the template literal will contain the Page itself as $.Page. In this way, temple codifies the data being passed in, and identifies the template literal it is passed to at the same time. A Page can serve as the interface that a template is accessed through, exposing the data it expects and the format it expects it in. A Component allows a Page to reference another template through an interface that exposes the data it expects and the format it expects it in.

Access to global state

It's a pain to try and build everything out of Components that you explicitly pass state through. Sometimes you want something like your site's name to be configurable, and you don't want to pipe that through every Component. To that end, temple defines a "Site" type. The Site will be included in the data passed to every template, as $.Site.

JavaScript and CSS stay with their Components

A Component can optionally indicate that it embeds JavaScript directly into the HTML, links to a JavaScript file loaded at runtime, embeds CSS directly into the HTML, links to a CSS file loaded at runtime, or any combination of these approaches. JavaScript and CSS can get loaded only on the pages they are needed for by tagging along with Components when the Component is rendered.

Any of these resources can also declare a relationship to another resource, controlling the order in which they get rendered to the page, allowing for fine-grained control over how resources end up being loaded in the HTML. By default, if any Component's Embedder or Linker methods return more than one resource in a single slice, those resources will be rendered in the order they appear in the slice. Explicitly declaring a relationship to any other resources disables this implicit relationship, as does setting the DisableImplicitOrdering property on the resource to true.

HTML agnostic

temple is a layer on top of html/template, but it isn't attempting to proscribe how you write your HTML. It strives to offer the least-restrictive possible interface on top of html/template; just enough to create its Components system and resource-loading system.

Resilient to errors

Every Site can fill a ServerErrorPager interface, which describes an error page to render if there's a problem rendering the page. By default, Pages are rendered into memory before being copied over the wire, to prevent half a template from being sent. To disable this default behavior, have either a Site, Page, or Component (depending on whether you want the behavior disabled globally, per-Page, or only for Pages that include the Component) implement the RenderConfigurer interface, and have it return RenderOptionDisablePageBuffering as one of the RenderOptions:

func (Site) ConfigureRender() []temple.RenderOption {
return []temple.RenderOption{
temple.RenderOptionDisablePageBuffering(true),
}
}

This will disable the buffering, allowing the HTML to be written as a stream.

Examples

See the runnable, tested examples on pkg.go.dev.

About

A framework for rendering HTML templates in Go.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

temple

temple is an HTML templating library for Go. It doesn't use its own syntax, preferring to use the standard library's html/templates. temple's purpose is to make working with the standard library's templates a little bit more manageable.

It is for people who want to render HTML from their servers like it's 2003 again.

Approach

Component-driven

Go templates come in two parts: the template literal, and the data to render that template literal with. These two parts are tied together in a fragile protocol that the compiler does not help you at all with. You need to make sure that the data to render is passed in the format the template literal expects, and that when one changes the other changes, as well.

temple addresses this by wrapping both parts inside an abstraction called a "Component". A Component is anything that can surface a template literal.

A Component that can be rendered as a standalone page, instead of just being part of another page, is called a Page. When a Page is rendered the data passed to the template literal will contain the Page itself as $.Page. In this way, temple codifies the data being passed in, and identifies the template literal it is passed to at the same time. A Page can serve as the interface that a template is accessed through, exposing the data it expects and the format it expects it in. A Component allows a Page to reference another template through an interface that exposes the data it expects and the format it expects it in.

Access to global state

It's a pain to try and build everything out of Components that you explicitly pass state through. Sometimes you want something like your site's name to be configurable, and you don't want to pipe that through every Component. To that end, temple defines a "Site" type. The Site will be included in the data passed to every template, as $.Site.

JavaScript and CSS stay with their Components

A Component can optionally indicate that it embeds JavaScript directly into the HTML, links to a JavaScript file loaded at runtime, embeds CSS directly into the HTML, links to a CSS file loaded at runtime, or any combination of these approaches. JavaScript and CSS can get loaded only on the pages they are needed for by tagging along with Components when the Component is rendered.

Any of these resources can also declare a relationship to another resource, controlling the order in which they get rendered to the page, allowing for fine-grained control over how resources end up being loaded in the HTML. By default, if any Component's Embedder or Linker methods return more than one resource in a single slice, those resources will be rendered in the order they appear in the slice. Explicitly declaring a relationship to any other resources disables this implicit relationship, as does setting the DisableImplicitOrdering property on the resource to true.

HTML agnostic

temple is a layer on top of html/template, but it isn't attempting to proscribe how you write your HTML. It strives to offer the least-restrictive possible interface on top of html/template; just enough to create its Components system and resource-loading system.

Resilient to errors

Every Site can fill a ServerErrorPager interface, which describes an error page to render if there's a problem rendering the page. By default, Pages are rendered into memory before being copied over the wire, to prevent half a template from being sent. To disable this default behavior, have either a Site, Page, or Component (depending on whether you want the behavior disabled globally, per-Page, or only for Pages that include the Component) implement the RenderConfigurer interface, and have it return RenderOptionDisablePageBuffering as one of the RenderOptions:

func (Site) ConfigureRender() []temple.RenderOption {
return []temple.RenderOption{
temple.RenderOptionDisablePageBuffering(true),
}
}

This will disable the buffering, allowing the HTML to be written as a stream.

Examples

See the runnable, tested examples on pkg.go.dev.

About

A framework for rendering HTML templates in Go.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - impractical/temple: A framework for rendering HTML templates in Go. · GitHub
Skip to content

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

temple

temple is an HTML templating library for Go. It doesn't use its own syntax, preferring to use the standard library's html/templates. temple's purpose is to make working with the standard library's templates a little bit more manageable.

It is for people who want to render HTML from their servers like it's 2003 again.

Approach

Component-driven

Go templates come in two parts: the template literal, and the data to render that template literal with. These two parts are tied together in a fragile protocol that the compiler does not help you at all with. You need to make sure that the data to render is passed in the format the template literal expects, and that when one changes the other changes, as well.

temple addresses this by wrapping both parts inside an abstraction called a "Component". A Component is anything that can surface a template literal.

A Component that can be rendered as a standalone page, instead of just being part of another page, is called a Page. When a Page is rendered the data passed to the template literal will contain the Page itself as $.Page. In this way, temple codifies the data being passed in, and identifies the template literal it is passed to at the same time. A Page can serve as the interface that a template is accessed through, exposing the data it expects and the format it expects it in. A Component allows a Page to reference another template through an interface that exposes the data it expects and the format it expects it in.

Access to global state

It's a pain to try and build everything out of Components that you explicitly pass state through. Sometimes you want something like your site's name to be configurable, and you don't want to pipe that through every Component. To that end, temple defines a "Site" type. The Site will be included in the data passed to every template, as $.Site.

JavaScript and CSS stay with their Components

A Component can optionally indicate that it embeds JavaScript directly into the HTML, links to a JavaScript file loaded at runtime, embeds CSS directly into the HTML, links to a CSS file loaded at runtime, or any combination of these approaches. JavaScript and CSS can get loaded only on the pages they are needed for by tagging along with Components when the Component is rendered.

Any of these resources can also declare a relationship to another resource, controlling the order in which they get rendered to the page, allowing for fine-grained control over how resources end up being loaded in the HTML. By default, if any Component's Embedder or Linker methods return more than one resource in a single slice, those resources will be rendered in the order they appear in the slice. Explicitly declaring a relationship to any other resources disables this implicit relationship, as does setting the DisableImplicitOrdering property on the resource to true.

HTML agnostic

temple is a layer on top of html/template, but it isn't attempting to proscribe how you write your HTML. It strives to offer the least-restrictive possible interface on top of html/template; just enough to create its Components system and resource-loading system.

Resilient to errors

Every Site can fill a ServerErrorPager interface, which describes an error page to render if there's a problem rendering the page. By default, Pages are rendered into memory before being copied over the wire, to prevent half a template from being sent. To disable this default behavior, have either a Site, Page, or Component (depending on whether you want the behavior disabled globally, per-Page, or only for Pages that include the Component) implement the RenderConfigurer interface, and have it return RenderOptionDisablePageBuffering as one of the RenderOptions:

func (Site) ConfigureRender() []temple.RenderOption {
return []temple.RenderOption{
temple.RenderOptionDisablePageBuffering(true),
}
}

This will disable the buffering, allowing the HTML to be written as a stream.

Examples

See the runnable, tested examples on pkg.go.dev.

About

A framework for rendering HTML templates in Go.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - impractical/temple: A framework for rendering HTML templates in Go. · GitHub
Skip to content

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

temple

temple is an HTML templating library for Go. It doesn't use its own syntax, preferring to use the standard library's html/templates. temple's purpose is to make working with the standard library's templates a little bit more manageable.

It is for people who want to render HTML from their servers like it's 2003 again.

Approach

Component-driven

Go templates come in two parts: the template literal, and the data to render that template literal with. These two parts are tied together in a fragile protocol that the compiler does not help you at all with. You need to make sure that the data to render is passed in the format the template literal expects, and that when one changes the other changes, as well.

temple addresses this by wrapping both parts inside an abstraction called a "Component". A Component is anything that can surface a template literal.

A Component that can be rendered as a standalone page, instead of just being part of another page, is called a Page. When a Page is rendered the data passed to the template literal will contain the Page itself as $.Page. In this way, temple codifies the data being passed in, and identifies the template literal it is passed to at the same time. A Page can serve as the interface that a template is accessed through, exposing the data it expects and the format it expects it in. A Component allows a Page to reference another template through an interface that exposes the data it expects and the format it expects it in.

Access to global state

It's a pain to try and build everything out of Components that you explicitly pass state through. Sometimes you want something like your site's name to be configurable, and you don't want to pipe that through every Component. To that end, temple defines a "Site" type. The Site will be included in the data passed to every template, as $.Site.

JavaScript and CSS stay with their Components

A Component can optionally indicate that it embeds JavaScript directly into the HTML, links to a JavaScript file loaded at runtime, embeds CSS directly into the HTML, links to a CSS file loaded at runtime, or any combination of these approaches. JavaScript and CSS can get loaded only on the pages they are needed for by tagging along with Components when the Component is rendered.

Any of these resources can also declare a relationship to another resource, controlling the order in which they get rendered to the page, allowing for fine-grained control over how resources end up being loaded in the HTML. By default, if any Component's Embedder or Linker methods return more than one resource in a single slice, those resources will be rendered in the order they appear in the slice. Explicitly declaring a relationship to any other resources disables this implicit relationship, as does setting the DisableImplicitOrdering property on the resource to true.

HTML agnostic

temple is a layer on top of html/template, but it isn't attempting to proscribe how you write your HTML. It strives to offer the least-restrictive possible interface on top of html/template; just enough to create its Components system and resource-loading system.

Resilient to errors

Every Site can fill a ServerErrorPager interface, which describes an error page to render if there's a problem rendering the page. By default, Pages are rendered into memory before being copied over the wire, to prevent half a template from being sent. To disable this default behavior, have either a Site, Page, or Component (depending on whether you want the behavior disabled globally, per-Page, or only for Pages that include the Component) implement the RenderConfigurer interface, and have it return RenderOptionDisablePageBuffering as one of the RenderOptions:

func (Site) ConfigureRender() []temple.RenderOption {
return []temple.RenderOption{
temple.RenderOptionDisablePageBuffering(true),
}
}

This will disable the buffering, allowing the HTML to be written as a stream.

Examples

See the runnable, tested examples on pkg.go.dev.

About

A framework for rendering HTML templates in Go.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

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

Latest commit

History

40 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

temple

temple is an HTML templating library for Go. It doesn't use its own syntax, preferring to use the standard library's html/templates. temple's purpose is to make working with the standard library's templates a little bit more manageable.

It is for people who want to render HTML from their servers like it's 2003 again.

Approach

Component-driven

Go templates come in two parts: the template literal, and the data to render that template literal with. These two parts are tied together in a fragile protocol that the compiler does not help you at all with. You need to make sure that the data to render is passed in the format the template literal expects, and that when one changes the other changes, as well.

temple addresses this by wrapping both parts inside an abstraction called a "Component". A Component is anything that can surface a template literal.

A Component that can be rendered as a standalone page, instead of just being part of another page, is called a Page. When a Page is rendered the data passed to the template literal will contain the Page itself as $.Page. In this way, temple codifies the data being passed in, and identifies the template literal it is passed to at the same time. A Page can serve as the interface that a template is accessed through, exposing the data it expects and the format it expects it in. A Component allows a Page to reference another template through an interface that exposes the data it expects and the format it expects it in.

Access to global state

It's a pain to try and build everything out of Components that you explicitly pass state through. Sometimes you want something like your site's name to be configurable, and you don't want to pipe that through every Component. To that end, temple defines a "Site" type. The Site will be included in the data passed to every template, as $.Site.

JavaScript and CSS stay with their Components

A Component can optionally indicate that it embeds JavaScript directly into the HTML, links to a JavaScript file loaded at runtime, embeds CSS directly into the HTML, links to a CSS file loaded at runtime, or any combination of these approaches. JavaScript and CSS can get loaded only on the pages they are needed for by tagging along with Components when the Component is rendered.

Any of these resources can also declare a relationship to another resource, controlling the order in which they get rendered to the page, allowing for fine-grained control over how resources end up being loaded in the HTML. By default, if any Component's Embedder or Linker methods return more than one resource in a single slice, those resources will be rendered in the order they appear in the slice. Explicitly declaring a relationship to any other resources disables this implicit relationship, as does setting the DisableImplicitOrdering property on the resource to true.

HTML agnostic

temple is a layer on top of html/template, but it isn't attempting to proscribe how you write your HTML. It strives to offer the least-restrictive possible interface on top of html/template; just enough to create its Components system and resource-loading system.

Resilient to errors

Every Site can fill a ServerErrorPager interface, which describes an error page to render if there's a problem rendering the page. By default, Pages are rendered into memory before being copied over the wire, to prevent half a template from being sent. To disable this default behavior, have either a Site, Page, or Component (depending on whether you want the behavior disabled globally, per-Page, or only for Pages that include the Component) implement the RenderConfigurer interface, and have it return RenderOptionDisablePageBuffering as one of the RenderOptions:

func (Site) ConfigureRender() []temple.RenderOption {
return []temple.RenderOption{
temple.RenderOptionDisablePageBuffering(true),
}
}

This will disable the buffering, allowing the HTML to be written as a stream.

Examples

See the runnable, tested examples on pkg.go.dev.

About

A framework for rendering HTML templates in Go.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages