postcss-svg
Version:
Inline SVGs in CSS. Supports SVG Fragments, SVG Parameters.
1 lines • 28.9 kB
Source Map (JSON)
{"version":3,"file":"index.js","sources":["src/lib/element-clone.js","src/lib/element-by-id.js","src/lib/element-as-data-uri-svg.js","src/lib/read-closest-svg.js","src/lib/transpile-styles.js","src/lib/transpile-decl.js","src/index.js"],"sourcesContent":["/* Clone from element\n/* ========================================================================== */\n\nexport default function elementClone(element) {\n\t// element clone\n\tconst clone = {};\n\n\t// for each key in the element\n\tfor (let key in element) {\n\t\tif (element[key] instanceof Array) {\n\t\t\t// conditionally clone the child array\n\t\t\tclone[key] = element[key].map(elementClone);\n\t\t} else if (typeof element[key] === 'object') {\n\t\t\t// otherwise, conditionally clone the child object\n\t\t\tclone[key] = elementClone(element[key]);\n\t\t} else {\n\t\t\t// otherwise, copy the child\n\t\t\tclone[key] = element[key];\n\t\t}\n\t}\n\n\t// return the element clone\n\treturn clone;\n}\n","/* Element by ID\n/* ========================================================================== */\n\nexport default function elementById(element, id) {\n\t// conditionally return the matching element\n\tif (element.attr && element.attr.id === id) {\n\t\treturn element;\n\t} else if (element.children) {\n\t\t// otherwise, return matching child elements\n\t\tlet index = -1;\n\t\tlet child;\n\n\t\twhile (child = element.children[++index]) {\n\t\t\tchild = elementById(child, id);\n\n\t\t\tif (child) {\n\t\t\t\treturn child;\n\t\t\t}\n\t\t}\n\t}\n\n\t// return undefined if no matching elements are find\n\treturn undefined;\n}\n","/* Tooling\n/* ========================================================================== */\n\n// external tooling\nimport Svgo from 'svgo';\n\n/* Element as a data URI SVG\n/* ========================================================================== */\n\nexport default function elementAsDataURISvg(element, document, opts) {\n\t// rebuild element as <svg>\n\telement.name = 'svg';\n\n\tdelete element.attr.id;\n\n\telement.attr.viewBox = element.attr.viewBox || document.attr.viewBox;\n\n\telement.attr.xmlns = 'http://www.w3.org/2000/svg';\n\n\tconst xml = element.toString({\n\t\tcompressed: true\n\t});\n\n\t// promise data URI\n\treturn (opts.svgo\n\t\t? new Svgo(opts.svgo).optimize(xml)\n\t: Promise.resolve({ data: xml }))\n\t.then(result => `data:image/svg+xml;${opts.utf8 ? `charset=utf-8,${encodeUTF8(result.data)}` : `base64,${Buffer.from(result.data).toString('base64')}`}`);\n}\n\n/* Inline Tooling\n/* ========================================================================== */\n\n// return a UTF-8-encoded string\nfunction encodeUTF8(string) {\n\t// encode as UTF-8\n\treturn encodeURIComponent(\n\t\tstring.replace(\n\t\t\t// collapse whitespace\n\t\t\t/[\\n\\r\\s\\t]+/g, ' '\n\t\t).replace(\n\t\t\t// remove comments\n\t\t\t/<\\!--([\\W\\w]*(?=-->))-->/g, ''\n\t\t).replace(\n\t\t\t// pre-encode ampersands\n\t\t\t/&/g, '%26'\n\t\t)\n\t).replace(\n\t\t// escape commas\n\t\t/'/g, '\\\\\\''\n\t).replace(\n\t\t// un-encode compatible characters\n\t\t/%20/g, ' '\n\t).replace(\n\t\t/%22/g, '\\''\n\t).replace(\n\t\t/%2F/g, '/'\n\t).replace(\n\t\t/%3A/g, ':'\n\t).replace(\n\t\t/%3D/g, '='\n\t).replace(\n\t\t// encode additional incompatible characters\n\t\t/\\(/g, '%28'\n\t).replace(\n\t\t/\\)/g, '%29'\n\t);\n}\n","/* Tooling\n/* ========================================================================== */\n\n// native tooling\nimport fs from 'fs';\nimport path from 'path';\n\n// external tooling\nimport { XmlDocument } from 'xmldoc';\n\n/* Promise the XML tree of the closest svg\n/* ========================================================================== */\n\nexport default function readClosestSVG(id, wds, cache) {\n\treturn wds.reduce(\n\t\t// for each working directory\n\t\t(promise, wd) => promise.catch(() => {\n\t\t\t// set cwd as the current working directory\n\t\t\tlet cwd = wd;\n\n\t\t\t// if id starts with root\n\t\t\tif (starts_with_root(id)) {\n\t\t\t\t// set cwd as the root\n\t\t\t\tcwd = '';\n\t\t\t}\n\n\t\t\t// resolve as a file using cwd/id as file\n\t\t\treturn resolveAsFile(path.join(cwd, id), cache)\n\t\t\t// otherwise, resolve as a directory using cwd/id as dir\n\t\t\t.catch(() => resolve_as_directory(path.join(cwd, id), cache))\n\t\t\t// otherwise, if id does not start with root or relative\n\t\t\t.catch(() => !starts_with_root_or_relative(id)\n\t\t\t\t// resolve as a module using cwd and id\n\t\t\t\t? resolve_as_module(cwd, id, cache)\n\t\t\t\t: Promise.reject()\n\t\t\t)\n\t\t\t// otherwise, reject as id not found\n\t\t\t.catch(() => Promise.reject(`${id} not found`));\n\t\t}),\n\t\tPromise.reject()\n\t).then(\n\t\t// resolve xml contents\n\t\t(result) => ({\n\t\t\tfile: result.file,\n\t\t\tdocument: new XmlDocument(result.contents)\n\t\t})\n\t);\n}\n\nfunction resolveAsFile(file, cache) {\n\t// if file is a file, resolve the contents of file\n\treturn file_contents(file, cache)\n\t// otherwise, if file.svg is a file, resolve the contents of file.svg\n\t.catch(() => file_contents(`${file}.svg`, cache));\n}\n\nfunction resolve_as_directory(dir, cache) {\n\t// if dir/package.json is a file, set pkg as the JSON contents of dir/package.json\n\treturn json_contents(dir, cache).then(\n\t\t// if pkg contains a media field\n\t\tpkg => 'media' in pkg\n\t\t\t// resolve the contents of dir/pkg.media\n\t\t\t? file_contents(path.join(dir, pkg.media), cache)\n\t\t// otherwise, if pkg contains a main field\n\t\t: 'main' in pkg\n\t\t\t// resolve the contents of dir/pkg.main\n\t\t\t? file_contents(path.join(dir, pkg.main), cache)\n\t\t// otherwise, if dir/index.svg is a file, resolve the contents of dir/index.svg\n\t\t: file_contents(path.join(dir, 'index.svg'), cache)\n\t);\n}\n\nfunction resolve_as_module(cwd, id, cache) {\n\treturn node_modules_dirs(cwd).reduce(\n\t\t// for each dir in module dirs using cwd:\n\t\t(promise, dir) => promise.catch(\n\t\t\t// resolve as a file using dir/id as file\n\t\t\t() => resolveAsFile(path.join(dir, id), cache)\n\t\t\t\t// otherwise, resolve as a directory using dir/id as dir\n\t\t\t\t.catch(() => resolve_as_directory(path.join(dir, id), cache))\n\t\t),\n\t\tPromise.reject()\n\t);\n}\n\nfunction node_modules_dirs(cwd) {\n\t// set segments as cwd split by the separator\n\tconst segments = cwd.split(path.sep);\n\n\t// set count as the length of segments\n\tlet count = segments.length;\n\n\t// set dirs as an empty array\n\tconst dirs = [];\n\n\t// while count is greater than 0:\n\twhile (count > 0) {\n\t\t// if segments[count] is not node_modules\n\t\tif (segments[count] !== 'node_modules') {\n\t\t\t// push a new item to dirs as the separator-joined segments[0 - count] and node_modules\n\t\t\tdirs.push(\n\t\t\t\tpath.join(segments.slice(0, count).join('/') || '/', 'node_modules')\n\t\t\t);\n\t\t}\n\n\t\t// set count as count minus 1\n\t\t--count;\n\t}\n\n\treturn dirs;\n}\n\nfunction file_contents(file, cache) {\n\t// if file is a file, resolve the contents of file\n\tcache[file] = cache[file] || new Promise(\n\t\t(resolvePromise, rejectPromise) => fs.readFile(\n\t\t\tfile,\n\t\t\t'utf8',\n\t\t\t(error, contents) => error ? rejectPromise(error) : resolvePromise({\n\t\t\t\tfile,\n\t\t\t\tcontents\n\t\t\t})\n\t\t)\n\t);\n\n\treturn cache[file];\n}\n\nfunction json_contents(dir, cache) {\n\t// path of dir/package.json\n\tconst pkg = path.join(dir, 'package.json');\n\n\t// resolve the JSON contents of dir/package.json\n\tcache[pkg] = cache[pkg] || new Promise(\n\t\t(resolvePromise, rejectPromise) => fs.readFile(\n\t\t\tpkg,\n\t\t\t'utf8',\n\t\t\t(error, contents) => error ? rejectPromise(error) : resolvePromise(JSON.parse(contents))\n\t\t)\n\t);\n\n\treturn cache[pkg];\n}\n\nfunction starts_with_root(id) {\n\treturn /^\\//.test(id);\n}\n\nfunction starts_with_root_or_relative(id) {\n\treturn /^\\.{0,2}\\//.test(id);\n}\n","/* Tooling\n/* ========================================================================== */\n\n// external tooling\nimport parser from 'postcss-values-parser';\nimport postcss from 'postcss';\n\n/* Transpile element styles with params\n/* ========================================================================== */\n\nexport default function transpileStyles(element, params) {\n\tif (hasStyleAttr(element)) {\n\t\t// conditionally update the style attribute\n\t\telement.attr.style = updatedStyleAttr(element.attr.style, params);\n\t}\n\n\tif (element.children) {\n\t\t// conditionally walk the child elements\n\t\tlet index = -1;\n\t\tlet child;\n\n\t\twhile (child = element.children[++index]) {\n\t\t\ttranspileStyles(child, params);\n\t\t}\n\t}\n}\n\n/* Inline Tooling\n/* ========================================================================== */\n\nfunction hasStyleAttr(element) {\n\treturn element.attr && element.attr.style;\n}\n\nfunction updatedStyleAttr(style, params) {\n\t// parse the style attribute\n\tconst styleAST = postcss.parse(style);\n\n\t// walk the declarations within the style attribute\n\tstyleAST.walkDecls(decl => {\n\t\tconst declAST = parser(decl.value).parse();\n\n\t\t// update the declaration with all transpiled var()s\n\t\tdeclAST.walk(node => {\n\t\t\t// conditionally update the var()\n\t\t\tif (isVarFuntion(node)) {\n\t\t\t\ttranspileVar(node, params);\n\t\t\t}\n\t\t});\n\n\t\tdecl.value = declAST.toString();\n\t});\n\n\t// return the updated style attribute\n\treturn styleAST.toString();\n}\n\n// whether the node is a var()\nfunction isVarFuntion(node) {\n\treturn node.type === 'func' && node.value === 'var' && Object(node.nodes).length && /^--/.test(node.nodes[1].value);\n}\n\n// transpile var()\nfunction transpileVar(node, params) {\n\t// css variable\n\tconst cssvar = node.nodes[1].value;\n\n\t// css variable backup value\n\tconst backup = node.nodes[3];\n\n\tif (cssvar in params) {\n\t\t// conditionally transpile the css var() function into the matched param\n\t\tnode.replaceWith(\n\t\t\tparser.word({ value: params[cssvar] })\n\t\t);\n\t} else if (backup) {\n\t\t// conditionally transpile the css var() function into the backup value\n\t\tnode.replaceWith(backup);\n\t}\n}\n","/* Tooling\n/* ========================================================================== */\n\n// native tooling\nimport path from 'path';\n\n// external tooling\nimport parser from 'postcss-values-parser';\n\n// internal tooling\nimport elementClone from './element-clone';\nimport elementById from './element-by-id';\nimport elementAsDURISVG from './element-as-data-uri-svg';\nimport readClosestSVG from './read-closest-svg';\nimport transpileStyles from './transpile-styles';\n\n/* Transpile declarations\n/* ========================================================================== */\n\nexport default function transpileDecl(result, promises, decl, opts, cache) { // eslint-disable-line max-params\n\t// path to the current working file and directory by declaration\n\tconst declWF = path.resolve(decl.source && decl.source.input && decl.source.input.file ? decl.source.input.file : result.root.source && result.root.source.input && result.root.source.input.file ? result.root.source.input.file : path.join(process.cwd(), 'index.css'));\n\tconst declWD = path.dirname(declWF);\n\n\t// list of files to watch\n\tconst files = {};\n\n\t// walk each node of the declaration\n\tconst declAST = parser(decl.value).parse();\n\n\tdeclAST.walk(node => {\n\t\t// if the node is a url containing an svg fragment\n\t\tif (isExternalURLFunction(node)) {\n\t\t\t// <url> of url(<url>)\n\t\t\tconst urlNode = node.nodes[1];\n\n\t\t\t// <url> split by fragment identifier symbol (#)\n\t\t\tconst urlParts = urlNode.value.split('#');\n\n\t\t\t// <url> src\n\t\t\tconst src = urlParts[0];\n\n\t\t\t// <url> fragment identifier\n\t\t\tconst id = urlParts.slice(1).join('#');\n\n\t\t\t// whether the <url> has a fragment identifier\n\t\t\tconst hasID = urlParts.length > 1;\n\n\t\t\t// <url> param()s\n\t\t\tconst params = paramsFromNodes(\n\t\t\t\tnode.nodes.slice(2, -1)\n\t\t\t);\n\n\t\t\tnode.nodes.slice(2, -1).forEach(childNode => {\n\t\t\t\tchildNode.remove();\n\t\t\t});\n\n\t\t\tpromises.push(\n\t\t\t\treadClosestSVG(src, [declWD].concat(opts.dirs), cache).then(svgResult => {\n\t\t\t\t\tconst file = svgResult.file;\n\t\t\t\t\tconst document = svgResult.document;\n\n\t\t\t\t\t// conditionally watch svgs for changes\n\t\t\t\t\tif (!files[file]) {\n\t\t\t\t\t\tfiles[file] = result.messages.push({\n\t\t\t\t\t\t\ttype: 'dependency',\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tparent: declWF\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// document cache\n\t\t\t\t\tconst ids = document.ids = document.ids || {};\n\n\t\t\t\t\t// conditionally update the document cache\n\t\t\t\t\tif (hasID && !ids[id]) {\n\t\t\t\t\t\tids[id] = elementById(document, id);\n\t\t\t\t\t}\n\n\t\t\t\t\t// element fragment or document\n\t\t\t\t\tconst element = hasID ? ids[id] : document;\n\n\t\t\t\t\t// if the element exists\n\t\t\t\t\tif (element) {\n\t\t\t\t\t\t// clone of the element\n\t\t\t\t\t\tconst clone = elementClone(element);\n\n\t\t\t\t\t\t// update the clone styles using the params\n\t\t\t\t\t\ttranspileStyles(clone, params);\n\n\t\t\t\t\t\t// promise updated <url> and declaration\n\t\t\t\t\t\treturn elementAsDURISVG(clone, document, opts).then(xml => {\n\t\t\t\t\t\t\t// update <url>\n\t\t\t\t\t\t\turlNode.value = xml;\n\n\t\t\t\t\t\t\t// conditionally quote <url>\n\t\t\t\t\t\t\tif (opts.utf8) {\n\t\t\t\t\t\t\t\turlNode.replaceWith(\n\t\t\t\t\t\t\t\t\tparser.string({\n\t\t\t\t\t\t\t\t\t\tvalue: urlNode.value,\n\t\t\t\t\t\t\t\t\t\tquoted: true,\n\t\t\t\t\t\t\t\t\t\traws: Object.assign(urlNode.raws, { quote: '\"' })\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// update declaration\n\t\t\t\t\t\t\tdecl.value = String(declAST);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}).catch(error => {\n\t\t\t\t\tresult.warn(error, node);\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n}\n\n/* Inline Tooling\n/* ========================================================================== */\n\n// whether the node if a function()\nfunction isExternalURLFunction(node) {\n\treturn node.type === 'func' && node.value === 'url' && Object(node.nodes).length && (/^(?!data:)/).test(node.nodes[1].value);\n}\n\n// params from nodes\nfunction paramsFromNodes(nodes) {\n\t// valid params as an object\n\tconst params = {};\n\n\t// for each node\n\tnodes.forEach(node => {\n\t\t// conditionally add the valid param\n\t\tif (isFilledParam(node)) {\n\t\t\tparams[node.nodes[1].value] = String(node.nodes[2]).trim();\n\t\t}\n\t});\n\n\t// return valid params as an object\n\treturn params;\n}\n\n// whether the node is a filled param()\nfunction isFilledParam(node) {\n\treturn node.type === 'func' && node.value === 'param' && node.nodes.length === 4 && node.nodes[1].type === 'word';\n}\n","/* Tooling\n/* ========================================================================== */\n\n// external tooling\nimport postcss from 'postcss';\n\n// internal tooling\nimport transpileDecl from './lib/transpile-decl';\n\n/* Inline SVGs\n/* ========================================================================== */\n\nexport default postcss.plugin('postcss-svg-fragments', opts => (css, result) => {\n\t// svg promises array\n\tconst promises = [];\n\n\t// plugin options\n\tconst normalizedOpts = {\n\t\t// additional directories to search for SVGs\n\t\tdirs: 'dirs' in Object(opts) ? [].concat(opts.dirs) : [],\n\t\t// whether to encode as utf-8\n\t\tutf8: 'utf8' in Object(opts) ? Boolean(opts.utf8) : true,\n\t\t// whether and how to compress with svgo\n\t\tsvgo: 'svgo' in Object(opts) ? Object(opts.svgo) : false\n\t};\n\n\t// cache of file content and json content promises\n\tconst cache = {};\n\n\t// for each declaration in the stylesheet\n\tcss.walkDecls(decl => {\n\t\t// if the declaration contains a url()\n\t\tif (containsUrlFunction(decl)) {\n\t\t\t// transpile declaration parts\n\t\t\ttranspileDecl(result, promises, decl, normalizedOpts, cache);\n\t\t}\n\t});\n\n\t// return chained svg promises array\n\treturn Promise.all(promises);\n});\n\n/* Inline Tooling\n/* ========================================================================== */\n\n// whether the declaration contains a url()\nfunction containsUrlFunction(decl) {\n\treturn /(^|\\s)url\\(.+\\)(\\s|$)/.test(decl.value);\n}\n"],"names":["elementClone","element","clone","key","Array","map","elementById","id","attr","children","index","child","undefined","elementAsDataURISvg","document","opts","name","viewBox","xmlns","xml","toString","compressed","svgo","Svgo","optimize","Promise","resolve","data","then","result","utf8","encodeUTF8","Buffer","from","string","encodeURIComponent","replace","readClosestSVG","wds","cache","reduce","promise","wd","catch","cwd","starts_with_root","resolveAsFile","path","join","resolve_as_directory","starts_with_root_or_relative","resolve_as_module","reject","file","XmlDocument","contents","file_contents","dir","json_contents","pkg","media","main","node_modules_dirs","segments","split","sep","count","length","dirs","push","slice","resolvePromise","rejectPromise","fs","readFile","error","JSON","parse","test","transpileStyles","params","hasStyleAttr","style","updatedStyleAttr","styleAST","postcss","walkDecls","decl","declAST","parser","value","walk","node","isVarFuntion","transpileVar","type","Object","nodes","cssvar","backup","replaceWith","word","transpileDecl","promises","declWF","source","input","root","process","declWD","dirname","files","isExternalURLFunction","urlNode","urlParts","src","hasID","paramsFromNodes","forEach","childNode","remove","concat","svgResult","messages","parent","ids","elementAsDURISVG","quoted","raws","assign","quote","String","warn","isFilledParam","trim","plugin","css","normalizedOpts","Boolean","containsUrlFunction","all"],"mappings":"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"}