Last active
August 29, 2015 14:18
-
-
Save mi3tek-amb/23d04f009cd1ad3f5384 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 '@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' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
! 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