Careful attention to entities and quoting
authorNick Downing <nick@ndcode.org>
Mon, 19 Nov 2018 05:23:48 +0000 (16:23 +1100)
committerNick Downing <nick@ndcode.org>
Mon, 19 Nov 2018 05:23:48 +0000 (16:23 +1100)
jstize.js
package.json

index 923518f..c73127b 100644 (file)
--- a/jstize.js
+++ b/jstize.js
@@ -1,9 +1,12 @@
 let CleanCSS = require('@ndcode/clean-css')
 let assert = require('assert')
+let html_entities = require('html-entities')
 let html_minifier = require('@ndcode/html-minifier')
+let node_stringify = require('node-stringify')
 let uglify_es = require('uglify-es')
 
 let clean_css = new CleanCSS({format: 'beautify'})
+let xml_entities = new html_entities.XmlEntities()
 
 let jstize = (text, options) => {
   options = Object.assign(
@@ -32,22 +35,23 @@ let jstize = (text, options) => {
           let suffix = ''
           for (let i = 0; i < attrs.length; ++i) {
             if (attrs[i].name == 'class') {
-              let fields = attrs[i].value.split(' ')
+              let fields = xml_entities.decode(attrs[i].value).split(' ')
               for (let j = 0; j < fields.length; ++j)
                 out = out.replace(
                   /([.#])([^.#]*-[0-9]*)$/,
-                  (match, sep, name) => `${sep}'${name}'`
+                  (match, sep, name) => sep + node_stringify(name)
                 ) + '.' + fields[j]
             }
             else if (attrs[i].name == 'id') {
-              let fields = attrs[i].value.split(' ')
+              let fields = xml_entities.decode(attrs[i].value).split(' ')
               for (let j = 0; j < fields.length; ++j)
                 out += '#' + fields[j]
             }
             else {
               out1 += prefix + attrs[i].name
               if (attrs[i].value !== undefined)
-                out1 += `="${attrs[i].value}"`
+                out1 +=
+                  '=' + JSON.stringify(xml_entities.decode(attrs[i].value))
               prefix = ' '
               suffix = ')'
             }
@@ -55,11 +59,8 @@ let jstize = (text, options) => {
           buffer.push(
             ' '.repeat(indent) +
             out.replace(
-              /([.#])style$/,
-              (match, sep) => `${sep}'style'`
-            ).replace(
-              /([.#])([^.#]*-style)$/,
-              (match, sep, name) => `${sep}'${name}'`
+              /([.#])(([^.#]*-)?style)$/,
+              (match, sep, name) => sep + node_stringify(name)
             ) +
             out1 +
             suffix +
@@ -90,6 +91,7 @@ let jstize = (text, options) => {
               text,
               {
                 compress: false,
+                mangle: false,
                 output: {
                   beautify: true,
                   indent_level: options.indent,
@@ -116,7 +118,7 @@ let jstize = (text, options) => {
           }
           else
             //buffer.push(text)
-            out = [`'${text}'`]
+            out = [node_stringify(xml_entities.decode(text))]
           for (let i = 0; i < out.length; ++i)
             buffer.push(' '.repeat(indent) + out[i] + '\n')
         },
index 2f9bb06..6f5bbe1 100644 (file)
@@ -26,6 +26,8 @@
     "@ndcode/html-minifier": "^3.5.21",
     "assert": "^1.4.1",
     "fs": "^0.0.1-security",
+    "html-entities": "^1.2.1",
+    "node-stringify": "^0.2.1",
     "uglify-es": "^3.3.9"
   },
   "devDependencies": {},