@xlfont/load 2.1.2 → 2.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Change Logs
2
2
 
3
+ ## v2.1.4
4
+
5
+ - add `cssName` for font name used in CSS, to prevent bad font name from causing program to crash
6
+ - deduct extension by path also name
7
+ - use `cssName` for className generation
8
+ - use `opentype` for `otf` extension
9
+ - add `track` api for managing fonts constructed outside of xlfont.
10
+
11
+
12
+ ## v2.1.3
13
+
14
+ - remove the 350ms delay at the end of `xfl.update`
15
+
16
+
3
17
  ## v2.1.2
4
18
 
5
19
  - fix bug: `_fetch` should resolve proxise function `proxy`, otherwise proxised caller will wait indefinitely
package/README.md CHANGED
@@ -90,6 +90,7 @@ Use `font.className` for font related CSS rules:
90
90
  - an object passed directly to `xlfont` constructor.
91
91
  - return a promise resolving to a `xlfont` object.
92
92
  - `update()`: refresh necessary CSS in document to reflect font status changes.
93
+ - `track(font)`: track and manage fonts created manually instead of from `load`.
93
94
 
94
95
 
95
96
  ## xlfont Constructor
@@ -130,6 +131,7 @@ Besides loading from `xfl.load`, you can also manually construct a `xlfont` obje
130
131
  - `fetchAll()`: by default `xfl` use CSS to load fonts. `fecthAll()` fetch all subset fonts with JS again.
131
132
  - `name`: font name which can be used in CSS `font-family` property.
132
133
  - `className`: a CSS class name which its `font-family` is assigned to this font.
134
+ - `mod`: a reserved member object for user program to extend xlfont. default `undefined`.
133
135
 
134
136
 
135
137
  ## availabel xlfonts
package/index.js CHANGED
@@ -87,7 +87,7 @@ xlfMerger = function(arg$){
87
87
  });
88
88
  };
