Skip to content

Instantly share code, notes, and snippets.

@ten-A
Created June 21, 2016 03:01
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 ten-A/aa69b5e4a43bad99b67bed2b4532c19b to your computer and use it in GitHub Desktop.
Save ten-A/aa69b5e4a43bad99b67bed2b4532c19b to your computer and use it in GitHub Desktop.
Pick up Language informations from Open Type Font.
var MacLangID = ['English','French','German','Italian','Dutch','Swedish','Spanish','Danish','Portuguese',
'Norwegian','Hebrew','Japanese','Arabic','Finnish','Greek','Icelandic','Maltese','Turkish','Croatian',
'Chinese (Traditional)','Urdu','Hindi','Thai','Korean','Lithuanian','Polish','Hungarian','Estonian',
'Latvian','Sami','Faroese','Farsi/Persian','Russian','Chinese (Simplified)','Flemish','Irish Gaelic',
'Albanian','Romanian','Czech','Slovak','Slovenian','Yiddish','Serbian','Macedonian','Bulgarian',
'Ukrainian','Byelorussian','Uzbek','Kazakh','Azerbaijani (Cyrillic script)','Azerbaijani (Arabic script)',
'Armenian','Georgian','Moldavian','Kirghiz','Tajiki','Turkmen','Mongolian (Mongolian script)',
'Mongolian (Cyrillic script)','Pashto','Kurdish','Kashmiri','Sindhi','Tibetan','Nepali','Sanskrit',
'Marathi','Bengali','Assamese','Gujarati','Punjabi','Oriya','Malayalam','Kannada','Tamil','Telugu',
'Sinhalese','Burmese','Khmer','Lao','Vietnamese','Indonesian','Tagalong','Malay (Roman script)',
'Malay (Arabic script)','Amharic','Tigrinya','Galla','Somali','Swahili','Kinyarwanda/Ruanda','Rundi',
'Nyanja/Chewa','Malagasy','Esperanto',
'','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',
'Welsh','Basque','Catalan','Latin','Quenchua','Guarani','Aymara','Tatar','Uighur','Dzongkha',
'Javanese (Roman script)','Sundanese (Roman script)','Galician','Afrikaans','Breton','Inuktitut',
'Scottish Gaelic','Manx Gaelic','Irish Gaelic (with dot above)','Tongan','Greek (polytonic)',
'Greenlandic','Azerbaijani (Roman script)'];
var winLngID = [
[0X409,'English','United States'],
[0X436,'Afrikaans','South Africa'],
[0X041C,'Albanian','Albania'],
[0X484,'Alsatian','France'],
[0X045E,'Amharic','Ethiopia'],
[0X1401,'Arabic','Algeria'],
[0X3C01,'Arabic','Bahrain'],
[0X0C01,'Arabic','Egypt'],
[0X801,'Arabic','Iraq'],
[0X2C01,'Arabic','Jordan'],
[0X3401,'Arabic','Kuwait'],
[0X3001,'Arabic','Lebanon'],
[0X1001,'Arabic','Libya'],
[0X1801,'Arabic','Morocco'],
[0X2001,'Arabic','Oman'],
[0X4001,'Arabic','Qatar'],
[0X401,'Arabic','Saudi Arabia'],
[0X2801,'Arabic','Syria'],
[0X1C01,'Arabic','Tunisia'],
[0X3801,'Arabic','U.A.E.'],
[0X2401,'Arabic','Yemen'],
[0X042B,'Armenian','Armenia'],
[0X044D,'Assamese','India'],
[0X082C,'Azeri (Cyrillic)','Azerbaijan'],
[0X042C,'Azeri (Latin)','Azerbaijan'],
[0X046D,'Bashkir','Russia'],
[0X042D,'Basque','Basque'],
[0X423,'Belarusian','Belarus'],
[0X845,'Bengali','Bangladesh'],
[0X445,'Bengali','India'],
[0X201A,'Bosnian (Cyrillic)','Bosnia and Herzegovina'],
[0X141A,'Bosnian (Latin)','Bosnia and Herzegovina'],
[0X047E,'Breton','France'],
[0X402,'Bulgarian','Bulgaria'],
[0X403,'Catalan','Catalan'],
[0X0C04,'Chinese','Hong Kong S.A.R.'],
[0X1404,'Chinese','Macao S.A.R.'],
[0X804,'Chinese',"People's Republic of China"],
[0X1004,'Chinese','Singapore'],
[0X404,'Chinese','Taiwan'],
[0X483,'Corsican','France'],
[0X041A,'Croatian','Croatia'],
[0X101A,'Croatian (Latin)','Bosnia and Herzegovina'],
[0X405,'Czech','Czech Republic'],
[0X406,'Danish','Denmark'],
[0X048C,'Dari','Afghanistan'],
[0X465,'Divehi','Maldives'],
[0X813,'Dutch','Belgium'],
[0X413,'Dutch','Netherlands'],
[0X0C09,'English','Australia'],
[0X2809,'English','Belize'],
[0X1009,'English','Canada'],
[0X2409,'English','Caribbean'],
[0X4009,'English','India'],
[0X1809,'English','Ireland'],
[0X2009,'English','Jamaica'],
[0X4409,'English','Malaysia'],
[0X1409,'English','New Zealand'],
[0X3409,'English','Republic of the Philippines'],
[0X4809,'English','Singapore'],
[0X1C09,'English','South Africa'],
[0X2C09,'English','Trinidad and Tobago'],
[0X809,'English','United Kingdom'],
[0X3009,'English','Zimbabwe'],
[0X425,'Estonian','Estonia'],
[0X438,'Faroese','Faroe Islands'],
[0X464,'Filipino','Philippines'],
[0X040B,'Finnish','Finland'],
[0X080C,'French','Belgium'],
[0X0C0C,'French','Canada'],
[0X040C,'French','France'],
[0X140c,'French','Luxembourg'],
[0X180C,'French','Principality of Monoco'],
[0X100C,'French','Switzerland'],
[0X462,'Frisian','Netherlands'],
[0X456,'Galician','Galician'],
[0X437,'Georgian','Georgia'],
[0X0C07,'German','Austria'],
[0X407,'German','Germany'],
[0X1407,'German','Liechtenstein'],
[0X1007,'German','Luxembourg'],
[0X807,'German','Switzerland'],
[0X408,'Greek','Greece'],
[0X046F,'Greenlandic','Greenland'],
[0X447,'Gujarati','India'],
[0X468,'Hausa (Latin)','Nigeria'],
[0X040D,'Hebrew','Israel'],
[0X439,'Hindi','India'],
[0X040E,'Hungarian','Hungary'],
[0X040F,'Icelandic','Iceland'],
[0X470,'Igbo','Nigeria'],
[0X421,'Indonesian','Indonesia'],
[0X045D,'Inuktitut','Canada'],
[0X085D,'Inuktitut (Latin)','Canada'],
[0X083C,'Irish','Ireland'],
[0X434,'isiXhosa','South Africa'],
[0X435,'isiZulu','South Africa'],
[0X410,'Italian','Italy'],
[0X810,'Italian','Switzerland'],
[0X411,'Japanese','Japan'],
[0X044B,'Kannada','India'],
[0X043F,'Kazakh','Kazakhstan'],
[0X453,'Khmer','Cambodia'],
[0X486,"K'iche",'Guatemala'],
[0X487,'Kinyarwanda','Rwanda'],
[0X441,'Kiswahili','Kenya'],
[0X457,'Konkani','India'],
[0X412,'Korean','Korea'],
[0X440,'Kyrgyz','Kyrgyzstan'],
[0X454,'Lao','Lao P.D.R.'],
[0X426,'Latvian','Latvia'],
[0X427,'Lithuanian','Lithuania'],
[0X082E,'Lower Sorbian','Germany'],
[0X046E,'Luxembourgish','Luxembourg'],
[0X042F,'Macedonian (FYROM)','Former Yugoslav Republic of Macedonia'],
[0X083E,'Malay','Brunei Darussalam'],
[0X043E,'Malay','Malaysia'],
[0X044C,'Malayalam','India'],
[0X043A,'Maltese','Malta'],
[0X481,'Maori','New Zealand'],
[0X047A,'Mapudungun','Chile'],
[0X044E,'Marathi','India'],
[0X047C,'Mohawk','Mohawk'],
[0X450,'Mongolian (Cyrillic)','Mongolia'],
[0X850,'Mongolian (Traditional)',"People's Republic of China"],
[0X461,'Nepali','Nepal'],
[0X414,'Norwegian (Bokmal)','Norway'],
[0X814,'Norwegian (Nynorsk)','Norway'],
[0X482,'Occitan','France'],
[0X448,'Odia (formerly Oriya)','India'],
[0X463,'Pashto','Afghanistan'],
[0X415,'Polish','Poland'],
[0X416,'Portuguese','Brazil'],
[0X816,'Portuguese','Portugal'],
[0X446,'Punjabi','India'],
[0X046B,'Quechua','Bolivia'],
[0X086B,'Quechua','Ecuador'],
[0X0C6B,'Quechua','Peru'],
[0X418,'Romanian','Romania'],
[0X417,'Romansh','Switzerland'],
[0X419,'Russian','Russia'],
[0X243B,'Sami (Inari)','Finland'],
[0X103B,'Sami (Lule)','Norway'],
[0X143B,'Sami (Lule)','Sweden'],
[0X0C3B,'Sami (Northern)','Finland'],
[0X043B,'Sami (Northern)','Norway'],
[0X083B,'Sami (Northern)','Sweden'],
[0X203B,'Sami (Skolt)','Finland'],
[0X183B,'Sami (Southern)','Norway'],
[0X1C3B,'Sami (Southern)','Sweden'],
[0X044F,'Sanskrit','India'],
[0X1C1A,'Serbian (Cyrillic)','Bosnia and Herzegovina'],
[0X0C1A,'Serbian (Cyrillic)','Serbia'],
[0X181A,'Serbian (Latin)','Bosnia and Herzegovina'],
[0X081A,'Serbian (Latin)','Serbia'],
[0X046C,'Sesotho sa Leboa','South Africa'],
[0X432,'Setswana','South Africa'],
[0X045B,'Sinhala','Sri Lanka'],
[0X041B,'Slovak','Slovakia'],
[0X424,'Slovenian','Slovenia'],
[0X2C0A,'Spanish','Argentina'],
[0X400A,'Spanish','Bolivia'],
[0X340A,'Spanish','Chile'],
[0X240A,'Spanish','Colombia'],
[0X140A,'Spanish','Costa Rica'],
[0X1C0A,'Spanish','Dominican Republic'],
[0X300A,'Spanish','Ecuador'],
[0X440A,'Spanish','El Salvador'],
[0X100A,'Spanish','Guatemala'],
[0X480A,'Spanish','Honduras'],
[0X080A,'Spanish','Mexico'],
[0X4C0A,'Spanish','Nicaragua'],
[0X180A,'Spanish','Panama'],
[0X3C0A,'Spanish','Paraguay'],
[0X280A,'Spanish','Peru'],
[0X500A,'Spanish','Puerto Rico'],
[0X0C0A,'Spanish (Modern Sort)','Spain'],
[0X040A,'Spanish (Traditional Sort)','Spain'],
[0X540A,'Spanish','United States'],
[0X380A,'Spanish','Uruguay'],
[0X200A,'Spanish','Venezuela'],
[0X081D,'Sweden','Finland'],
[0X041D,'Swedish','Sweden'],
[0X045A,'Syriac','Syria'],
[0X428,'Tajik (Cyrillic)','Tajikistan'],
[0X085F,'Tamazight (Latin)','Algeria'],
[0X449,'Tamil','India'],
[0X444,'Tatar','Russia'],
[0X044A,'Telugu','India'],
[0X041E,'Thai','Thailand'],
[0X451,'Tibetan','PRC'],
[0X041,'Turkish','Turkey'],
[0X442,'Turkmen','Turkmenistan'],
[0X480,'Uighur','PRC'],
[0X422,'Ukrainian','Ukraine'],
[0X042E,'Upper Sorbian','Germany'],
[0X420,'Urdu','Islamic Republic of Pakistan'],
[0X843,'Uzbek (Cyrillic)','Uzbekistan'],
[0X443,'Uzbek (Latin)','Uzbekistan'],
[0X042A,'Vietnamese','Vietnam'],
[0X452,'Welsh','United Kingdom'],
[0X488,'Wolof','Senegal'],
[0X485,'Yakut','Russia'],
[0X478,'Yi','PRC'],
[0X046A,'Yoruba','Nigeria']];
var dat = [];
var f = File.openDialog("select font...");
f.encoding = 'BINARY';
if (f.open("r")){
var ot = readOfstTbl();
var a=0;
for (j=0;j<ot[1];j++){
dat[j] = ["",0,0,0];
for (i=0;i<4;i++) dat[j][0] += f.readch();
dat[j][1] = readULong(f);
dat[j][2] = readULong(f);
dat[j][3] = readULong(f);
if (dat[j][0]=="name") readName(dat[j]);
}
}
function readName(td){
if (td[0]!="name") return;
var lanLst = "";
f.seek(td[2]);
var fmt = readUShort (f);
var len = readUShort (f);
var ofst = td[2] + readUShort (f);
if (fmt==0) lanLst = getNm0(len,ofst);
else if (fmt==1) getNm1(len,ofst);
else return;
alert(lanLst);
}
function getNm1(len,ofst){
alert("type 1");
}
function getNm0(len,ofst){
var stOfst;
var strng = "";
var flg=false;
var num,k;
var result ="";
var currentPosition;
for (var i=0;i<len;i++){
num = 0;
var PID = readUShort (f);
var EID = readUShort (f);
var LID = readUShort (f);
var NID = readUShort (f);
var stLen = readUShort (f);
stOfst = ofst + readUShort (f);
currentPosition = f.tell();
result += "LanguageID= " + LID + " ";
if (PID=="1"){
result += MacLangID[LID] + "\n"
if (EID==1){
strng = u2sj (f,stOfst, stLen);
} else {
f.seek(stOfst);
for(k=0;k<stLen;k++) strng += f.readch();
}
}else if (PID==3){
while (!flg) {
if (winLngID[num][0]==LID){
result += winLngID[num][1]+" "+winLngID[num][2]+"\n";
break;
}
num++
}
strng = winBMP (f,stOfst, stLen);
} else {
f.seek(stOfst);
for(var k=0;k<stLen;k++) strng += f.readch();
}
f.seek(currentPosition);
strng = "";
}
return result;
}
function readOfstTbl(){
var dt = ["",0,0,0,0];
var d;
var a = f.readch();
if (a=="O"){
dt[0] = a;
for (i=0;i<3;i++) {
dt[0] += f.readch();
}
}
else {
dt[0] = "0x0" + a.charCodeAt(0).toString (16);
for (i=0;i<3;i++) {
a = f.readch();
d = a.charCodeAt(0).toString (16);
if (d.length==1) d = "0" + d;
dt[0] += d;
}
}
dt[1] = readBytes(f);
dt[2] = readBytes(f);
dt[3] = readBytes(f);
dt[4] = readBytes(f);
return dt;
}
function readBytes(targetFile){
var a = targetFile.readch().charCodeAt (0);
var dat = a << 8;
a = targetFile.readch().charCodeAt (0);
dat += a;
return dat
}
function readUShort(targetFile){
var result = targetFile.readch().charCodeAt(0) * 256;
result += targetFile.readch().charCodeAt(0);
return result;
}
function readULong(targetFile){
var result=0;
var a = 16777216;
for(var k=0;k<4;k++){
result += targetFile.readch().charCodeAt(0) * a;
a /= 256;
}
return result;
}
function u2sj(tg,ofst,len){
tg.seek(ofst);
st="";
a="";
b=0;
for (i=0;i<len;i++){
a = tg.readch().charCodeAt (0);
if (a>0x80){
a *= 256;
b = a + tg.readch().charCodeAt (0);
//a = sjisCd[b];
i++;
st += "\0x" + b.toString(16);
}
else st += String.fromCharCode (a);
}
return st;
}
function winBMP(tg,ofst,len){
var byt = 0;
var st = "";
for (var i=0;i<len/2;i++){
byt = tg.readch().charCodeAt(0) * 256;
st += String.fromCharCode(byt+tg.readch().charCodeAt(0));
}
return st;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment