2025 July 19
Resources for my next blog to replace the hugo blog.
A week after I started this project in earnest came the falderol via Dorian Taylor on bluesky that XSLT will be scheduled for removal from Chrome by 2027.
2025 July 19
Resources for my next blog to replace the hugo blog.
A week after I started this project in earnest came the falderol via Dorian Taylor on bluesky that XSLT will be scheduled for removal from Chrome by 2027.
| // Based on this blog post: https://medium.com/@iquardt/taming-the-dom-50c8f1a6e892 | |
| /* RULES | |
| * Only the program may manipulate the output display, never the user | |
| * User input is presented in the form of events | |
| * GUI elements generate events only in response to user input, never in response to program output | |
| */ |
| function i18n(template) { | |
| for (var | |
| info = i18n.db[i18n.locale][template.join('\x01')], | |
| out = [info.t[0]], | |
| i = 1, length = info.t.length; i < length; i++ | |
| ) out[i] = arguments[1 + info.v[i - 1]] + info.t[i]; | |
| return out.join(''); | |
| } | |
| i18n.locale = 'en'; | |
| i18n.db = {}; |
| import React from 'react'; | |
| import renderer from 'react-test-renderer'; | |
| //children mock need to be defined before parent module import | |
| jest.mock('react-bootstrap-table', () => { | |
| return { | |
| BootstrapTable: 'BootstrapTable', | |
| TableHeaderColumn: 'TableHeaderColumn', | |
| }; | |
| }); |
| /*! (c) 2016 Andrea Giammarchi - MIT Style License */ | |
| // simple state-like objects handler | |
| // based on prototypal inheritance | |
| function State() {'use strict';} | |
| // States are serializable dictionaries | |
| // toJSON and toString are the only reserved keywords | |
| // every other name can be used as name (included __proto__) |
| // Most components are defined fully by their render function, | |
| // and all they need to access is the props | |
| var myComponent = createComponent(function (props) { | |
| return React.DOM.h1({}, "Hello " + props.name); | |
| }); | |
| // ...which can be done very succinctly with ES6: | |
| const {h1, div} = React.DOM; | |
| const myComponent = createComponent(({name}) => h1({}, `Hello ${name}`)); |
| var path = require('path'); | |
| var fs = require('fs'); | |
| var cheerio = require('cheerio'); | |
| var createTemplate = function(id, markup) { | |
| var $ = cheerio.load('<script type="text/ng-template"></script>'); | |
| $('script').attr('id', id).html(markup).html(); | |
| return $.html(); | |
| }; |
update
I've created a little repository that simply exposes the final utility as npm module.
It's called html-escaper
there is basically one rule only: do not ever replace one char after another if you are transforming a string into another.
| var Promise = global.Promise || require('lie'); | |
| function noop(){} | |
| function typeIsObject(x) { | |
| return (typeof x === 'object' && x !== null) || typeof x === 'function'; | |
| } | |
| function ExclusiveStreamReader () { | |
| throw new Error('not implimented'); | |
| } | |
| function ReadableStream(opts) { | |
| var start = opts.start || noop; |
| function toJSON(node) { | |
| let propFix = { for: 'htmlFor', class: 'className' }; | |
| let specialGetters = { | |
| style: (node) => node.style.cssText, | |
| }; | |
| let attrDefaultValues = { style: '' }; | |
| let obj = { | |
| nodeType: node.nodeType, | |
| }; | |
| if (node.tagName) { |