diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5a0032d..4106684 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,17 @@
+## 0.27.4
+
+* Put the `seed` argument at the end.
+
+
+## 0.27.3
+
+* Add shorthand for frequently used svg filter (#88)
+* Skip empty group argument (#87)
+
+
+
+
+
## 0.27.2
* Add `t` variable to represent `u_time` in pattern (#85)
diff --git a/css-doodle.js b/css-doodle.js
index fd7e0ea..9b9dfe0 100644
--- a/css-doodle.js
+++ b/css-doodle.js
@@ -1,4 +1,4 @@
-/*! css-doodle@0.27.2 */
+/*! css-doodle@0.27.4 */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
@@ -812,10 +812,9 @@
if (arg.length) {
if (!group.length) {
group.push(Tokens.text(get_text_value(arg)));
- } else {
+ } else if (/\S/.test(arg)) {
group.push(Tokens.text(arg));
}
-
if (arg.startsWith('±') && !doodle) {
let raw = arg.substr(1);
let cloned = clone(group);
@@ -838,7 +837,6 @@
}
arg += c;
}
-
if (composition && (it.curr(1) == ')' || !/[0-9a-zA-Z_\-.]/.test(it.curr())) && !stack.length) {
if (group.length) {
args.push(normalize_argument(group));
@@ -3133,8 +3131,28 @@
}),
filter: lazy((...args) => {
- let value = args.map(input => get_value(input())).join(',');
+ let values = args.map(input => get_value(input()));
+ let value = values.join(',');
let id = unique_id('filter-');
+ // shorthand
+ if (values.every(n => /^[\d.]/.test(n))) {
+ let [fq = 1, scale = 1, octave, seed] = values;
+ let [bx, by = bx] = parse$4(fq);
+ octave = octave ? `numOctaves: ${octave};` : '';
+ seed = seed ? `seed: ${seed};` : '';
+ value = `
+ feTurbulence {
+ type: fractalNoise;
+ baseFrequency: ${bx} ${by};
+ ${octave} ${seed}
+ }
+ feDisplacementMap {
+ in: SourceGraphic;
+ scale: ${scale};
+ }
+ `;
+ }
+ // new svg syntax
if (!value.startsWith('<')) {
let parsed = parse$2(value, {
type: 'block',
diff --git a/css-doodle.min.js b/css-doodle.min.js
index b2f91e9..3a6aaaa 100644
--- a/css-doodle.min.js
+++ b/css-doodle.min.js
@@ -1 +1 @@
-/*! css-doodle@0.27.2 */!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).CSSDoodle={})}(this,(function(e){"use strict";const t=[":",";",",","(",")","[","]","{","}","\u03c0","\xb1","+","-","*","/","%",'"',"'","`","@"],n={escape:e=>"\\"==e,space:e=>/[\r\n\t\s]/.test(e),digit:e=>/^[0-9]$/.test(e),sign:e=>/^[+-]$/.test(e),dot:e=>"."==e,quote:e=>/^["'`]$/.test(e),symbol:e=>t.includes(e),hexNum:e=>/^[0-9a-f]$/i.test(e),hex:(e,t,r)=>"0"==e&&n.letter(t,"x")&&n.hexNum(r),expWithSign:(e,t,r)=>n.letter(e,"e")&&n.sign(t)&&n.digit(r),exp:(e,t)=>n.letter(e,"e")&&n.digit(t),dots:(e,t)=>n.dot(e)&&n.dot(t),letter:(e,t)=>String(e).toLowerCase()==String(t).toLowerCase(),comment:(e,t)=>"/"==e&&"*"==t,inlineComment:(e,t)=>"/"==e&&"/"===t,selfClosedTag:(e,t)=>"/"==e&&">"==t,closedTag:(e,t)=>"<"==e&&"/"==t};class r{constructor({type:e,value:t,pos:n,status:r}){this.type=e,this.value=t,this.pos=n,r&&(this.status=r)}isSymbol(...e){let t="Symbol"==this.type;return e.length?e.some((e=>e===this.value)):t}isSpace(){return"Space"==this.type}isNumber(){return"Number"==this.type}isWord(){return"Word"==this.type}}function i(e){let t=-1,n=e.length,r=-1,i=0;return{curr:(n=0)=>e[t+n],next(n=1){let s=e[t+=n];return"\n"===s?(i++,r=0):r+=n,s},end:()=>t>=n,get:()=>({prev:e[t-1],curr:e[t+0],next:e[t+1],next2:e[t+2],next3:e[t+3],pos:[r,i]})}}function s(e){for(;e.next();){let{curr:t,prev:r}=e.get();if(n.comment(t,r))break}}function o(e){for(;e.next()&&"\n"!==e.curr(););}function l(e){return[":",";",",","{","}","(",")","[","]"].includes(e)}function a(e){let t="";for(;!e.end();){let{curr:r,next:i}=e.get();t+=r;let s=n.symbol(i)||n.space(i)||n.digit(i);if(t.length&&s&&!n.closedTag(r,i))break;e.next()}return t.trim()}function u(e){let t="";for(;!e.end();){let{curr:r,next:i}=e.get();if(t+=r,!n.space(i))break;e.next()}return t}function c(e){let t="",r=!1;for(;!e.end();){let{curr:i,next:s,next2:o,next3:l}=e.get();if(t+=i,r&&n.dot(s))break;if(n.dot(i)&&(r=!0),n.dots(s,o))break;if(n.expWithSign(s,o,l))t+=e.next()+e.next();else if(n.exp(s,o))t+=e.next();else if(!n.digit(s)&&!n.dot(s))break;e.next()}return t}function h(e){let t="0x";for(e.next(2);!e.end();){let{curr:r,next:i}=e.get();if(t+=r,!n.hexNum(i))break;e.next()}return t}function p(e){return e[e.length-1]}function f(e,t={}){let f=i(String(e).trim()),m=[],d=[];for(;f.next();){let{prev:e,curr:i,next:g,next2:v,pos:y}=f.get();if(n.comment(i,g))s(f);else if(t.ignoreInlineComment&&n.inlineComment(i,g))o(f);else if(n.hex(i,g,v)){let e=h(f);m.push(new r({type:"Number",value:e,pos:y}))}else if(n.digit(i)||n.digit(g)&&n.dot(i)&&!n.dots(e,i)){let e=c(f);m.push(new r({type:"Number",value:e,pos:y}))}else if(n.symbol(i)&&!n.selfClosedTag(i,g)){let e=p(m),t=n.digit(g)||n.dot(g)&&n.digit(v);if("-"===i&&t&&(!e||!e.isNumber())){let e=c(f);m.push(new r({type:"Number",value:e,pos:y}));continue}let s={type:"Symbol",value:i,pos:y};if(d.length&&n.escape(e.value)){m.pop();let e=a(f);e.length&&m.push(new r({type:"Word",value:e,pos:y}))}else{if(n.quote(i)){p(d)==i?(d.pop(),s.status="close"):(d.push(i),s.status="open")}m.push(new r(s))}}else if(n.space(i)){let e=u(f),n=p(m),{next:s}=f.get();if(!d.length&&n){let r=n.value,o=l(r)&&")"!==r,a=l(s)&&"("!==s;if(o||a)continue;e=t.preserveLineBreak?i:" "}m.length&&s&&s.trim()&&m.push(new r({type:"Space",value:e,pos:y}))}else{let e=a(f);e.length&&m.push(new r({type:"Word",value:e,pos:y}))}}let g=p(m);return g&&g.isSpace()&&(m.length=m.length-1),m}function m(e){let t=[];for(;e.next();){let{curr:n,next:r}=e.get();if("var"===n.value){if(r&&r.isSymbol("(")){e.next();let n=d(e);v(n.name)&&t.push(n)}}else if(t.length&&!n.isSymbol(","))break}return t}function d(e){let t={},n=[];for(;e.next();){let{curr:r,next:i}=e.get();if(r.isSymbol(")",";")&&!t.name){t.name=g(n);break}r.isSymbol(",")?(void 0===t.name&&(t.name=g(n),n=[]),t.name&&(t.fallback=m(e))):n.push(r)}return t}function g(e){return e.map((e=>e.value)).join("")}function v(e){return void 0!==e&&(!(e.length<=2)&&(!e.substr(2).startsWith("-")&&!!e.startsWith("--")))}function y(e,t,n){return e=Number(e)||0,Math.max(t,Math.min(n,e))}function x(e,t,n){let r=0,i=e,s=e=>e>0&&e<1?.1:1,o=arguments.length;1==o&&([e,t]=[s(e),e]),o<3&&(n=s(e));let l=[];for(;(n>=0&&e<=t||n<0&&e>t)&&(l.push(e),e+=n,!(r++>=1e3)););return l.length||l.push(i),l}function b(e,t){for(let[n,r]of Object.entries(t))e[n]=e[r];return e}function _(e){return/^[a-zA-Z]$/.test(e)}function w(e){return null==e}function k(e){return w(e)||Number.isNaN(e)}function $(e){return w(e)||""===e}function S(e){let t=()=>e;return t.lazy=!0,t}function j(e,t,n){return"c-"+e+"-"+t+"-"+n}function E(e){let t=e;for(;t&&!w(t.value);)t=t.value;return w(t)?"":t}function T(e,t,n=0){let r=new Image;r.crossOrigin="anonymous",r.src=e,r.onload=function(){setTimeout(t,n)}}function A(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function R(e){let t=document.createElement("textarea");return t.innerHTML=e,t.value}function z(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t,i=0;i>>16,2246822507)^Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),4294967296*(2097151&r)+(n>>>0)}function P(e){return(t,...n)=>{let r=t.reduce(((e,t,r)=>{return e+t+(w(i=n[r])?"":i);var i}),"");return e(r)}}function C(){let e=0;return(t="")=>`${t}-${++e}`}function N(e,t,n){return t+e*(n-t)}function M(e=""){return e+Math.random().toString(32).substr(2)}function L(e){return Array.isArray(e)?e:[e]}function I(e,t="\n"){return(e||[]).join(t)}function O(e,t=1){return w(e)?"":e[e.length-t]}function W(e){return e[0]}function U(e,t){return Array.prototype.flatMap?e.flatMap(t):e.reduce(((e,n)=>e.concat(t(n))),[])}const D={func:(e="")=>({type:"func",name:e,arguments:[]}),argument:()=>({type:"argument",value:[]}),text:(e="")=>({type:"text",value:e}),pseudo:(e="")=>({type:"pseudo",selector:e,styles:[]}),cond:(e="")=>({type:"cond",name:e,styles:[],arguments:[]}),rule:(e="")=>({type:"rule",property:e,value:[]}),keyframes:(e="")=>({type:"keyframes",name:e,steps:[]}),step:(e="")=>({type:"step",name:e,styles:[]})},B={white_space:e=>/[\s\n\t]/.test(e),line_break:e=>/\n/.test(e),number:e=>!isNaN(e),pair:e=>['"',"(",")","'"].includes(e),pair_of:(e,t)=>({'"':'"',"'":"'","(":")"}[e]==t)},F={\u03c0:Math.PI,"\u220f":Math.PI};function X(e){return["@canvas","@shaders","@doodle"].includes(e)}function H(e,{col:t,line:n}){console.warn(`(at line ${n}, column ${t}) ${e}`)}function q(e){return function(t,n){let r=t.index(),i="";for(;!t.end();){let n=t.next();if(e(n))break;i+=n}return n&&t.index(r),i}}function Y(e,t){return q((e=>/[^\w@]/.test(e)))(e,t)}function V(e){return q((e=>/[\s\{]/.test(e)))(e)}function Z(e,t){return q((e=>B.line_break(e)||"{"==e))(e,t)}function G(e,t){let n,r=D.step();for(;!e.end()&&"}"!=(n=e.curr());)if(B.white_space(n))e.next();else{if(r.name.length){if(r.styles.push(ue(e,t)),"}"==e.curr())break}else r.name=oe(e);e.next()}return r}function K(e,t){const n=[];let r;for(;!e.end()&&"}"!=(r=e.curr());)B.white_space(r)||n.push(G(e,t)),e.next();return n}function J(e,t){let n,r=D.keyframes();for(;!e.end()&&"}"!=(n=e.curr());)if(r.name.length){if("{"==n||"{"==e.curr(-1)){e.next(),r.steps=K(e,t);break}e.next()}else if(Y(e),r.name=V(e),!r.name.length){H("missing keyframes name",e.info());break}return r}function Q(e,t={}){for(e.next();!e.end();){let n=e.curr();if(t.inline){if("\n"==n)break}else if("*"==(n=e.curr())&&"/"==e.curr(1))break;e.next()}t.inline||(e.next(),e.next())}function ee(e){for(e.next();!e.end();){if(">"==e.curr())break;e.next()}}function te(e){let t,n="";for(;!e.end()&&":"!=(t=e.curr());)B.white_space(t)||(n+=t),e.next();return n}function ne(e,t,n){let r,i=[],s=[],o=[],l="";for(;!e.end();){if(r=e.curr(),/[\('"`]/.test(r)&&"\\"!==e.curr(-1))o.length&&"("!=r&&r===O(o)?o.pop():o.push(r),l+=r;else if("@"!=r||n)if(n&&/[)]/.test(r)||!n&&/[,)]/.test(r))if(o.length)")"==r&&o.pop(),l+=r;else{if(l.length&&(s.length?s.push(D.text(l)):s.push(D.text((u=l).trim().length?B.number(+u)?+u:u.trim():u)),l.startsWith("\xb1")&&!n)){let e=l.substr(1),t=(a=s,JSON.parse(JSON.stringify(a)));O(t).value="-"+e,i.push(re(t)),O(s).value=e}if(i.push(re(s)),[s,l]=[[],""],")"==r)break}else F[r]&&!/[0-9]/.test(e.curr(-1))&&(r=F[r]),l+=r;else s.length||(l=l.trimLeft()),l.length&&(s.push(D.text(l)),l=""),s.push(ie(e));if(!(!t||")"!=e.curr(1)&&/[0-9a-zA-Z_\-.]/.test(e.curr())||o.length)){s.length&&i.push(re(s));break}e.next()}var a,u;return function(e){let t=O(e[0]);t&&"text"===t.type&&!String(t.value).trim().length&&(e[0]=e[0].slice(0,-1));return e}(i)}function re(e){let t=e.map((e=>{if("text"==e.type&&"string"==typeof e.value){let t=String(e.value);t.includes("`")&&(e.value=t=t.replace(/`/g,'"')),e.value=t}return e})),n=W(t)||{},r=O(t)||{};if("text"==n.type&&"text"==r.type){let e=W(n.value),i=O(r.value);"string"==typeof n.value&&"string"==typeof r.value&&B.pair_of(e,i)&&(n.value=n.value.slice(1),r.value=r.value.slice(0,r.value.length-1),t.cluster=!0)}return t}function ie(e){let t,n=D.func(),r="@",i=!1;for(e.next();!e.end();){t=e.curr();let s="."==t&&"@"==e.curr(1),o=e.curr(1);if("("==t||s){i=!0,e.next(),n.arguments=ne(e,s,X(r));break}if(!i&&"("!==o&&!/[0-9a-zA-Z_\-.]/.test(o)){r+=t;break}r+=t,e.next()}let{fname:s,extra:o}=function(e){let t="",n="";if(/\D$/.test(e)&&!/\d+x\d+/.test(e)||Math[e.substr(1)])return{fname:e,extra:n};for(let r=e.length-1;r>=0;r--){let i=e[r],s=e[r-1],o=e[r+1];if(!(/[\d.]/.test(i)||"x"==i&&/\d/.test(s)&&/\d/.test(o))){t=e.substring(0,r+1);break}n=i+n}return{fname:t,extra:n}}(r);return n.name=s,o.length&&n.arguments.unshift([{type:"text",value:o}]),n.position=e.info().index,n}function se(e){let t,n=D.text(),r=0,i=!0;const s=[],o=[];for(s[r]=[];!e.end();)if(t=e.curr(),i&&B.white_space(t))e.next();else{if(i=!1,"\n"!=t||B.white_space(e.curr(-1)))if(","!=t||o.length){if(/[;}<]/.test(t)){n.value.length&&(s[r].push(n),n=D.text());break}"@"==t?(n.value.length&&(s[r].push(n),n=D.text()),s[r].push(ie(e))):B.white_space(t)&&B.white_space(e.curr(-1))||("("==t&&o.push(t),")"==t&&o.pop(),F[t]&&!/[0-9]/.test(e.curr(-1))&&(t=F[t]),n.value+=t)}else n.value.length&&(s[r].push(n),n=D.text()),s[++r]=[],i=!0;else n.value+=" ";e.next()}return n.value.length&&s[r].push(n),s}function oe(e){let t,n="";for(;!e.end()&&"{"!=(t=e.curr());)B.white_space(t)||(n+=t),e.next();return n}function le(e){let t,n={name:"",arguments:[]};for(;!e.end();){if("("==(t=e.curr()))e.next(),n.arguments=ne(e);else{if(/[){]/.test(t))break;B.white_space(t)||(n.name+=t)}e.next()}return n}function ae(e,t){let n,r=D.pseudo();for(;!e.end();){if(n=e.curr(),"/"==n&&"*"==e.curr(1))Q(e);else{if("}"==n)break;if(B.white_space(n)){e.next();continue}if(r.selector){let n=ue(e,t);if("@use"==n.property?r.styles=r.styles.concat(n.value):r.styles.push(n),"}"==e.curr())break}else r.selector=oe(e)}e.next()}return r}function ue(e,t){let n,r=D.rule();for(;!e.end();){if(n=e.curr(),"/"==n&&"*"==e.curr(1))Q(e);else{if(";"==n)break;if(r.property.length){r.value=se(e);break}if(r.property=te(e),"@use"==r.property){r.value=fe(e,t);break}}e.next()}return r}function ce(e,t){let n,r=D.cond();for(;!e.end();){if(n=e.curr(),"/"==n&&"*"==e.curr(1))Q(e);else{if("}"==n)break;if(r.name.length)if(":"==n){let t=ae(e);t.selector&&r.styles.push(t)}else if("@"!=n||Z(e,!0).includes(":")){if(!B.white_space(n)){let n=ue(e,t);if(n.property&&r.styles.push(n),"}"==e.curr())break}}else r.styles.push(ce(e));else Object.assign(r,le(e))}e.next()}return r}function he(e,t){let n="";return e&&e.get_variable&&(n=e.get_variable(t)),n}function pe(e,t){e.forEach&&e.forEach((e=>{if("text"==e.type&&e.value){let n=m(i(f(e.value)));e.value=n.reduce(((e,n)=>{let r,i="",s="";i=he(t,n.name),!i&&n.fallback&&n.fallback.every((e=>{if(s=he(t,e.name),s)return i=s,!1}));try{r=me(i,t)}catch(e){}return r&&e.push.apply(e,r),e}),[])}"func"==e.type&&e.arguments&&e.arguments.forEach((e=>{pe(e,t)}))}))}function fe(e,t){return e.next(),(se(e)||[]).reduce(((e,n)=>{pe(n,t);let[r]=n;return r.value&&r.value.length&&e.push(...r.value),e}),[])}function me(e,t){const n=function(e=""){let t=0,n=1,r=1;return{curr:(n=0)=>e[t+n],end:()=>e.length<=t,info:()=>({index:t,col:n,line:r}),index:e=>void 0===e?t:t=e,next(){let i=e[t++];return"\n"==i?(r++,n=0):n++,i}}}(e),r=[];for(;!n.end();){let e=n.curr();if(B.white_space(e))n.next();else{if("/"==e&&"*"==n.curr(1))Q(n);else if(":"==e){let e=ae(n,t);e.selector&&r.push(e)}else if("@"==e&&"@keyframes"===Y(n,!0)){let e=J(n,t);r.push(e)}else if("@"!=e||Z(n,!0).includes(":")){if("<"==e)ee(n);else if(!B.white_space(e)){let e=ue(n,t);e.property&&r.push(e)}}else{let e=ce(n,t);e.name.length&&r.push(e)}n.next()}}return r}const[de,ge,ve]=[1,256,65536];function ye(e){let[t,n,r]=(e+"").replace(/\s+/g,"").replace(/[,\uff0cxX]+/g,"x").split("x").map((e=>parseInt(e)));const i=1==t||1==n?ve:ge,s=1==t&&1==n?ve:de,o={x:y(t||de,1,i),y:y(n||t||de,1,i),z:y(r||de,1,s)};return Object.assign({},o,{count:o.x*o.y*o.z,ratio:o.x/o.y})}function xe(e){return/^texture\w*$|^(fragment|vertex)$/.test(e)}function be(){return new r({type:"LineBreak",value:"\n"})}function _e(e){let t=e[0],n=e[e.length-1];for(;t&&t.isSymbol("(")&&n&&n.isSymbol(")");)t=(e=e.slice(1,e.length-1))[0],n=e[e.length-1];return e}function we(e){return _e(e).map((e=>e.value)).join("")}function ke(e,t){return`url("data:image/svg+xml;utf8,${encodeURIComponent(e)+(t?`#${t}`:"")}")`}function $e(e){const t='xmlns="http://www.w3.org/2000/svg"',n='xmlns:xlink="http://www.w3.org/1999/xlink"';return e.includes("`),e.includes("xmlns")||(e=e.replace(/