Skip to content

Instantly share code, notes, and snippets.

@mi3tek-amb
Last active August 29, 2015 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mi3tek-amb/23d04f009cd1ad3f5384 to your computer and use it in GitHub Desktop.
Save mi3tek-amb/23d04f009cd1ad3f5384 to your computer and use it in GitHub Desktop.
#!/usr/local/bin/python
# coding: utf-8
import fontTools
from fontTools.subset import *
import hashlib
import cgi
import sys
import os
form = cgi.FieldStorage()
id = form["u"].value
family = form["f"].value
fontType = form["c"].value
weight = form["w"].value
txt = form["t"].value
#フォント作成のクラス
class createFont():
def __init__( self,dir,fontType,weight,txt ):
self.output_path = dir
self.path = fontType + '/' + weight + '.ttf'
self.txt = unicode(txt,'utf-8')
def create(self):
fontTools.subset.main([ 'font/' + self.path, "--output-file=" + self.output_path, "--text=" + self.txt, "--flavor=woff"]);
return self.output_path;
fileName = 'mf' + hashlib.md5(fontType + weight + txt).hexdigest()
cache = 'tmp/cache/'
dir = cache + fileName
# 擬似的にキャッシュファイルを作成する
# すでにキャッシュがあればキャッシュを返す
if os.path.exists(dir):
res = dir
else:
# キャッシュが300MBを越えたら削除する
total = 0
for root, dirs, files in os.walk(cache):
dir_size = sum(os.path.getsize(os.path.join(root, name)) for name in files)
total += dir_size
if total > 300000000 :
for root, dirs, files in os.walk(cache):
for name in files:
os.remove(os.path.join(root, name))
res = createFont(dir,fontType,weight,txt)
res = res.create()
#base64で書き出す
# import base64
# file = open(res, 'r')
# enc_file = base64.b64encode( file.read() )
# file.close()
# print '\tsrc:url(data:application/x-font-woff;charset=utf-8;base64,' + enc_file + ') format(\'woff\');'
print 'Content-Type: text/plain'
print
print '@font-face {'
print '\tfont-family: %s;' % family
print '\tfont-weight: %s;' % weight
print '\tsrc: url(http://wf.o-ma.me/script/%s) format(\'woff\');' % res
print '}\n'
! function(window, document, Q) {
"use strict";
var blankFont = 'data:application/x-font-woff;charset=utf-8;base64,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';
if (window.XDomainRequest) {
var crossDomainRequest = function(type) {
var f,
xdr = new XDomainRequest(),
self = this;
self.onState = 0,
self.readyState = 0,
self.responseText = null,
self.status = null,
self.response = null,
self.onprogress = null,
self.onload = null,
self.onerror = null,
self.onreadystatechange = null;
Object.defineProperties(
self, {
onState: {
set: function onState(readyState) {
self.readyState = readyState;
if ((f = self.onreadystatechange)) {
f.call(self.jhr);
}
switch (readyState) {
case -1:
self.onerror ? self.onerror() : false;
break;
case 2:
self.onprogress ? self.onprogress() : false;
break;
case 4:
self.onload ? self.onload() : false;
}
}
},
timeout: {
set: function(timeout) {
xdr.timeout = timeout;
}
}
}
);
xdr.onprogress = function() {
self.onState = 2;
};
xdr.onload = function() {
self.onState = 3,
self.response = xdr.responseText,
self.responseText = xdr.responseText,
self.onState = 4,
self.status = "200";
delete self.xdr;
};
xdr.onerror = function() {
self.onState = -1;
};
xdr.ontimeout = function() {
self.onState = -1;
};
self.xdr = xdr;
return self;
};
crossDomainRequest.prototype = {
open: function(method, url) {
this.onState = 1;
return this.xdr.open(method, url);
},
send: function(body) {
this.onState = 2;
return this.xdr.send(body);
},
setRequestHeader: function() {},
getResponseHeader: function(headerName) {
if (headerName.match(/^Content\-Type$/i)) {
return this.xdr.contentType;
} else {
return '';
}
}
};
};
function createCrossRequest() {
if (window.XDomainRequest) {
return new crossDomainRequest();
} else if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else {
return null;
}
};
function detectFontLoading(fontName, target) {
var span = document.createElement('span');
span.style.fontFamily = '"' + fontName + '", "blank"';
span.style.position = 'absolute';
span.style.top = '-100px';
span.appendChild(document.createTextNode('a'));
document.body.appendChild(span);
var timerId = setInterval(checkWidth, 100);
function checkWidth() {
if (tester.offsetWidth > 0) {
clearInterval(timerId);
each(target, function() {
this.className += '\x20' + fontName;
});
span.parentNode.removeChild(span);
}
}
};
function each(obj, handler) {
var i, value, itr, len, n,
isObj = obj.length === undefined;
if (isObj) {
handler.call(obj, 0, obj);
} else {
i = 0;
len = obj.length;
n = len % 4;
itr = (len - n) / 4;
while (n--) {
value = obj[i++];
handler.call(value, 0, value);
}
while (itr--) {
value = obj[i++];
handler.call(value, 0, value);
value = obj[i++];
handler.call(value, 0, value);
value = obj[i++];
handler.call(value, 0, value);
value = obj[i++];
handler.call(value, 0, value);
}
};
};
function IsExists(text, value) {
for (var i = 0, len = text.length; i < len; i++) {
if (value == text[i]) {
return true;
}
}
return false;
};
function joinText(obj) {
var res = '',
texts = '';
each(obj, function() {
texts += this.textContent
});
each(texts, function() {
if (!IsExists(res, this)) {
res += this;
}
});
return res;
};
var styleElement = document.createElement('style');
styleElement.setAttribute('type', 'text/css');
styleElement.setAttribute('rel', 'stylesheet');
Q.myWebfonted = function() {
each(arguments, function() {
new Q.myWebfonted.__init__(this);
});
};
Q.myWebfonted.__init__ = function(options) {
var self = this;
if ((self.blankElm = document.getElementById('m-font-blank')) == null) {
self.blankElm = styleElement.cloneNode();
self.blankElm.setAttribute('id', 'm-font-blank');
self.blankElm.innerHTML += "@font-face {font-family: 'blank'; src:url('" + blankFont + "') format('woff');}\n";
document.head.appendChild(self.blankElm);
};
if (options.useBlank) {
self.blankElm.innerHTML += options.target + '{ font-family:blank; }\n';
};
if ((self.styleElm = document.getElementById('m-font-family')) == null) {
self.styleElm = styleElement.cloneNode();
self.styleElm.setAttribute('id', 'm-font-family');
document.head.appendChild(self.styleElm);
};
self.target = document.querySelectorAll(options.target),
self.targetName = options.target,
self.fontType = self.faimries[options.fontType],
self.family = options.family ? options.family : '\'mf' + Math.random() + '\'',
self.weights = options.useWeight ? options.useWeight : [400],
self.useBlank = options.useBlank,
self.localStorage = options.localStorage,
self.passFlag = options.passFlag;
if (self.localStorage) {
if (self.checkLocalStorage()) {
self.ready(function() {
self.setting()
});
}
} else {
self.ready(function() {
self.setting()
});
};
};
Q.myWebfonted.__init__.prototype = {
checkLocalStorage: function() {
var font_ls, self = this;
if ((font_ls = window.localStorage[self.family + self.fontType])) {
self.styleElm.innerHTML += self.family + '{ font-family: ' + self.family + ',serif; }\n\n';
self.styleElm.innerHTML += font_ls;
};
return font_ls ? false : true;
},
create: function create(weights, css) {
var self = this,
weight = weights.shift(),
xhr = createCrossRequest();
xhr.open('POST', 'm-font.py');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
css += xhr.responseText;
if (weights.length) {
self.create(weights, css);
} else if (!self.passFlag) {
self.styleElm.innerHTML += css;
self.styleElm.innerHTML += '.' + self.family + '{ font-family: ' + self.family + '; }\n\n';
detectFontLoading(self.family, self.target);
if (self.localStorage) {
window.localStorage.setItem(self.family + self.fontType, css);
};
};
};
xhr.send(EncodeHTMLForm({
t: self.alltext,
f: self.family,
c: self.fontType,
u: Q.entryId,
w: weight
}));
},
setting: function setting() {
var self = this;
self.alltext = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' + joinText(self.target);
self.create(self.weights.concat(), '');
},
readyBound: false,
isReady: false,
callbackQueue: [],
ready: function(callback) {
this.registerOrRunCallback(callback);
this.bindReady();
},
registerOrRunCallback: function(callback) {
if (typeof callback === "function") {
this.callbackQueue.push(callback);
}
},
DOMReadyCallback: function() {
while (this.callbackQueue.length) {
(this.callbackQueue.shift())();
}
this.registerOrRunCallback = function(callback) {
callback();
};
},
DOMContentLoaded: function() {
if (document.addEventListener) {
document.removeEventListener("DOMContentLoaded", this.DOMContentLoaded, false);
} else {
document.detachEvent("onreadystatechange", this.DOMContentLoaded);
};
this.DOMReady();
},
DOMReady: function() {
if (!this.isReady) {
if (!document.body) {
return setTimeout(this.DOMReady, 1);
}
this.isReady = true;
this.DOMReadyCallback();
}
},
bindReady: function() {
var toplevel = false;
if (this.readyBound) {
return;
}
this.readyBound = true;
if (document.readyState !== "loading") {
this.DOMReady();
}
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", this.DOMContentLoaded.call(this), false);
window.addEventListener("load", this.DOMContentLoaded.call(this), false);
} else if (document.attachEvent) {
document.attachEvent("onreadystatechange", this.DOMContentLoaded.call(this));
window.attachEvent("onload", this.DOMContentLoaded.call(this));
try {
toplevel = window.frameElement == null;
} catch (e) {}
if (document.documentElement.doScroll && toplevel) {
doScrollCheck();
}
}
},
doScrollCheck: function() {
if (this.isReady) {
return;
}
try {
document.documentElement.doScroll("left");
} catch (error) {
setTimeout(this.doScrollCheck, 1);
return;
}
this.DOMReady();
},
faimries: {
'ほのか丸ゴシック': 'honokaGothic',
'源心丸ゴシック': 'genshinGothic-r',
'源心ゴシック': 'genshinGothic',
'やさしさゴシック': 'yasashisaGothic',
'うつくし明朝': 'utsukushimin',
'はんなり明朝': 'hannari'
/*each fonts has a license of editor copyright.*/
}
};
}(window, document, (window.Q || new Function));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment