Support for the FreeMonoTengwar font and ConScript encoding
[tengwarjs.git] / tengwar.js
1
2 var GeneralUse = require("./general-use");
3 var Classical = require("./classical");
4 var Beleriand = require("./beleriand");
5 var TengwarAnnatar = require("./tengwar-annatar");
6 var TengwarParmaite = require("./tengwar-parmaite");
7 var modes = require("./modes");
8 var detectWebFont = require("./detect-web-font");
9
10 var array_ = Array.prototype;
11
12 if (typeof document !== "undefined") {
13 if (document.readyState === "complete") {
14 onload();
15 } else {
16 document.addEventListener("DOMContentLoaded", onload, true);
17 }
18 detectWebFont(onfontcheck);
19 }
20
21 var loaded;
22 function onload() {
23 loaded = true;
24 progress();
25 }
26
27 var webfontDetected;
28 function onfontcheck(detected) {
29 if (detected) {
30 webfontDetected = true;
31 progress()
32 } else {
33 onnowebfont();
34 }
35 }
36
37 function onnowebfont() {
38 if (!supportedBrowser())
39 return;
40 var elements = document.querySelectorAll(".tengwar");
41 array_.forEach.call(elements, function (element) {
42 element.classList.add("error");
43 element.innerHTML = "Cannot render because WebFonts are not available in this browser.";
44 });
45 }
46
47 function supportedBrowser() {
48 if (!document.body.classList || !document.querySelectorAll || !array_.forEach) {
49 return;
50 }
51 return true;
52 }
53
54 function onoldbrowser() {
55 if (!document.body.classList || !document.querySelectorAll || !array_.forEach)
56 return;
57 }
58
59 function progress() {
60 if (loaded === void 0 || webfontDetected === void 0)
61 return;
62 if (!supportedBrowser())
63 return;
64 var elements = document.querySelectorAll(".tengwar");
65 array_.forEach.call(elements, function (element) {
66 setTimeout(function () {
67 var data = element.dataset;
68 var tengwar, mode, font, encoding, block;
69 block = element.tagName.toLowerCase() !== "span";
70 if (data) {
71 tengwar = data.tengwar;
72 mode = data.mode;
73 encoding = data.encoding;
74 } else {
75 tengwar = element.getAttribute("data-tengwar");
76 mode = element.getAttribute("data-mode");
77 encoding = element.getAttribute("data-encoding");
78 }
79 if (encoding) {
80 element.innerText = TengwarAnnatar.transcribe(encoding, {block: block});
81 element.classList.add("rendered");
82 } else if (tengwar) {
83 font = element.classList.contains("parmaite") ? TengwarParmaite : TengwarAnnatar;
84 var flags = mode.split(/\s+/);
85 var mode = flags.shift();
86 var Mode = modes[mode] || GeneralUse;
87 var options = Mode.makeOptions();
88 flags.forEach(function (flag) {
89 flag = flag.replace(/\-(\w)/g, function ($, $1) {
90 return $1.toUpperCase();
91 });
92 options[flag] = true;
93 });
94 options.block = block;
95 options.font = font;
96 element.innerHTML = Mode.transcribe(tengwar, options);
97 element.classList.add("rendered");
98 }
99 }, 0);
100 });
101 }
102