htsl-string-pragmatics
Version:
String output engine for htsl-lexicon
1 lines • 14.7 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../node_modules/to-no-case/index.js","../../node_modules/to-space-case/index.js","../../node_modules/to-slug-case/index.js","../../../nomocas-utils/lib/string/html-special-chars.js","../../src/index.js"],"sourcesContent":["\n/**\n * Export.\n */\n\nmodule.exports = toNoCase\n\n/**\n * Test whether a string is camel-case.\n */\n\nvar hasSpace = /\\s/\nvar hasSeparator = /(_|-|\\.|:)/\nvar hasCamel = /([a-z][A-Z]|[A-Z][a-z])/\n\n/**\n * Remove any starting case from a `string`, like camel or snake, but keep\n * spaces and punctuation that may be important otherwise.\n *\n * @param {String} string\n * @return {String}\n */\n\nfunction toNoCase(string) {\n if (hasSpace.test(string)) return string.toLowerCase()\n if (hasSeparator.test(string)) return (unseparate(string) || string).toLowerCase()\n if (hasCamel.test(string)) return uncamelize(string).toLowerCase()\n return string.toLowerCase()\n}\n\n/**\n * Separator splitter.\n */\n\nvar separatorSplitter = /[\\W_]+(.|$)/g\n\n/**\n * Un-separate a `string`.\n *\n * @param {String} string\n * @return {String}\n */\n\nfunction unseparate(string) {\n return string.replace(separatorSplitter, function (m, next) {\n return next ? ' ' + next : ''\n })\n}\n\n/**\n * Camelcase splitter.\n */\n\nvar camelSplitter = /(.)([A-Z]+)/g\n\n/**\n * Un-camelcase a `string`.\n *\n * @param {String} string\n * @return {String}\n */\n\nfunction uncamelize(string) {\n return string.replace(camelSplitter, function (m, previous, uppers) {\n return previous + ' ' + uppers.toLowerCase().split('').join(' ')\n })\n}\n","\nvar clean = require('to-no-case')\n\n/**\n * Export.\n */\n\nmodule.exports = toSpaceCase\n\n/**\n * Convert a `string` to space case.\n *\n * @param {String} string\n * @return {String}\n */\n\nfunction toSpaceCase(string) {\n return clean(string).replace(/[\\W_]+(.|$)/g, function (matches, match) {\n return match ? ' ' + match : ''\n }).trim()\n}\n","\nvar toSpace = require('to-space-case')\n\n/**\n * Export.\n */\n\nmodule.exports = toSlugCase\n\n/**\n * Convert a `string` to slug case.\n *\n * @param {String} string\n * @return {String}\n */\n\nfunction toSlugCase(string) {\n return toSpace(string).replace(/\\s/g, '-')\n}\n","/**\n * Encode and decode html special chars : aka (&,<,>,\\\",') from/to (&,<,...)\n *\n * Useful for html string output.\n */\n\nvar mapEncode = {\n\t\t\"&\": \"&\",\n\t\t\"<\": \"<\",\n\t\t\">\": \">\",\n\t\t\"\\\"\": \""\",\n\t\t\"'\": \"'\" // ' -> ' for XML only\n\t},\n\tmapDecode = {\n\t\t\"&\": \"&\",\n\t\t\"<\": \"<\",\n\t\t\">\": \">\",\n\t\t\""\": \"\\\"\",\n\t\t\"'\": \"'\"\n\t};\n\nmodule.exports = {\n\tencode: function(str) {\n\t\treturn str.replace(/[&<>\"']/g, function(m) {\n\t\t\treturn mapEncode[m];\n\t\t});\n\t},\n\tdecode: function(str) {\n\t\treturn str.replace(/(&|<|>|"|')/g, function(m) {\n\t\t\treturn mapDecode[m];\n\t\t});\n\t}\n}","/**\n ************* HTML-to-String Actions ***********\n *\n * @author Gilles Coomans\n * @licence MIT\n * @copyright 2016-2017 Gilles Coomans\n */\n\nimport babelute from 'babelute';\nimport htmlLexicon from 'htsl-lexicon'; // external\nimport toSlugCase from 'to-slug-case'; // for data-* attributes\nimport htmlSpecialChars from 'nomocas-utils/lib/string/html-special-chars'; // for safe string output\n\nconst $baseOutput = babelute.FacadePragmatics.prototype.$output;\n\n/**\n * html-to-string pragmatics\n * @type {FacadePragmatics}\n * @public\n * @example\n * import stringPragmas from 'htsl/src/html-to-string.js';\n * import htmlLexicon from 'htsl/src/html-lexicon.js';\n *\n * const h = htmlLexicon.initializer;\n * const sentence = h.div(state.intro).section(h.class('my-section').h1(state.title));\n * \n * var stringOutput = stringPragmas.$output(null, sentence);\n */\nconst stringPragmas = babelute.createFacadePragmatics({\n\thtml: true\n}, {\n\t// we only need logical atoms definitions. (without user interactions. aka click etc.)\n\ttag(tag, args /* tagName, babelutes */ , component) {\n\t\tconst child = new TagDescriptor(),\n\t\t\tbabelutes = args[1];\n\t\tlet templ;\n\t\tif (babelutes)\n\t\t\tfor (let i = 0, len = babelutes.length; i < len; ++i) {\n\t\t\t\ttempl = babelutes[i];\n\t\t\t\tif (typeof templ === 'undefined')\n\t\t\t\t\tcontinue;\n\t\t\t\tif (templ && templ.__babelute__)\n\t\t\t\t\tthis.$output(child, templ, component);\n\t\t\t\telse if (typeof templ === 'string')\n\t\t\t\t\tchild.children += htmlSpecialChars.encode(templ); //.replace(/</g, '<').replace(/>/g, '>');\n\t\t\t\telse\n\t\t\t\t\tchild.children += templ;\n\t\t\t}\n\t\ttagOutput(tag, child, args[0]);\n\t},\n\n\ttext(tag, args /* value */ ) {\n\t\ttag.children += htmlSpecialChars.encode(args[0]);\n\t},\n\n\tclass(tag, args /* className */ ) {\n\t\tif (args[0] && (args.length === 1 || args[1]))\n\t\t\ttag.classes += (tag.classes ? ' ' : '') + args[0];\n\t},\n\n\tclasses(tag, args /* className */ ) {\n\t\ttag.classes += (tag.classes ? ' ' : '') + args[0];\n\t},\n\n\tstyle(tag, args /* name, value */ ) {\n\t\ttag.style += args[0] + ':' + args[1] + ';';\n\t},\n\n\tprop(tag, args) {\n\t\tswitch (args[0]) {\n\t\t\tcase 'innerText':\n\t\t\tcase 'innerHTML':\n\t\t\t\ttag.attributes = args[1];\n\t\t\t\tbreak;\n\t\t\tcase 'value':\n\t\t\t\ttag.attributes += ' ' + writeAttribute('value', args[1]);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (args[1])\n\t\t\t\t\ttag.attributes += ' ' + args[0];\n\t\t}\n\t},\n\n\tdata(tag, args) {\n\t\tconst name = 'data-' + toSlugCase(args[0]),\n\t\t\tvalue = args[1],\n\t\t\thasValue = typeof value !== 'undefined';\n\t\ttag.attributes += ' ' + name + (hasValue ? ('=\"' + value + '\"') : '');\n\t},\n\n\tattr(tag, args /* name, value */ ) {\n\t\t// tag.attributes += ' ' + args[0] + '=\"' + (typeof value === 'string' ? encodeHtmlSpecialChars(value) : value) + '\"';\n\t\ttag.attributes += ' ' + writeAttribute(args[0], args[1]);\n\t},\n\n\tid(tag, args /* value */ ) {\n\t\ttag.attributes = ' id=\"' + args[0] + '\"' + tag.attributes;\n\t},\n\n\thtml(tag, args) {\n\t\ttag.children += args[0]; // TODO : should be sanitize\n\t},\n\n\tonString(tag, args /* render */ , component) {\n\t\tconst onRender = args[0];\n\t\tif (onRender)\n\t\t\tonRender(tag, component);\n\t},\n\n\tref(tag, args, component) {\n\t\tcomponent[args[0]] = tag;\n\t},\n\n\tcomponent(descriptor, args, parent) {\n\t\tconst Class = args[0],\n\t\t\tprops = args[1],\n\t\t\tinstance = new Class(props, parent);\n\t\tthis.$output(descriptor, instance.render(false), instance);\n\t},\n\n\tpostalComponent() {\n\t\t// nothing to do\n\t},\n\n\tcontainer(descriptor, args, parent) {\n\t\tthis.$output(descriptor, args[0]({ unmount() {} }), parent);\n\t},\n\tswitchUse(descriptor, args, parent) {\n\t\tconst b = new babelute.Babelute()._use(args[0], ...(args[1]));\n\t\tthis.$output(descriptor, b, parent);\n\t},\n\n\t$output(tag, babelute, component) {\n\t\treturn $baseOutput.call(this, tag || new TagDescriptor(), babelute, component).children;\n\t}\n});\n\n// for tags string construction\nclass TagDescriptor {\n\tconstructor() {\n\t\tthis.children = '';\n\t\tthis.classes = '';\n\t\tthis.style = '';\n\t\tthis.attributes = '';\n\t}\n}\n\nconst selfClosingTags = /^(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)/;\n\n// TagDescriptor-to-string output\nfunction tagOutput(parent, tag, name) {\n\tlet out = '<' + name + tag.attributes;\n\tif (tag.style)\n\t\tout += ' style=\"' + tag.style + '\"';\n\tif (tag.classes)\n\t\tout += ' class=\"' + tag.classes + '\"';\n\tif (tag.children)\n\t\tparent.children += out + '>' + tag.children + '</' + name + '>';\n\telse if (selfClosingTags.test(name))\n\t\tparent.children += out + '/>';\n\telse\n\t\tparent.children += out + '></' + name + '>';\n}\n\nfunction writeAttribute(name, value) {\n\treturn name + '=\"' + (typeof value === 'string' ? value.replace(/\"/g, '\\\\\"')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>') : value) + '\"';\n}\n\nhtmlLexicon.addAliases({\n\t$toHTMLString(domElement) {\n\t\treturn stringPragmas.$output(domElement, this);\n\t}\n});\n\nexport default stringPragmas;\n\n"],"names":["module","toNoCase","hasSpace","hasSeparator","hasCamel","string","test","toLowerCase","unseparate","uncamelize","separatorSplitter","replace","m","next","camelSplitter","previous","uppers","split","join","toSpaceCase","clean","matches","match","trim","toSlugCase","toSpace","mapEncode","mapDecode","str","$baseOutput","babelute","FacadePragmatics","prototype","$output","stringPragmas","createFacadePragmatics","tag","args","component","child","TagDescriptor","babelutes","templ","i","len","length","__babelute__","children","htmlSpecialChars","encode","classes","style","attributes","writeAttribute","name","value","hasValue","onRender","descriptor","parent","Class","props","instance","render","b","Babelute","_use","call","selfClosingTags","tagOutput","out","htmlLexicon","addAliases","domElement"],"mappings":"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"}