89
89
  xlfont = function(opt){
90
- var this$ = this;
90
+ var re, that, n, this$ = this;
91
91
  opt == null && (opt = {});
92
92
  this.opt = opt;
93
93
  this.sub = {
@@ -101,12 +101,25 @@ xlfont = function(opt){
101
101
  dirty: true
102
102
  };
103
103
  this.path = opt.path;
104
- this.name = opt.name || this.path.replace(/\.[a-zA-Z0-9]+$/, '').replace(/^https?:\/\/[^/]+\//g, '').replace(/\s/g, '-').replace(/\//g, '-').toLowerCase();
104
+ this.name = opt.name
105
+ ? opt.name
106
+ : this.path.replace(/.[a-zA-Z0-9]+$/g, '').replace(/^https?:\/\/[^/]+\//g, '').replace(/\s/g, '-').replace(/\//g, '-').toLowerCase();
107
+ this.cssName = Array.from(this.name || 'unnamed').map(function(it){
108
+ if (/[a-zA-Z0-9 ]/.exec(it)) {
109
+ return it;
110
+ } else {
111
+ return it.charCodeAt(0).toString(36);
112
+ }
113
+ }).join('');
105
114
  this.style = opt.style || 'normal';
106
115
  this.weight = opt.weight || '400';
107
- this.ext = opt.ext || (/\.(ttf|otf|woff2|woff)$/.exec(this.path) || [])[1] || '';
116
+ re = /\.(ttf|otf|woff2|woff)$/;
117
+ this.ext = opt.ext || ((that = re.exec(this.path))
118
+ ? that[1]
119
+ : (that = re.exec(opt.name)) ? that[1] : '');
108
120
  this.format = this._format(this.ext);
109
- this.className = "xfl-" + (this.name || '').replace(/\s+/g, '_') + "-" + Math.random().toString(36).substring(2);
121
+ n = (this.cssName || '').replace(/\s/g, '-');
122
+ this.className = "xfl-" + n + "-" + Math.random().toString(36).substring(2);
110
123
  this.isXl = opt.isXl != null
111
124
  ? opt.isXl
112
125
  : !this.ext;
@@ -129,7 +142,7 @@ xlfont.prototype = import$(Object.create(Object.prototype), {
129
142
  f = f.toLowerCase();
130
143
  f = f === 'ttf'
131
144
  ? 'truetype'
132
- : f === 'otf' ? 'truetype' : f;
145
+ : f === 'otf' ? 'opentype' : f;
133
146
  return "format('" + f + "')";
134
147
  },
135
148
  _init: function(){
@@ -137,7 +150,7 @@ xlfont.prototype = import$(Object.create(Object.prototype), {
137
150
  return Promise.resolve().then(function(){
138
151
  if (!this$.isXl) {
139
152
  this$.css = [{
140
- content: "@font-face {\n font-family: \"" + this$.name + "\";\n src: url(\"" + this$.path + "\") " + this$.format + ";\n font-style: " + this$.style + ";\n font-weight: " + this$.weight + ";\n}\n." + this$.className + " { font-family: \"" + this$.name + "\"; }"
153
+ content: "@font-face {\n font-family: \"" + this$.cssName + "\";\n src: url(\"" + this$.path + "\") " + this$.format + ";\n font-style: " + this$.style + ";\n font-weight: " + this$.weight + ";\n}\n." + this$.className + " { font-family: \"" + this$.cssName + "\"; }"
141
154
  }];
142
155
  return xfl.update();
143
156
  } else {
@@ -332,9 +345,9 @@ xlfont.prototype = import$(Object.create(Object.prototype), {
332
345
  for (i$ = 0, len$ = subfonts.length; i$ < len$; ++i$) {
333
346
  f = subfonts[i$];
334
347
  format = this$._format(f.type);
335
- css += "@font-face {\n font-family: \"" + this$.name + "\";\n src: url(\"" + f.url + "\") " + format + ";\n font-style: " + this$.style + ";\n font-weight: " + this$.weight + ";\n}";
348
+ css += "@font-face {\n font-family: \"" + this$.cssName + "\";\n src: url(\"" + f.url + "\") " + format + ";\n font-style: " + this$.style + ";\n font-weight: " + this$.weight + ";\n}";
336
349
  }
337
- css += "." + this$.className + " { font-family: \"" + this$.name + "\"; }";
350
+ css += "." + this$.className + " { font-family: \"" + this$.cssName + "\"; }";
338
351
  return this$.css.push({
339
352
  content: css
340
353
  });
@@ -435,7 +448,7 @@ xlfont.prototype = import$(Object.create(Object.prototype), {
435
448
  return it;
436
449
  });
437
450
  this$.otf.font = new opentype.Font((ref1$ = {
438
- familyName: this$.name,
451
+ familyName: this$.cssName,
439
452
  styleName: this$.style || 'normal',
440
453
  glyphs: glyphs
441
454
  }, ref1$.unitsPerEm = (ref$ = list[0].otf).unitsPerEm, ref1$.ascender = ref$.ascender, ref1$.descender = ref$.descender, ref1$));
@@ -524,14 +537,8 @@ xfl = {
524
537
  }
525
538
  return results$;
526
539
  }.call(this)).map(function(){
527
- return document.fonts.load("16px " + v.name);
528
- })).then(function(){
529
- return new Promise(function(res, rej){
530
- return setTimeout(function(){
531
- return res();
532
- }, 350);
533
- });
534
- });
540
+ return document.fonts.load("16px " + v.cssName);
541
+ })).then(function(){});
535
542
  function fn$(it){
536
543
  return !it.rendered;
537
544
  }
@@ -592,6 +599,9 @@ xfl = {
592
599
  return rej(it);
593
600
  });
594
601
  });
602
+ },
603
+ track: function(font){
604
+ return this.fonts[font.path || font.name] = font;
595
605
  }
596
606
  };
597
607
  if (typeof module != 'undefined' && module !== null) {
package/index.min.js CHANGED
@@ -1 +1 @@
1
- !function(){var i,n,t,o,c;function l(e,t){var n,r={}.hasOwnProperty;for(n in t)r.call(t,n)&&(e[n]=t[n]);return e}i=function(e){return null==e&&(e={}),l(new Error,l({name:"lderror"},e))},n={key:0,worker:null,queue:[],init:function(e){var r=this;return null==e&&(e={}),Promise.resolve().then(function(){var e;if(!r.worker)return e=URL.createObjectURL(new Blob(['var local={},onmessage=function(e){var e=e.data||{},n=e.bufs,p=e.key,e=e.lib;return local.inited||(importScripts(e||"opentype.js"),local.inited=!0),Promise.resolve().then(function(){return n.map(function(e){return opentype.parse(e)})}).then(function(e){for(var n,t,r,s,a,o=[],l=0,i=e.length;l<i;++l)for(t=0,r=(n=e[l]).glyphs.length;t<r;++t)s=t,o.push(n.glyphs.glyphs[s]);return n=e[0],a=new opentype.Font(((a={glyphs:o,familyName:n.names.fontFamily.en,styleName:n.names.fontSubfamily.en}).unitsPerEm=n.unitsPerEm,a.ascender=n.ascender,a.descender=n.descender,a)),postMessage({buf:a.toArrayBuffer(),key:p})})};'],{type:"text/javascript"})),r.worker=new Worker(e),URL.revokeObjectURL(e),r.worker.onmessage=function(e){var t=e.data,e=t.buf,n=t.key;if(t=r.queue.filter(function(e){return n===e.key})[0])return r.queue.splice(r.queue.indexOf(t),1),t.res(e)}})},run:function(r,o){var s=this;return new Promise(function(t,n){return s.init(o).then(function(){var e;return s.queue.push(e={res:t,rej:n,key:s.key++}),s.worker.postMessage({bufs:r,key:e.key,lib:o.opentypeUrl})})})}},t=function(e){var t=e.bufs,e=e.useWorker;return t.length?e?n.run(t,e):Promise.resolve().then(function(){return t.map(function(e){return opentype.parse(e)})}).then(function(e){for(var t,n,r,o,s,i=[],u=0,f=e.length;u<f;++u)for(n=0,r=(t=e[u]).glyphs.length;n<r;++n)o=n,i.push(t.glyphs.glyphs[o]);return t=e[0],new opentype.Font(((s={glyphs:i,familyName:t.names.fontFamily.en,styleName:t.names.fontSubfamily.en}).unitsPerEm=t.unitsPerEm,s.ascender=t.ascender,s.descender=t.descender,s)).toArrayBuffer()}):Promise.resolve()},(o=function(e){var t=this;return this.opt=e=null==e?{}:e,this.sub={set:{},font:{}},this.cjkOnly=e.cjkOnly||!1,this.codemap={},this.otf={font:null,dirty:!0},this.path=e.path,this.name=e.name||this.path.replace(/\.[a-zA-Z0-9]+$/,"").replace(/^https?:\/\/[^/]+\//g,"").replace(/\s/g,"-").replace(/\//g,"-").toLowerCase(),this.style=e.style||"normal",this.weight=e.weight||"400",this.ext=e.ext||(/\.(ttf|otf|woff2|woff)$/.exec(this.path)||[])[1]||"",this.format=this._format(this.ext),this.className="xfl-"+(this.name||"").replace(/\s+/g,"_")+"-"+Math.random().toString(36).substring(2),this.isXl=null!=e.isXl?e.isXl:!this.ext,this.ext||(this.ext="woff"),this.doMerge=null!=e.doMerge&&e.doMerge,this.useWorker=null!=e.useWorker&&e.useWorker,this.misschar={},this.css=[],this.init=proxise.once(function(){return t._init()}),this.init(),this}).prototype=l(Object.create(Object.prototype),{_format:function(e){return"format('"+(e="ttf"===(e=(e=null==e?"":e).toLowerCase())||"otf"===e?"truetype":e)+"')"},_init:function(){var r=this;return Promise.resolve().then(function(){return r.isXl?new Promise(function(e,t){var n=new XMLHttpRequest;return n.addEventListener("readystatechange",function(){if(n.readyState===XMLHttpRequest.DONE)return 200!==n.status?t(i({code:n.status,message:n.responseText})):((n.responseText||"").split("\n").map(function(e,n){return e.split(" ").map(function(e,t){return r.codemap[e]=n+1})}),e())}),n.open("GET",r.path+"/charmap.txt"),n.send()}):(r.css=[{content:'@font-face {\n font-family: "'+r.name+'";\n src: url("'+r.path+'") '+r.format+";\n font-style: "+r.style+";\n font-weight: "+r.weight+";\n}\n."+r.className+' { font-family: "'+r.name+'"; }'}],c.update())})},_fetch:function(e,t,o){var s=this;return null==e&&(e={}),null==o&&(o="ttf"),(t=null!=t&&t)?e.blob?Promise.resolve(e):(e.proxy||(e.proxy=proxise(function(r){if(!r.running)return r.running=!0,new Promise(function(e,t){var n;return r.blob?e(r):((n=new XMLHttpRequest).addEventListener("readystatechange",function(){if(n.readyState===XMLHttpRequest.DONE)return 200!==n.status?t(i({code:n.status,message:n.responseText})):(s.otf.dirty=!0,r.url=URL.createObjectURL(n.response),r.blob=n.response,r.type=s.ext.toLowerCase()||o,e(r))}),s.isXl?n.open("GET",s.path+"/"+r.key+"."+o):n.open("GET",s.path),n.responseType="blob",n.send())}).finally(function(){return r.running=!1}).then(function(){return r.proxy.resolve(r)}).then(function(){return r})})),e.proxy(e)):(e.url||(this.isXl?(e.url=this.path+"/"+e.key+"."+o,e.type=o):(e.url=this.path,e.type=this.ext.toLowerCase()||o)),Promise.resolve(e))},fetchAll:function(){var n,r,t=this;return this.isXl?Promise.all(function(){var e,t=[];for(n in e=this.sub.font)r=e[n],t.push(r);return t}.call(this).map(function(e){return t._fetch(e,!0,"woff")})):this._fetch(this.sub.font[0],!0,"ttf")},fetch:function(e,o){var s,i=this;if(null==e&&(e=[]),null==o&&(o=!1),!this.isXl){if(this.sub.font[0]&&this.sub.font[0].blob)return Promise.resolve();e=[0]}return s=this.doMerge,e=Array.from(new Set(e.map(function(e){return e}))).filter(function(e){return!i.sub.font[e]}).map(function(e,t){var n,r;return i.sub.font[e]=n={key:e},r=i.isXl?"woff":"ttf",n.needMerge=1!=+e,i._fetch(n,!!s||o,r)}),Promise.all(e).then(function(n){var e;return s?(e=n.filter(function(e){return e.needMerge}).map(function(r){return new Promise(function(e,t){var n=new FileReader;return n.onerror=function(e){return t(e)},n.onload=function(){return e(n.result)},n.readAsArrayBuffer(r.blob)})}),Promise.all(e).then(function(e){return t({bufs:e,useWorker:i.useWorker})}).then(function(e){var t;return e?(t=n.filter(function(e){return e.needMerge})[0],e=new Blob([e],{type:"font/"+(t.type||"ttf")}),t={url:URL.createObjectURL(e),blob:e,type:t.type||"ttf"},n.filter(function(e){return!e.needMerge}).concat([t])):n.filter(function(e){return!e.needMerge})})):n}).then(function(e){var t,n,r,o,s;if(e.length){for(t="",n=0,r=e.length;n<r;++n)o=e[n],s=i._format(o.type),t+='@font-face {\n font-family: "'+i.name+'";\n src: url("'+o.url+'") '+s+";\n font-style: "+i.style+";\n font-weight: "+i.weight+";\n}";return t+="."+i.className+' { font-family: "'+i.name+'"; }',i.css.push({content:t})}})},hasChar:function(e){return void 0===this.misschar[e]?void 0:!this.misshcar[e]},getPath:function(e){var s=this,e=l({text:"",x:0,y:0,fontSize:48},e=null==e?{}:e),i=e.text,u=e.x,f=e.y,a=e.fontSize;return this.sync(i).then(function(){return s.getotf()}).then(function(e){for(var t,n="",r=0,o=i.length;r<o;++r)t=r,n+=s.misschar[i[t]]?" ":i[t];return e.getPath(n,u,f,a)})},getotf:function(){var o=this;return"undefined"==typeof opentype||null===opentype?Promise.reject(i({id:1022,message:"[@plotdb/xfl] need opentype.js to merge subfonts"})):this.otf.dirty?Promise.resolve().then(function(){return o.isXl?o.fetchAll():o.fetch()}).then(function(){var n,r,e=function(){var e,t=[];for(n in e=this.sub.font)r=e[n],t.push(r);return t}.call(o).map(function(n){return n.otf?Promise.resolve(n):Array.isArray(n._ps)?new Promise(function(e,t){return n._ps.push({res:e,rej:t})}):(n._ps=[],opentype.load(n.url).then(function(e){return n.otf=e,n._ps.map(function(e){return e.res(n)}),n}))});return Promise.all(e)}).then(function(e){var t;return 1===(e=null==e?[]:e).length?e[0].otf:(t=e.map(function(e){for(var t,n=[],r=e.otf.glyphs,o=1,s=r.length;o<=s;++o)t=o,n.push(r.glyphs[t]);return n}).reduce(function(e,t){return e.concat(t)},[]).filter(function(e){return e}),o.otf.font=new opentype.Font(((t={familyName:o.name,styleName:o.style||"normal",glyphs:t}).unitsPerEm=(e=e[0].otf).unitsPerEm,t.ascender=e.ascender,t.descender=e.descender,t)),o.otf.font.kerningPairs={},o.otf.font)}):Promise.resolve(this.otf.font)},sync:function(a){var l=this;return null==a&&(a=""),this.isXl?Promise.resolve().then(function(){for(var e,t,n,r,o=[{},{}],s=o[0],i=o[1],u=0,f=a.length;u<f;++u)e=u,t=a.charCodeAt(e),l.cjkOnly&&!c.isCJK(t)||(t=l.codemap[t.toString(16)],l.misschar[a[e]]=s[a[e]]=!t,t&&!l.sub.set[t]&&(l.sub.set[t]=i[t]=!0));for(n in(s=function(){var e=[];for(n in s)e.push(n);return e}().filter(function(e){return s[e]})).length&&console.log("[@plotdb/xfl] sync xl-font with following chars unsupported: "+s.join("")),r=[],i)r.push(n);if((o=r).length)return l.fetch(o)}).then(function(){return c.update()}):(c.update(),Promise.resolve())}}),c={xlfont:o,range:{CJK:[[12352,12543],[13312,19903],[19968,40959],[63744,64255],[65382,65439],[12593,55197]]},fonts:{},running:{},isCJK:function(t){return this.range.CJK.filter(function(e){return t>=e[0]&&t<=e[1]}).length},proxy:{},update:function(){var n,e,t,r,o,s="";for(n in e=this.fonts)((t=e[n]).css||[]).filter(i).map(u);return s&&((r=document.createElement("style")).textContent=s,r.setAttribute("type","text/css"),document.body.appendChild(r)),Promise.all(function(){var e,t=[];for(n in e=this.fonts)o=e[n],t.push(o);return t}.call(this).map(function(){return document.fonts.load("16px "+t.name)})).then(function(){return new Promise(function(e,t){return setTimeout(function(){return e()},350)})});function i(e){return!e.rendered}function u(e){return e.rendered=!0,s+=e.content}},_load:function(t){var n=this,r=(t=null==t?{}:t).path;if(!this.running[r])return this.running[r]=!0,Promise.resolve().then(function(){var e;return n.fonts[r]=e=new o(t),e.init()}).finally(function(){return n.running[r]=!1}).then(function(){return n.proxy[r].resolve(n.fonts[r]),n.fonts[r]}).catch(function(e){return n.proxy[r].reject(e),Promise.reject(e)})},load:function(o){var s=this;return"string"==typeof(o=null==o?{}:o)&&(o={path:o}),new Promise(function(t,n){var e,r;return(e=o.path)?(e=e.replace(/\/$/,""),(r=s.fonts[e])?t(r):(s.proxy[e]||(s.proxy[e]=proxise(function(e){return s._load(e)})),s.proxy[e](((r=l({},o)).path=e,r)).then(function(e){return t(e)}).catch(function(e){return n(e)}))):n(i({id:400}))})}},"undefined"!=typeof module&&null!==module?module.exports=c:"undefined"!=typeof window&&null!==window&&(window.xfl=c)}();
1
+ !function(){var i,n,t,o,c;function l(e,t){var n,r={}.hasOwnProperty;for(n in t)r.call(t,n)&&(e[n]=t[n]);return e}i=function(e){return null==e&&(e={}),l(new Error,l({name:"lderror"},e))},n={key:0,worker:null,queue:[],init:function(e){var r=this;return null==e&&(e={}),Promise.resolve().then(function(){var e;if(!r.worker)return e=URL.createObjectURL(new Blob(['var local={},onmessage=function(e){var e=e.data||{},n=e.bufs,p=e.key,e=e.lib;return local.inited||(importScripts(e||"opentype.js"),local.inited=!0),Promise.resolve().then(function(){return n.map(function(e){return opentype.parse(e)})}).then(function(e){for(var n,t,r,s,a,o=[],l=0,i=e.length;l<i;++l)for(t=0,r=(n=e[l]).glyphs.length;t<r;++t)s=t,o.push(n.glyphs.glyphs[s]);return n=e[0],a=new opentype.Font(((a={glyphs:o,familyName:n.names.fontFamily.en,styleName:n.names.fontSubfamily.en}).unitsPerEm=n.unitsPerEm,a.ascender=n.ascender,a.descender=n.descender,a)),postMessage({buf:a.toArrayBuffer(),key:p})})};'],{type:"text/javascript"})),r.worker=new Worker(e),URL.revokeObjectURL(e),r.worker.onmessage=function(e){var t=e.data,e=t.buf,n=t.key;if(t=r.queue.filter(function(e){return n===e.key})[0])return r.queue.splice(r.queue.indexOf(t),1),t.res(e)}})},run:function(r,o){var s=this;return new Promise(function(t,n){return s.init(o).then(function(){var e;return s.queue.push(e={res:t,rej:n,key:s.key++}),s.worker.postMessage({bufs:r,key:e.key,lib:o.opentypeUrl})})})}},t=function(e){var t=e.bufs,e=e.useWorker;return t.length?e?n.run(t,e):Promise.resolve().then(function(){return t.map(function(e){return opentype.parse(e)})}).then(function(e){for(var t,n,r,o,s,i=[],u=0,f=e.length;u<f;++u)for(n=0,r=(t=e[u]).glyphs.length;n<r;++n)o=n,i.push(t.glyphs.glyphs[o]);return t=e[0],new opentype.Font(((s={glyphs:i,familyName:t.names.fontFamily.en,styleName:t.names.fontSubfamily.en}).unitsPerEm=t.unitsPerEm,s.ascender=t.ascender,s.descender=t.descender,s)).toArrayBuffer()}):Promise.resolve()},(o=function(e){var t,n,r=this;return this.opt=e=null==e?{}:e,this.sub={set:{},font:{}},this.cjkOnly=e.cjkOnly||!1,this.codemap={},this.otf={font:null,dirty:!0},this.path=e.path,this.name=e.name||this.path.replace(/.[a-zA-Z0-9]+$/g,"").replace(/^https?:\/\/[^/]+\//g,"").replace(/\s/g,"-").replace(/\//g,"-").toLowerCase(),this.cssName=Array.from(this.name||"unnamed").map(function(e){return/[a-zA-Z0-9 ]/.exec(e)?e:e.charCodeAt(0).toString(36)}).join(""),this.style=e.style||"normal",this.weight=e.weight||"400",t=/\.(ttf|otf|woff2|woff)$/,this.ext=e.ext||((n=t.exec(this.path))||(n=t.exec(e.name))?n[1]:""),this.format=this._format(this.ext),n=(this.cssName||"").replace(/\s/g,"-"),this.className="xfl-"+n+"-"+Math.random().toString(36).substring(2),this.isXl=null!=e.isXl?e.isXl:!this.ext,this.ext||(this.ext="woff"),this.doMerge=null!=e.doMerge&&e.doMerge,this.useWorker=null!=e.useWorker&&e.useWorker,this.misschar={},this.css=[],this.init=proxise.once(function(){return r._init()}),this.init(),this}).prototype=l(Object.create(Object.prototype),{_format:function(e){return"format('"+(e="ttf"===(e=(e=null==e?"":e).toLowerCase())?"truetype":"otf"===e?"opentype":e)+"')"},_init:function(){var r=this;return Promise.resolve().then(function(){return r.isXl?new Promise(function(e,t){var n=new XMLHttpRequest;return n.addEventListener("readystatechange",function(){if(n.readyState===XMLHttpRequest.DONE)return 200!==n.status?t(i({code:n.status,message:n.responseText})):((n.responseText||"").split("\n").map(function(e,n){return e.split(" ").map(function(e,t){return r.codemap[e]=n+1})}),e())}),n.open("GET",r.path+"/charmap.txt"),n.send()}):(r.css=[{content:'@font-face {\n font-family: "'+r.cssName+'";\n src: url("'+r.path+'") '+r.format+";\n font-style: "+r.style+";\n font-weight: "+r.weight+";\n}\n."+r.className+' { font-family: "'+r.cssName+'"; }'}],c.update())})},_fetch:function(e,t,o){var s=this;return null==e&&(e={}),null==o&&(o="ttf"),(t=null!=t&&t)?e.blob?Promise.resolve(e):(e.proxy||(e.proxy=proxise(function(r){if(!r.running)return r.running=!0,new Promise(function(e,t){var n;return r.blob?e(r):((n=new XMLHttpRequest).addEventListener("readystatechange",function(){if(n.readyState===XMLHttpRequest.DONE)return 200!==n.status?t(i({code:n.status,message:n.responseText})):(s.otf.dirty=!0,r.url=URL.createObjectURL(n.response),r.blob=n.response,r.type=s.ext.toLowerCase()||o,e(r))}),s.isXl?n.open("GET",s.path+"/"+r.key+"."+o):n.open("GET",s.path),n.responseType="blob",n.send())}).finally(function(){return r.running=!1}).then(function(){return r.proxy.resolve(r)}).then(function(){return r})})),e.proxy(e)):(e.url||(this.isXl?(e.url=this.path+"/"+e.key+"."+o,e.type=o):(e.url=this.path,e.type=this.ext.toLowerCase()||o)),Promise.resolve(e))},fetchAll:function(){var n,r,t=this;return this.isXl?Promise.all(function(){var e,t=[];for(n in e=this.sub.font)r=e[n],t.push(r);return t}.call(this).map(function(e){return t._fetch(e,!0,"woff")})):this._fetch(this.sub.font[0],!0,"ttf")},fetch:function(e,o){var s,i=this;if(null==e&&(e=[]),null==o&&(o=!1),!this.isXl){if(this.sub.font[0]&&this.sub.font[0].blob)return Promise.resolve();e=[0]}return s=this.doMerge,e=Array.from(new Set(e.map(function(e){return e}))).filter(function(e){return!i.sub.font[e]}).map(function(e,t){var n,r;return i.sub.font[e]=n={key:e},r=i.isXl?"woff":"ttf",n.needMerge=1!=+e,i._fetch(n,!!s||o,r)}),Promise.all(e).then(function(n){var e;return s?(e=n.filter(function(e){return e.needMerge}).map(function(r){return new Promise(function(e,t){var n=new FileReader;return n.onerror=function(e){return t(e)},n.onload=function(){return e(n.result)},n.readAsArrayBuffer(r.blob)})}),Promise.all(e).then(function(e){return t({bufs:e,useWorker:i.useWorker})}).then(function(e){var t;return e?(t=n.filter(function(e){return e.needMerge})[0],e=new Blob([e],{type:"font/"+(t.type||"ttf")}),t={url:URL.createObjectURL(e),blob:e,type:t.type||"ttf"},n.filter(function(e){return!e.needMerge}).concat([t])):n.filter(function(e){return!e.needMerge})})):n}).then(function(e){var t,n,r,o,s;if(e.length){for(t="",n=0,r=e.length;n<r;++n)o=e[n],s=i._format(o.type),t+='@font-face {\n font-family: "'+i.cssName+'";\n src: url("'+o.url+'") '+s+";\n font-style: "+i.style+";\n font-weight: "+i.weight+";\n}";return t+="."+i.className+' { font-family: "'+i.cssName+'"; }',i.css.push({content:t})}})},hasChar:function(e){return void 0===this.misschar[e]?void 0:!this.misshcar[e]},getPath:function(e){var s=this,e=l({text:"",x:0,y:0,fontSize:48},e=null==e?{}:e),i=e.text,u=e.x,f=e.y,a=e.fontSize;return this.sync(i).then(function(){return s.getotf()}).then(function(e){for(var t,n="",r=0,o=i.length;r<o;++r)t=r,n+=s.misschar[i[t]]?" ":i[t];return e.getPath(n,u,f,a)})},getotf:function(){var o=this;return"undefined"==typeof opentype||null===opentype?Promise.reject(i({id:1022,message:"[@plotdb/xfl] need opentype.js to merge subfonts"})):this.otf.dirty?Promise.resolve().then(function(){return o.isXl?o.fetchAll():o.fetch()}).then(function(){var n,r,e=function(){var e,t=[];for(n in e=this.sub.font)r=e[n],t.push(r);return t}.call(o).map(function(n){return n.otf?Promise.resolve(n):Array.isArray(n._ps)?new Promise(function(e,t){return n._ps.push({res:e,rej:t})}):(n._ps=[],opentype.load(n.url).then(function(e){return n.otf=e,n._ps.map(function(e){return e.res(n)}),n}))});return Promise.all(e)}).then(function(e){var t;return 1===(e=null==e?[]:e).length?e[0].otf:(t=e.map(function(e){for(var t,n=[],r=e.otf.glyphs,o=1,s=r.length;o<=s;++o)t=o,n.push(r.glyphs[t]);return n}).reduce(function(e,t){return e.concat(t)},[]).filter(function(e){return e}),o.otf.font=new opentype.Font(((t={familyName:o.cssName,styleName:o.style||"normal",glyphs:t}).unitsPerEm=(e=e[0].otf).unitsPerEm,t.ascender=e.ascender,t.descender=e.descender,t)),o.otf.font.kerningPairs={},o.otf.font)}):Promise.resolve(this.otf.font)},sync:function(a){var l=this;return null==a&&(a=""),this.isXl?Promise.resolve().then(function(){for(var e,t,n,r,o=[{},{}],s=o[0],i=o[1],u=0,f=a.length;u<f;++u)e=u,t=a.charCodeAt(e),l.cjkOnly&&!c.isCJK(t)||(t=l.codemap[t.toString(16)],l.misschar[a[e]]=s[a[e]]=!t,t&&!l.sub.set[t]&&(l.sub.set[t]=i[t]=!0));for(n in(s=function(){var e=[];for(n in s)e.push(n);return e}().filter(function(e){return s[e]})).length&&console.log("[@plotdb/xfl] sync xl-font with following chars unsupported: "+s.join("")),r=[],i)r.push(n);if((o=r).length)return l.fetch(o)}).then(function(){return c.update()}):(c.update(),Promise.resolve())}}),c={xlfont:o,range:{CJK:[[12352,12543],[13312,19903],[19968,40959],[63744,64255],[65382,65439],[12593,55197]]},fonts:{},running:{},isCJK:function(t){return this.range.CJK.filter(function(e){return t>=e[0]&&t<=e[1]}).length},proxy:{},update:function(){var n,e,t,r,o,s="";for(n in e=this.fonts)((t=e[n]).css||[]).filter(i).map(u);return s&&((r=document.createElement("style")).textContent=s,r.setAttribute("type","text/css"),document.body.appendChild(r)),Promise.all(function(){var e,t=[];for(n in e=this.fonts)o=e[n],t.push(o);return t}.call(this).map(function(){return document.fonts.load("16px "+t.cssName)})).then(function(){});function i(e){return!e.rendered}function u(e){return e.rendered=!0,s+=e.content}},_load:function(t){var n=this,r=(t=null==t?{}:t).path;if(!this.running[r])return this.running[r]=!0,Promise.resolve().then(function(){var e;return n.fonts[r]=e=new o(t),e.init()}).finally(function(){return n.running[r]=!1}).then(function(){return n.proxy[r].resolve(n.fonts[r]),n.fonts[r]}).catch(function(e){return n.proxy[r].reject(e),Promise.reject(e)})},load:function(o){var s=this;return"string"==typeof(o=null==o?{}:o)&&(o={path:o}),new Promise(function(t,n){var e,r;return(e=o.path)?(e=e.replace(/\/$/,""),(r=s.fonts[e])?t(r):(s.proxy[e]||(s.proxy[e]=proxise(function(e){return s._load(e)})),s.proxy[e](((r=l({},o)).path=e,r)).then(function(e){return t(e)}).catch(function(e){return n(e)}))):n(i({id:400}))})},track:function(e){return this.fonts[e.path||e.name]=e}},"undefined"!=typeof module&&null!==module?module.exports=c:"undefined"!=typeof window&&null!==window&&(window.xfl=c)}();
package/package.json CHANGED
@@ -1 +1 @@
1
- {"author":"zbryikt","name":"@xlfont/load","license":"MIT","description":"XL font generator and loader","version":"2.1.2","browser":"index.min.js","main":"index.min.js","homepage":"https://github.com/xlfont/load","repository":{"type":"git","url":"https://github.com/xlfont/load"},"engines":{"node":">=10.14.1","npm":">=6.4.1"},"scripts":{"start":"npx server -r web -o true"},"bin":{"xfl":"./bin/build.js","xfl-meta":"./bin/meta.js"},"dependencies":{"@plotdb/colors":"^0.0.1","@plotdb/opentype.js":"^1.3.5","fs-extra":"^9.1.0","progress":"^2.0.3","ttf2woff":"^2.0.2","ttf2woff2":"^4.0.0","yargs":"^16.2.0"},"devDependencies":{"@loadingio/bootstrap.ext":"^0.0.4","@loadingio/debounce.js":"^1.0.1","@loadingio/ldquery":"^3.0.1","@loadingio/loading.css":"^3.0.0","@zbryikt/deploy":"^0.0.1","@zbryikt/template":"^2.3.33","bootstrap":"^4.5.3","bootstrap.native":"^3.0.13","fedep":"^1.1.1","glob":"^7.2.0","ldbutton":"^2.0.0","ldcover":"^3.0.1","ldloader":"^3.0.0","ldview":"^1.0.0","livescript":"^1.6.0","stylus":"^0.55.0","uglify-js":"^3.13.1","uglifycss":"^0.0.29"},"peerDependencies":{"@plotdb/opentype.js":"^1.3.5","proxise":"^1.0.1"},"frontendDependencies":{"root":"web/static/assets/lib","modules":["bootstrap","bootstrap.native","@loadingio/bootstrap.ext","@loadingio/ldquery","@loadingio/debounce.js","@loadingio/loading.css","@plotdb/opentype.js","ldview","ldcover","ldloader","ldbutton","proxise"]}}
1
+ {"author":"zbryikt","name":"@xlfont/load","license":"MIT","description":"XL font generator and loader","version":"2.1.4","browser":"index.min.js","main":"index.min.js","homepage":"https://github.com/xlfont/load","repository":{"type":"git","url":"https://github.com/xlfont/load"},"engines":{"node":">=10.14.1","npm":">=6.4.1"},"scripts":{"start":"npx server -r web -o true"},"bin":{"xfl":"./bin/build.js","xfl-meta":"./bin/meta.js"},"dependencies":{"@plotdb/colors":"^0.0.3","@plotdb/opentype.js":"^1.3.5","fs-extra":"^9.1.0","progress":"^2.0.3","ttf2woff":"^2.0.2","ttf2woff2":"^4.0.0","yargs":"^16.2.0"},"devDependencies":{"@loadingio/bootstrap.ext":"^0.0.10","@loadingio/debounce.js":"^1.0.1","@loadingio/ldquery":"^3.0.5","@loadingio/loading.css":"^3.1.0","@zbryikt/deploy":"^0.0.4","@zbryikt/template":"^2.3.45","bootstrap":"^4.5.3","bootstrap.native":"^3.0.13","fedep":"^1.1.11","glob":"^7.2.0","ldbutton":"^2.0.1","ldcover":"^3.5.3","ldloader":"^3.0.2","ldview":"^1.4.0","livescript":"^1.6.0","stylus":"^0.55.0","uglify-js":"^3.13.1","uglifycss":"^0.0.29"},"peerDependencies":{"@plotdb/opentype.js":"^1.3.5","proxise":"^1.0.1"},"frontendDependencies":{"root":"web/static/assets/lib","modules":["bootstrap","bootstrap.native","@loadingio/bootstrap.ext","@loadingio/ldquery","@loadingio/debounce.js","@loadingio/loading.css","@plotdb/opentype.js","ldview","ldcover","ldloader","ldbutton","proxise"]}}
package/dist/index.js DELETED
@@ -1,607 +0,0 @@
1
- (function() { var xlfWorkerCode = 'var local={},onmessage=function(e){var e=e.data||{},n=e.bufs,p=e.key,e=e.lib;return local.inited||(importScripts(e||"opentype.js"),local.inited=!0),Promise.resolve().then(function(){return n.map(function(e){return opentype.parse(e)})}).then(function(e){for(var n,t,r,s,a,o=[],l=0,i=e.length;l<i;++l)for(t=0,r=(n=e[l]).glyphs.length;t<r;++t)s=t,o.push(n.glyphs.glyphs[s]);return n=e[0],a=new opentype.Font(((a={glyphs:o,familyName:n.names.fontFamily.en,styleName:n.names.fontSubfamily.en}).unitsPerEm=n.unitsPerEm,a.ascender=n.ascender,a.descender=n.descender,a)),postMessage({buf:a.toArrayBuffer(),key:p})})};'; var err, xlfWorker, xlfMerger, xlfont, xfl;
2
- err = function(e){
3
- e == null && (e = {});
4
- return import$(new Error(), import$({
5
- name: 'lderror'
6
- }, e));
7
- };
8
- xlfWorker = {
9
- key: 0,
10
- worker: null,
11
- queue: [],
12
- init: function(opt){
13
- var this$ = this;
14
- opt == null && (opt = {});
15
- return Promise.resolve().then(function(){
16
- var url;
17
- if (this$.worker) {
18
- return;
19
- }
20
- url = URL.createObjectURL(new Blob([xlfWorkerCode], {
21
- type: 'text/javascript'
22
- }));
23
- this$.worker = new Worker(url);
24
- URL.revokeObjectURL(url);
25
- return this$.worker.onmessage = function(e){
26
- var ref$, buf, key, item;
27
- ref$ = e.data, buf = ref$.buf, key = ref$.key;
28
- if (!(item = this$.queue.filter(function(q){
29
- return key === q.key;
30
- })[0])) {
31
- return;
32
- }
33
- this$.queue.splice(this$.queue.indexOf(item), 1);
34
- return item.res(buf);
35
- };
36
- });
37
- },
38
- run: function(abs, opt){
39
- var this$ = this;
40
- return new Promise(function(res, rej){
41
- return this$.init(opt).then(function(){
42
- var item;
43
- this$.queue.push(item = {
44
- res: res,
45
- rej: rej,
46
- key: this$.key++
47
- });
48
- return this$.worker.postMessage({
49
- bufs: abs,
50
- key: item.key,
51
- lib: opt.opentypeUrl
52
- });
53
- });
54
- });
55
- }
56
- };
57
- xlfMerger = function(arg$){
58
- var bufs, useWorker;
59
- bufs = arg$.bufs, useWorker = arg$.useWorker;
60
- if (!bufs.length) {
61
- return Promise.resolve();
62
- }
63
- if (useWorker) {
64
- return xlfWorker.run(bufs, useWorker);
65
- }
66
- return Promise.resolve().then(function(){
67
- return bufs.map(function(it){
68
- return opentype.parse(it);
69
- });
70
- }).then(function(fonts){
71
- var glyphs, i$, len$, font, j$, to$, i, merged, ref$;
72
- glyphs = [];
73
- for (i$ = 0, len$ = fonts.length; i$ < len$; ++i$) {
74
- font = fonts[i$];
75
- for (j$ = 0, to$ = font.glyphs.length; j$ < to$; ++j$) {
76
- i = j$;
77
- glyphs.push(font.glyphs.glyphs[i]);
78
- }
79
- }
80
- font = fonts[0];
81
- merged = new opentype.Font((ref$ = {
82
- glyphs: glyphs,
83
- familyName: font.names.fontFamily.en,
84
- styleName: font.names.fontSubfamily.en
85
- }, ref$.unitsPerEm = font.unitsPerEm, ref$.ascender = font.ascender, ref$.descender = font.descender, ref$));
86
- return merged.toArrayBuffer();
87
- });
88
- };
89
- xlfont = function(opt){
90
- var this$ = this;
91
- opt == null && (opt = {});
92
- this.opt = opt;
93
- this.sub = {
94
- set: {},
95
- font: {}
96
- };
97
- this.cjkOnly = opt.cjkOnly || false;
98
- this.codemap = {};
99
- this.otf = {
100
- font: null,
101
- dirty: true
102
- };
103
- this.path = opt.path;
104
- this.name = opt.name || this.path.replace(/\.[a-zA-Z0-9]+$/, '').replace(/^https?:\/\/[^/]+\//g, '').replace(/\s/g, '-').replace(/\//g, '-').toLowerCase();
105
- this.style = opt.style || 'normal';
106
- this.weight = opt.weight || '400';
107
- this.ext = opt.ext || (/\.(ttf|otf|woff2|woff)$/.exec(this.path) || [])[1] || '';
108
- this.format = this._format(this.ext);
109
- this.className = "xfl-" + (this.name || '').replace(/\s+/g, '_') + "-" + Math.random().toString(36).substring(2);
110
- this.isXl = opt.isXl != null
111
- ? opt.isXl
112
- : !this.ext;
113
- if (!this.ext) {
114
- this.ext = 'woff';
115
- }
116
- this.doMerge = opt.doMerge != null ? opt.doMerge : false;
117
- this.useWorker = opt.useWorker != null ? opt.useWorker : false;
118
- this.misschar = {};
119
- this.css = [];
120
- this.init = proxise.once(function(){
121
- return this$._init();
122
- });
123
- this.init();
124
- return this;
125
- };
126
- xlfont.prototype = import$(Object.create(Object.prototype), {
127
- _format: function(f){
128
- f == null && (f = '');
129
- f = f.toLowerCase();
130
- f = f === 'ttf'
131
- ? 'truetype'
132
- : f === 'otf' ? 'truetype' : f;
133
- return "format('" + f + "')";
134
- },
135
- _init: function(){
136
- var this$ = this;
137
- return Promise.resolve().then(function(){
138
- if (!this$.isXl) {
139
- this$.css = [{
140
- content: "@font-face {\n font-family: \"" + this$.name + "\";\n src: url(\"" + this$.path + "\") " + this$.format + ";\n font-style: " + this$.style + ";\n font-weight: " + this$.weight + ";\n}\n." + this$.className + " { font-family: \"" + this$.name + "\"; }"
141
- }];
142
- return xfl.update();
143
- } else {
144
- return new Promise(function(res, rej){
145
- var xhr;
146
- xhr = new XMLHttpRequest();
147
- xhr.addEventListener('readystatechange', function(){
148
- if (xhr.readyState !== XMLHttpRequest.DONE) {
149
- return;
150
- }
151
- if (xhr.status !== 200) {
152
- return rej(err({
153
- code: xhr.status,
154
- message: xhr.responseText
155
- }));
156
- }
157
- (xhr.responseText || '').split('\n').map(function(d, i){
158
- return d.split(' ').map(function(e, j){
159
- return this$.codemap[e] = i + 1;
160
- });
161
- });
162
- return res();
163
- });
164
- xhr.open('GET', this$.path + "/charmap.txt");
165
- return xhr.send();
166
- });
167
- }
168
- });
169
- },
170
- _fetch: function(f, dofetch, type){
171
- var this$ = this;
172
- f == null && (f = {});
173
- dofetch == null && (dofetch = false);
174
- type == null && (type = 'ttf');
175
- if (!dofetch) {
176
- if (!f.url) {
177
- if (this.isXl) {
178
- f.url = this.path + "/" + f.key + "." + type;
179
- f.type = type;
180
- } else {
181
- f.url = this.path;
182
- f.type = this.ext.toLowerCase() || type;
183
- }
184
- }
185
- return Promise.resolve(f);
186
- }
187
- if (f.blob) {
188
- return Promise.resolve(f);
189
- }
190
- if (!f.proxy) {
191
- f.proxy = proxise(function(f){
192
- var p;
193
- if (f.running) {
194
- return;
195
- }
196
- f.running = true;
197
- p = new Promise(function(res, rej){
198
- var xhr;
199
- if (f.blob) {
200
- return res(f);
201
- }
202
- xhr = new XMLHttpRequest();
203
- xhr.addEventListener('readystatechange', function(){
204
- if (xhr.readyState !== XMLHttpRequest.DONE) {
205
- return;
206
- }
207
- if (xhr.status !== 200) {
208
- return rej(err({
209
- code: xhr.status,
210
- message: xhr.responseText
211
- }));
212
- }
213
- this$.otf.dirty = true;
214
- f.url = URL.createObjectURL(xhr.response);
215
- f.blob = xhr.response;
216
- f.type = this$.ext.toLowerCase() || type;
217
- return res(f);
218
- });
219
- if (this$.isXl) {
220
- xhr.open('GET', this$.path + "/" + f.key + "." + type);
221
- } else {
222
- xhr.open('GET', this$.path);
223
- }
224
- xhr.responseType = 'blob';
225
- return xhr.send();
226
- });
227
- return p['finally'](function(){
228
- return f.running = false;
229
- }).then(function(){
230
- return f.proxy.resolve(f);
231
- }).then(function(){
232
- return f;
233
- });
234
- });
235
- }
236
- return f.proxy(f);
237
- },
238
- fetchAll: function(){
239
- var k, f, this$ = this;
240
- if (this.isXl) {
241
- return Promise.all((function(){
242
- var ref$, results$ = [];
243
- for (k in ref$ = this.sub.font) {
244
- f = ref$[k];
245
- results$.push(f);
246
- }
247
- return results$;
248
- }.call(this)).map(function(it){
249
- return this$._fetch(it, true, 'woff');
250
- }));
251
- } else {
252
- return this._fetch(this.sub.font[0], true, 'ttf');
253
- }
254
- },
255
- fetch: function(list, dofetch){
256
- var doMerge, ps, this$ = this;
257
- list == null && (list = []);
258
- dofetch == null && (dofetch = false);
259
- if (!this.isXl) {
260
- if (this.sub.font[0] && this.sub.font[0].blob) {
261
- return Promise.resolve();
262
- }
263
- list = [0];
264
- }
265
- doMerge = this.doMerge;
266
- ps = Array.from(new Set(list.map(function(it){
267
- return it;
268
- }))).filter(function(it){
269
- return !this$.sub.font[it];
270
- }).map(function(d, i){
271
- var f, type;
272
- this$.sub.font[d] = f = {
273
- key: d
274
- };
275
- type = !this$.isXl ? 'ttf' : 'woff';
276
- f.needMerge = +d !== 1;
277
- return this$._fetch(f, !doMerge ? dofetch : true, type);
278
- });
279
- return Promise.all(ps).then(function(subfonts){
280
- var ps;
281
- if (!doMerge) {
282
- return subfonts;
283
- }
284
- ps = subfonts.filter(function(it){
285
- return it.needMerge;
286
- }).map(function(font){
287
- return new Promise(function(res, rej){
288
- var fr;
289
- fr = new FileReader();
290
- fr.onerror = function(it){
291
- return rej(it);
292
- };
293
- fr.onload = function(){
294
- return res(fr.result);
295
- };
296
- return fr.readAsArrayBuffer(font.blob);
297
- });
298
- });
299
- return Promise.all(ps).then(function(it){
300
- return xlfMerger({
301
- bufs: it,
302
- useWorker: this$.useWorker
303
- });
304
- }).then(function(ab){
305
- var font, blob;
306
- if (!ab) {
307
- return subfonts.filter(function(it){
308
- return !it.needMerge;
309
- });
310
- }
311
- font = subfonts.filter(function(it){
312
- return it.needMerge;
313
- })[0];
314
- blob = new Blob([ab], {
315
- type: "font/" + (font.type || 'ttf')
316
- });
317
- font = {
318
- url: URL.createObjectURL(blob),
319
- blob: blob,
320
- type: font.type || 'ttf'
321
- };
322
- return subfonts.filter(function(it){
323
- return !it.needMerge;
324
- }).concat([font]);
325
- });
326
- }).then(function(subfonts){
327
- var css, i$, len$, f, format;
328
- if (!subfonts.length) {
329
- return;
330
- }
331
- css = "";
332
- for (i$ = 0, len$ = subfonts.length; i$ < len$; ++i$) {
333
- f = subfonts[i$];
334
- format = this$._format(f.type);
335
- css += "@font-face {\n font-family: \"" + this$.name + "\";\n src: url(\"" + f.url + "\") " + format + ";\n font-style: " + this$.style + ";\n font-weight: " + this$.weight + ";\n}";
336
- }
337
- css += "." + this$.className + " { font-family: \"" + this$.name + "\"; }";
338
- return this$.css.push({
339
- content: css
340
- });
341
- });
342
- },
343
- hasChar: function(c){
344
- return typeof this.misschar[c] === 'undefined'
345
- ? undefined
346
- : !this.misshcar[c];
347
- },
348
- getPath: function(opt){
349
- var ref$, text, x, y, fontSize, this$ = this;
350
- opt == null && (opt = {});
351
- ref$ = import$({
352
- text: '',
353
- x: 0,
354
- y: 0,
355
- fontSize: 48
356
- }, opt), text = ref$.text, x = ref$.x, y = ref$.y, fontSize = ref$.fontSize;
357
- return this.sync(text).then(function(){
358
- return this$.getotf();
359
- }).then(function(otf){
360
- var txt, i$, to$, i, path;
361
- txt = '';
362
- for (i$ = 0, to$ = text.length; i$ < to$; ++i$) {
363
- i = i$;
364
- txt += !this$.misschar[text[i]] ? text[i] : ' ';
365
- }
366
- path = otf.getPath(txt, x, y, fontSize);
367
- return path;
368
- });
369
- },
370
- getotf: function(){
371
- var this$ = this;
372
- if (!(typeof opentype != 'undefined' && opentype !== null)) {
373
- return Promise.reject(err({
374
- id: 1022,
375
- message: "[@plotdb/xfl] need opentype.js to merge subfonts"
376
- }));
377
- }
378
- if (!this.otf.dirty) {
379
- return Promise.resolve(this.otf.font);
380
- }
381
- return Promise.resolve().then(function(){
382
- if (!this$.isXl) {
383
- return this$.fetch();
384
- } else {
385
- return this$.fetchAll();
386
- }
387
- }).then(function(){
388
- var ps, k, f;
389
- ps = (function(){
390
- var ref$, results$ = [];
391
- for (k in ref$ = this.sub.font) {
392
- f = ref$[k];
393
- results$.push(f);
394
- }
395
- return results$;
396
- }.call(this$)).map(function(f){
397
- if (f.otf) {
398
- return Promise.resolve(f);
399
- }
400
- if (Array.isArray(f._ps)) {
401
- return new Promise(function(res, rej){
402
- return f._ps.push({
403
- res: res,
404
- rej: rej
405
- });
406
- });
407
- }
408
- f._ps = [];
409
- return opentype.load(f.url).then(function(it){
410
- f.otf = it;
411
- f._ps.map(function(it){
412
- return it.res(f);
413
- });
414
- return f;
415
- });
416
- });
417
- return Promise.all(ps);
418
- }).then(function(list){
419
- var glyphs, ref$, ref1$;
420
- list == null && (list = []);
421
- if (list.length === 1) {
422
- return list[0].otf;
423
- }
424
- glyphs = list.map(function(f){
425
- var glyphs, i$, to$, i, results$ = [];
426
- glyphs = f.otf.glyphs;
427
- for (i$ = 1, to$ = glyphs.length; i$ <= to$; ++i$) {
428
- i = i$;
429
- results$.push(glyphs.glyphs[i]);
430
- }
431
- return results$;
432
- }).reduce(function(a, b){
433
- return a.concat(b);
434
- }, []).filter(function(it){
435
- return it;
436
- });
437
- this$.otf.font = new opentype.Font((ref1$ = {
438
- familyName: this$.name,
439
- styleName: this$.style || 'normal',
440
- glyphs: glyphs
441
- }, ref1$.unitsPerEm = (ref$ = list[0].otf).unitsPerEm, ref1$.ascender = ref$.ascender, ref1$.descender = ref$.descender, ref1$));
442
- this$.otf.font.kerningPairs = {};
443
- return this$.otf.font;
444
- });
445
- },
446
- sync: function(txt){
447
- var this$ = this;
448
- txt == null && (txt = "");
449
- if (!this.isXl) {
450
- xfl.update();
451
- return Promise.resolve();
452
- }
453
- return Promise.resolve().then(function(){
454
- var ref$, misscodes, missset, i$, to$, i, code, setIdx, k, list, res$;
455
- ref$ = [{}, {}], misscodes = ref$[0], missset = ref$[1];
456
- for (i$ = 0, to$ = txt.length; i$ < to$; ++i$) {
457
- i = i$;
458
- code = txt.charCodeAt(i);
459
- if (this$.cjkOnly && !xfl.isCJK(code)) {
460
- continue;
461
- }
462
- setIdx = this$.codemap[code.toString(16)];
463
- this$.misschar[txt[i]] = misscodes[txt[i]] = !setIdx ? true : false;
464
- if (setIdx && !this$.sub.set[setIdx]) {
465
- this$.sub.set[setIdx] = missset[setIdx] = true;
466
- }
467
- }
468
- misscodes = (function(){
469
- var results$ = [];
470
- for (k in misscodes) {
471
- results$.push(k);
472
- }
473
- return results$;
474
- }()).filter(function(it){
475
- return misscodes[it];
476
- });
477
- if (misscodes.length) {
478
- console.log("[@plotdb/xfl] sync xl-font with following chars unsupported: " + misscodes.join(''));
479
- }
480
- res$ = [];
481
- for (k in missset) {
482
- res$.push(k);
483
- }
484
- list = res$;
485
- if (list.length) {
486
- return this$.fetch(list);
487
- }
488
- }).then(function(){
489
- return xfl.update();
490
- });
491
- }
492
- });
493
- xfl = {
494
- xlfont: xlfont,
495
- range: {
496
- CJK: [[0x3040, 0x30ff], [0x3400, 0x4dbf], [0x4e00, 0x9fff], [0xf900, 0xfaff], [0xff66, 0xff9f], [0x3131, 0xD79D]]
497
- },
498
- fonts: {},
499
- running: {},
500
- isCJK: function(code){
501
- return this.range.CJK.filter(function(it){
502
- return code >= it[0] && code <= it[1];
503
- }).length;
504
- },
505
- proxy: {},
506
- update: function(){
507
- var css, k, ref$, v, node, f;
508
- css = "";
509
- for (k in ref$ = this.fonts) {
510
- v = ref$[k];
511
- (v.css || []).filter(fn$).map(fn1$);
512
- }
513
- if (css) {
514
- node = document.createElement("style");
515
- node.textContent = css;
516
- node.setAttribute('type', 'text/css');
517
- document.body.appendChild(node);
518
- }
519
- return Promise.all((function(){
520
- var ref$, results$ = [];
521
- for (k in ref$ = this.fonts) {
522
- f = ref$[k];
523
- results$.push(f);
524
- }
525
- return results$;
526
- }.call(this)).map(function(){
527
- return document.fonts.load("16px " + v.name);
528
- })).then(function(){
529
- return new Promise(function(res, rej){
530
- return setTimeout(function(){
531
- return res();
532
- }, 350);
533
- });
534
- });
535
- function fn$(it){
536
- return !it.rendered;
537
- }
538
- function fn1$(it){
539
- it.rendered = true;
540
- return css = css + it.content;
541
- }
542
- },
543
- _load: function(opt){
544
- var path, this$ = this;
545
- opt == null && (opt = {});
546
- path = opt.path;
547
- if (this.running[path]) {
548
- return;
549
- }
550
- this.running[path] = true;
551
- return Promise.resolve().then(function(){
552
- var fobj;
553
- this$.fonts[path] = fobj = new xlfont(opt);
554
- return fobj.init();
555
- })['finally'](function(){
556
- return this$.running[path] = false;
557
- }).then(function(){
558
- this$.proxy[path].resolve(this$.fonts[path]);
559
- return this$.fonts[path];
560
- })['catch'](function(it){
561
- this$.proxy[path].reject(it);
562
- return Promise.reject(it);
563
- });
564
- },
565
- load: function(opt){
566
- var this$ = this;
567
- opt == null && (opt = {});
568
- if (typeof opt === 'string') {
569
- opt = {
570
- path: opt
571
- };
572
- }
573
- return new Promise(function(res, rej){
574
- var path, that, ref$;
575
- if (!(path = opt.path)) {
576
- return rej(err({
577
- id: 400
578
- }));
579
- }
580
- path = path.replace(/\/$/, '');
581
- if (that = this$.fonts[path]) {
582
- return res(that);
583
- }
584
- if (!this$.proxy[path]) {
585
- this$.proxy[path] = proxise(function(it){
586
- return this$._load(it);
587
- });
588
- }
589
- return this$.proxy[path]((ref$ = import$({}, opt), ref$.path = path, ref$)).then(function(it){
590
- return res(it);
591
- })['catch'](function(it){
592
- return rej(it);
593
- });
594
- });
595
- }
596
- };
597
- if (typeof module != 'undefined' && module !== null) {
598
- module.exports = xfl;
599
- } else if (typeof window != 'undefined' && window !== null) {
600
- window.xfl = xfl;
601
- }
602
- function import$(obj, src){
603
- var own = {}.hasOwnProperty;
604
- for (var key in src) if (own.call(src, key)) obj[key] = src[key];
605
- return obj;
606
- }
607
- }());
package/dist/index.min.js DELETED
@@ -1 +0,0 @@
1
- !function(){var i,n,t,o,c;function l(e,t){var n,r={}.hasOwnProperty;for(n in t)r.call(t,n)&&(e[n]=t[n]);return e}i=function(e){return null==e&&(e={}),l(new Error,l({name:"lderror"},e))},n={key:0,worker:null,queue:[],init:function(e){var r=this;return null==e&&(e={}),Promise.resolve().then(function(){var e;if(!r.worker)return e=URL.createObjectURL(new Blob(['var local={},onmessage=function(e){var e=e.data||{},n=e.bufs,p=e.key,e=e.lib;return local.inited||(importScripts(e||"opentype.js"),local.inited=!0),Promise.resolve().then(function(){return n.map(function(e){return opentype.parse(e)})}).then(function(e){for(var n,t,r,s,a,o=[],l=0,i=e.length;l<i;++l)for(t=0,r=(n=e[l]).glyphs.length;t<r;++t)s=t,o.push(n.glyphs.glyphs[s]);return n=e[0],a=new opentype.Font(((a={glyphs:o,familyName:n.names.fontFamily.en,styleName:n.names.fontSubfamily.en}).unitsPerEm=n.unitsPerEm,a.ascender=n.ascender,a.descender=n.descender,a)),postMessage({buf:a.toArrayBuffer(),key:p})})};'],{type:"text/javascript"})),r.worker=new Worker(e),URL.revokeObjectURL(e),r.worker.onmessage=function(e){var t=e.data,e=t.buf,n=t.key;if(t=r.queue.filter(function(e){return n===e.key})[0])return r.queue.splice(r.queue.indexOf(t),1),t.res(e)}})},run:function(r,o){var s=this;return new Promise(function(t,n){return s.init(o).then(function(){var e;return s.queue.push(e={res:t,rej:n,key:s.key++}),s.worker.postMessage({bufs:r,key:e.key,lib:o.opentypeUrl})})})}},t=function(e){var t=e.bufs,e=e.useWorker;return t.length?e?n.run(t,e):Promise.resolve().then(function(){return t.map(function(e){return opentype.parse(e)})}).then(function(e){for(var t,n,r,o,s,i=[],u=0,f=e.length;u<f;++u)for(n=0,r=(t=e[u]).glyphs.length;n<r;++n)o=n,i.push(t.glyphs.glyphs[o]);return t=e[0],new opentype.Font(((s={glyphs:i,familyName:t.names.fontFamily.en,styleName:t.names.fontSubfamily.en}).unitsPerEm=t.unitsPerEm,s.ascender=t.ascender,s.descender=t.descender,s)).toArrayBuffer()}):Promise.resolve()},(o=function(e){var t=this;return this.opt=e=null==e?{}:e,this.sub={set:{},font:{}},this.cjkOnly=e.cjkOnly||!1,this.codemap={},this.otf={font:null,dirty:!0},this.path=e.path,this.name=e.name||this.path.replace(/\.[a-zA-Z0-9]+$/,"").replace(/^https?:\/\/[^/]+\//g,"").replace(/\s/g,"-").replace(/\//g,"-").toLowerCase(),this.style=e.style||"normal",this.weight=e.weight||"400",this.ext=e.ext||(/\.(ttf|otf|woff2|woff)$/.exec(this.path)||[])[1]||"",this.format=this._format(this.ext),this.className="xfl-"+(this.name||"").replace(/\s+/g,"_")+"-"+Math.random().toString(36).substring(2),this.isXl=null!=e.isXl?e.isXl:!this.ext,this.ext||(this.ext="woff"),this.doMerge=null!=e.doMerge&&e.doMerge,this.useWorker=null!=e.useWorker&&e.useWorker,this.misschar={},this.css=[],this.init=proxise.once(function(){return t._init()}),this.init(),this}).prototype=l(Object.create(Object.prototype),{_format:function(e){return"format('"+(e="ttf"===(e=(e=null==e?"":e).toLowerCase())||"otf"===e?"truetype":e)+"')"},_init:function(){var r=this;return Promise.resolve().then(function(){return r.isXl?new Promise(function(e,t){var n=new XMLHttpRequest;return n.addEventListener("readystatechange",function(){if(n.readyState===XMLHttpRequest.DONE)return 200!==n.status?t(i({code:n.status,message:n.responseText})):((n.responseText||"").split("\n").map(function(e,n){return e.split(" ").map(function(e,t){return r.codemap[e]=n+1})}),e())}),n.open("GET",r.path+"/charmap.txt"),n.send()}):(r.css=[{content:'@font-face {\n font-family: "'+r.name+'";\n src: url("'+r.path+'") '+r.format+";\n font-style: "+r.style+";\n font-weight: "+r.weight+";\n}\n."+r.className+' { font-family: "'+r.name+'"; }'}],c.update())})},_fetch:function(e,t,o){var s=this;return null==e&&(e={}),null==o&&(o="ttf"),(t=null!=t&&t)?e.blob?Promise.resolve(e):(e.proxy||(e.proxy=proxise(function(r){if(!r.running)return r.running=!0,new Promise(function(e,t){var n;return r.blob?e(r):((n=new XMLHttpRequest).addEventListener("readystatechange",function(){if(n.readyState===XMLHttpRequest.DONE)return 200!==n.status?t(i({code:n.status,message:n.responseText})):(s.otf.dirty=!0,r.url=URL.createObjectURL(n.response),r.blob=n.response,r.type=s.ext.toLowerCase()||o,e(r))}),s.isXl?n.open("GET",s.path+"/"+r.key+"."+o):n.open("GET",s.path),n.responseType="blob",n.send())}).finally(function(){return r.running=!1}).then(function(){return r.proxy.resolve(r)}).then(function(){return r})})),e.proxy(e)):(e.url||(this.isXl?(e.url=this.path+"/"+e.key+"."+o,e.type=o):(e.url=this.path,e.type=this.ext.toLowerCase()||o)),Promise.resolve(e))},fetchAll:function(){var n,r,t=this;return this.isXl?Promise.all(function(){var e,t=[];for(n in e=this.sub.font)r=e[n],t.push(r);return t}.call(this).map(function(e){return t._fetch(e,!0,"woff")})):this._fetch(this.sub.font[0],!0,"ttf")},fetch:function(e,o){var s,i=this;if(null==e&&(e=[]),null==o&&(o=!1),!this.isXl){if(this.sub.font[0]&&this.sub.font[0].blob)return Promise.resolve();e=[0]}return s=this.doMerge,e=Array.from(new Set(e.map(function(e){return e}))).filter(function(e){return!i.sub.font[e]}).map(function(e,t){var n,r;return i.sub.font[e]=n={key:e},r=i.isXl?"woff":"ttf",n.needMerge=1!=+e,i._fetch(n,!!s||o,r)}),Promise.all(e).then(function(n){var e;return s?(e=n.filter(function(e){return e.needMerge}).map(function(r){return new Promise(function(e,t){var n=new FileReader;return n.onerror=function(e){return t(e)},n.onload=function(){return e(n.result)},n.readAsArrayBuffer(r.blob)})}),Promise.all(e).then(function(e){return t({bufs:e,useWorker:i.useWorker})}).then(function(e){var t;return e?(t=n.filter(function(e){return e.needMerge})[0],e=new Blob([e],{type:"font/"+(t.type||"ttf")}),t={url:URL.createObjectURL(e),blob:e,type:t.type||"ttf"},n.filter(function(e){return!e.needMerge}).concat([t])):n.filter(function(e){return!e.needMerge})})):n}).then(function(e){var t,n,r,o,s;if(e.length){for(t="",n=0,r=e.length;n<r;++n)o=e[n],s=i._format(o.type),t+='@font-face {\n font-family: "'+i.name+'";\n src: url("'+o.url+'") '+s+";\n font-style: "+i.style+";\n font-weight: "+i.weight+";\n}";return t+="."+i.className+' { font-family: "'+i.name+'"; }',i.css.push({content:t})}})},hasChar:function(e){return void 0===this.misschar[e]?void 0:!this.misshcar[e]},getPath:function(e){var s=this,e=l({text:"",x:0,y:0,fontSize:48},e=null==e?{}:e),i=e.text,u=e.x,f=e.y,a=e.fontSize;return this.sync(i).then(function(){return s.getotf()}).then(function(e){for(var t,n="",r=0,o=i.length;r<o;++r)t=r,n+=s.misschar[i[t]]?" ":i[t];return e.getPath(n,u,f,a)})},getotf:function(){var o=this;return"undefined"==typeof opentype||null===opentype?Promise.reject(i({id:1022,message:"[@plotdb/xfl] need opentype.js to merge subfonts"})):this.otf.dirty?Promise.resolve().then(function(){return o.isXl?o.fetchAll():o.fetch()}).then(function(){var n,r,e=function(){var e,t=[];for(n in e=this.sub.font)r=e[n],t.push(r);return t}.call(o).map(function(n){return n.otf?Promise.resolve(n):Array.isArray(n._ps)?new Promise(function(e,t){return n._ps.push({res:e,rej:t})}):(n._ps=[],opentype.load(n.url).then(function(e){return n.otf=e,n._ps.map(function(e){return e.res(n)}),n}))});return Promise.all(e)}).then(function(e){var t;return 1===(e=null==e?[]:e).length?e[0].otf:(t=e.map(function(e){for(var t,n=[],r=e.otf.glyphs,o=1,s=r.length;o<=s;++o)t=o,n.push(r.glyphs[t]);return n}).reduce(function(e,t){return e.concat(t)},[]).filter(function(e){return e}),o.otf.font=new opentype.Font(((t={familyName:o.name,styleName:o.style||"normal",glyphs:t}).unitsPerEm=(e=e[0].otf).unitsPerEm,t.ascender=e.ascender,t.descender=e.descender,t)),o.otf.font.kerningPairs={},o.otf.font)}):Promise.resolve(this.otf.font)},sync:function(a){var l=this;return null==a&&(a=""),this.isXl?Promise.resolve().then(function(){for(var e,t,n,r,o=[{},{}],s=o[0],i=o[1],u=0,f=a.length;u<f;++u)e=u,t=a.charCodeAt(e),l.cjkOnly&&!c.isCJK(t)||(t=l.codemap[t.toString(16)],l.misschar[a[e]]=s[a[e]]=!t,t&&!l.sub.set[t]&&(l.sub.set[t]=i[t]=!0));for(n in(s=function(){var e=[];for(n in s)e.push(n);return e}().filter(function(e){return s[e]})).length&&console.log("[@plotdb/xfl] sync xl-font with following chars unsupported: "+s.join("")),r=[],i)r.push(n);if((o=r).length)return l.fetch(o)}).then(function(){return c.update()}):(c.update(),Promise.resolve())}}),c={xlfont:o,range:{CJK:[[12352,12543],[13312,19903],[19968,40959],[63744,64255],[65382,65439],[12593,55197]]},fonts:{},running:{},isCJK:function(t){return this.range.CJK.filter(function(e){return t>=e[0]&&t<=e[1]}).length},proxy:{},update:function(){var n,e,t,r,o,s="";for(n in e=this.fonts)((t=e[n]).css||[]).filter(i).map(u);return s&&((r=document.createElement("style")).textContent=s,r.setAttribute("type","text/css"),document.body.appendChild(r)),Promise.all(function(){var e,t=[];for(n in e=this.fonts)o=e[n],t.push(o);return t}.call(this).map(function(){return document.fonts.load("16px "+t.name)})).then(function(){return new Promise(function(e,t){return setTimeout(function(){return e()},350)})});function i(e){return!e.rendered}function u(e){return e.rendered=!0,s+=e.content}},_load:function(t){var n=this,r=(t=null==t?{}:t).path;if(!this.running[r])return this.running[r]=!0,Promise.resolve().then(function(){var e;return n.fonts[r]=e=new o(t),e.init()}).finally(function(){return n.running[r]=!1}).then(function(){return n.proxy[r].resolve(n.fonts[r]),n.fonts[r]}).catch(function(e){return n.proxy[r].reject(e),Promise.reject(e)})},load:function(o){var s=this;return"string"==typeof(o=null==o?{}:o)&&(o={path:o}),new Promise(function(t,n){var e,r;return(e=o.path)?(e=e.replace(/\/$/,""),(r=s.fonts[e])?t(r):(s.proxy[e]||(s.proxy[e]=proxise(function(e){return s._load(e)})),s.proxy[e](((r=l({},o)).path=e,r)).then(function(e){return t(e)}).catch(function(e){return n(e)}))):n(i({id:400}))})}},"undefined"!=typeof module&&null!==module?module.exports=c:"undefined"!=typeof window&&null!==window&&(window.xfl=c)}();
package/dist/worker.js DELETED
@@ -1,35 +0,0 @@
1
- var local, onmessage;
2
- local = {};
3
- onmessage = function(e){
4
- var ref$, bufs, key, lib;
5
- ref$ = e.data || {}, bufs = ref$.bufs, key = ref$.key, lib = ref$.lib;
6
- if (!local.inited) {
7
- importScripts(lib || "opentype.js");
8
- local.inited = true;
9
- }
10
- return Promise.resolve().then(function(){
11
- return bufs.map(function(it){
12
- return opentype.parse(it);
13
- });
14
- }).then(function(fonts){
15
- var glyphs, i$, len$, font, j$, to$, i, merged, ref$;
16
- glyphs = [];
17
- for (i$ = 0, len$ = fonts.length; i$ < len$; ++i$) {
18
- font = fonts[i$];
19
- for (j$ = 0, to$ = font.glyphs.length; j$ < to$; ++j$) {
20
- i = j$;
21
- glyphs.push(font.glyphs.glyphs[i]);
22
- }
23
- }
24
- font = fonts[0];
25
- merged = new opentype.Font((ref$ = {
26
- glyphs: glyphs,
27
- familyName: font.names.fontFamily.en,
28
- styleName: font.names.fontSubfamily.en
29
- }, ref$.unitsPerEm = font.unitsPerEm, ref$.ascender = font.ascender, ref$.descender = font.descender, ref$));
30
- return postMessage({
31
- buf: merged.toArrayBuffer(),
32
- key: key
33
- });
34
- });
35
- };
@@ -1 +0,0 @@
1
- var local={},onmessage=function(e){var e=e.data||{},n=e.bufs,p=e.key,e=e.lib;return local.inited||(importScripts(e||"opentype.js"),local.inited=!0),Promise.resolve().then(function(){return n.map(function(e){return opentype.parse(e)})}).then(function(e){for(var n,t,r,s,a,o=[],l=0,i=e.length;l<i;++l)for(t=0,r=(n=e[l]).glyphs.length;t<r;++t)s=t,o.push(n.glyphs.glyphs[s]);return n=e[0],a=new opentype.Font(((a={glyphs:o,familyName:n.names.fontFamily.en,styleName:n.names.fontSubfamily.en}).unitsPerEm=n.unitsPerEm,a.ascender=n.ascender,a.descender=n.descender,a)),postMessage({buf:a.toArrayBuffer(),key:p})})};