Provide get_svg_min() similar to get_js_min() and friends, using svgo package
authorNick Downing <nick@ndcode.org>
Sun, 18 Nov 2018 00:16:50 +0000 (11:16 +1100)
committerNick Downing <nick@ndcode.org>
Sun, 18 Nov 2018 00:16:50 +0000 (11:16 +1100)
Server.js
SiteRoot.js
package.json

index 086d726..3fcb4eb 100644 (file)
--- a/Server.js
+++ b/Server.js
@@ -2,6 +2,7 @@ let BuildCache = require('@ndcode/build_cache')
 let CleanCSS = require('@ndcode/clean-css')
 let JSONCache = require('@ndcode/json_cache')
 let Site = require('./Site')
+let SVGO = require('svgo')
 let assert = require('assert')
 let disk_build = require('@ndcode/disk_build')
 let emailjs = require('emailjs')
@@ -21,6 +22,46 @@ let fs_readFile = util.promisify(fs.readFile)
 let fs_writeFile = util.promisify(fs.writeFile)
 let yauzl_open = util.promisify(yauzl.open)
 let clean_css = new CleanCSS({returnPromise: true})
+let svgo = new SVGO(
+  {
+    plugins: [
+      {cleanupAttrs: true},
+      {removeDoctype: true},
+      {removeXMLProcInst: true},
+      {removeComments: true},
+      {removeMetadata: true},
+      {removeTitle: true},
+      {removeDesc: true},
+      {removeUselessDefs: true},
+      {removeEditorsNSData: true},
+      {removeEmptyAttrs: true},
+      {removeHiddenElems: true},
+      {removeEmptyText: true},
+      {removeEmptyContainers: true},
+      {removeViewBox: false},
+      {cleanupEnableBackground: true},
+      {convertStyleToAttrs: true},
+      {convertColors: true},
+      {convertPathData: true},
+      {convertTransform: true},
+      {removeUnknownsAndDefaults: true},
+      {removeNonInheritableGroupAttrs: true},
+      {removeUselessStrokeAndFill: true},
+      {removeUnusedNS: true},
+      {cleanupIDs: true},
+      {cleanupNumericValues: true},
+      {moveElemsAttrsToGroup: true},
+      {moveGroupAttrsToElems: true},
+      {collapseGroups: true},
+      {removeRasterImages: false},
+      {mergePaths: true},
+      {convertShapeToPath: true},
+      {sortAttrs: true},
+      {removeDimensions: true}//,
+      //{removeAttrs: {attrs: '(stroke|fill)'}}
+    ]
+  }
+)
 
 let Server = function() {
   if (!this instanceof Server)
@@ -35,6 +76,7 @@ let Server = function() {
   this.build_cache_css_less = new BuildCache()
   this.build_cache_css_min = new BuildCache()
   this.build_cache_js_min = new BuildCache()
+  this.build_cache_svg_min = new BuildCache()
   this.build_cache_text = new BuildCache()
   this.build_cache_zet = new BuildCache()
   this.build_cache_zip = new BuildCache()
@@ -266,6 +308,30 @@ Server.prototype.get_js_min = function(pathname) {
   )
 }
 
+Server.prototype.get_svg_min = function(pathname) {
+  return /*await*/ this.build_cache_svg_min.get(
+    pathname,
+    async result => {
+      result.value = fs_readFile(
+        await disk_build(
+          pathname,
+          async built_pathname => {
+            console.log('getting', pathname, 'as svg_min')
+            let text = await fs_readFile(pathname, {encoding: 'utf-8'})
+            console.log('building', built_pathname)
+            let render = await svgo.optimize(text, {path: pathname})
+            return /*await*/ fs_writeFile(
+              built_pathname,
+              render.data,
+              {encoding: 'utf-8'}
+            )
+          }
+        )
+      )
+    }
+  )
+}
+
 Server.prototype.get_text = function(pathname) {
   return /*await*/ this.build_cache_text.get(
     pathname,
index 840d19e..c7657b6 100644 (file)
@@ -33,6 +33,9 @@ SiteRoot.prototype.get_css_min = function(pathname) {
 SiteRoot.prototype.get_js_min = function(pathname) {
   return /*await*/ this.server.get_js_min(this.root + pathname)
 }
+SiteRoot.prototype.get_svg_min = function(pathname) {
+  return /*await*/ this.server.get_svg_min(this.root + pathname)
+}
 SiteRoot.prototype.get_text = function(pathname) {
   return /*await*/ this.server.get_text(this.root + pathname)
 }
index 5ca92fa..9e22a2a 100644 (file)
@@ -21,6 +21,7 @@
     "querystring": "^0.2.0",
     "socket.io": "^2.1.1",
     "stream-buffers": "^3.0.2",
+    "svgo": "^1.1.1",
     "uglify-es": "^3.3.9",
     "url": "^0.11.0",
     "xdate": "^0.8.2",