diff options
| -rw-r--r-- | ext/bg/js/dictionary.js | 3 | ||||
| -rw-r--r-- | ext/bg/js/templates.js | 281 | ||||
| -rw-r--r-- | ext/bg/js/translator.js | 3 | ||||
| -rw-r--r-- | ext/mixed/js/japanese.js | 78 | ||||
| -rw-r--r-- | tmpl/fields.html | 14 | 
5 files changed, 244 insertions, 135 deletions
| diff --git a/ext/bg/js/dictionary.js b/ext/bg/js/dictionary.js index 2a80e2d0..6aed52f4 100644 --- a/ext/bg/js/dictionary.js +++ b/ext/bg/js/dictionary.js @@ -137,7 +137,8 @@ function dictTermsGroup(definitions, dictionaries) {              reading: firstDef.reading,              reasons: firstDef.reasons,              score: groupDefs.reduce((p, v) => v.score > p ? v.score : p, Number.MIN_SAFE_INTEGER), -            source: firstDef.source +            source: firstDef.source,  +            furigana: firstDef.furigana          });      } diff --git a/ext/bg/js/templates.js b/ext/bg/js/templates.js index 7e05015a..35a7beb1 100644 --- a/ext/bg/js/templates.js +++ b/ext/bg/js/templates.js @@ -7,19 +7,19 @@ templates['dictionary.html'] = template({"1":function(container,depth0,helpers,p    return "<div class=\"dict-group well well-sm\" data-title=\""      + alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper))) -    + "\">\n    <h4><span class=\"text-muted glyphicon glyphicon-book\"></span> " +    + "\">\r\n    <h4><span class=\"text-muted glyphicon glyphicon-book\"></span> "      + alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper)))      + " <small>rev."      + alias4(((helper = (helper = helpers.revision || (depth0 != null ? depth0.revision : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"revision","hash":{},"data":data}) : helper))) -    + "</small></h4>\n\n    <div class=\"checkbox\">\n        <label><input type=\"checkbox\" class=\"dict-enabled\" " +    + "</small></h4>\r\n\r\n    <div class=\"checkbox\">\r\n        <label><input type=\"checkbox\" class=\"dict-enabled\" "      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.enabled : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "> Enable search</label>\n    </div>\n    <div class=\"form-group options-advanced\">\n        <label for=\"dict-" +    + "> Enable search</label>\r\n    </div>\r\n    <div class=\"form-group options-advanced\">\r\n        <label for=\"dict-"      + alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper))) -    + "\">Result priority</label>\n        <input type=\"number\" value=\"" +    + "\">Result priority</label>\r\n        <input type=\"number\" value=\""      + alias4(((helper = (helper = helpers.priority || (depth0 != null ? depth0.priority : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"priority","hash":{},"data":data}) : helper)))      + "\" id=\"dict-"      + alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper))) -    + "\" class=\"form-control dict-priority\">\n    </div>\n</div>\n"; +    + "\" class=\"form-control dict-priority\">\r\n    </div>\r\n</div>\r\n";  },"useData":true});  templates['fields.html'] = template({"1":function(container,depth0,helpers,partials,data) {      var stack1; @@ -126,164 +126,183 @@ templates['fields.html'] = template({"1":function(container,depth0,helpers,parti  },"34":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(35, data, 0),"inverse":container.program(38, data, 0),"data":data})) != null ? stack1 : ""); +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(35, data, 0),"inverse":container.program(41, data, 0),"data":data})) != null ? stack1 : "");  },"35":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.reading : stack1),{"name":"if","hash":{},"fn":container.program(36, data, 0),"inverse":container.program(32, data, 0),"data":data})) != null ? stack1 : ""); +  return ((stack1 = helpers.blockHelperMissing.call(depth0,container.lambda(((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.furigana : stack1), depth0),{"name":"definition.furigana","hash":{},"fn":container.program(36, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "");  },"36":function(container,depth0,helpers,partials,data) { -    var stack1, alias1=container.lambda, alias2=container.escapeExpression; +    var stack1; + +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.furigana : depth0),{"name":"if","hash":{},"fn":container.program(37, data, 0),"inverse":container.program(39, data, 0),"data":data})) != null ? stack1 : ""); +},"37":function(container,depth0,helpers,partials,data) { +    var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression;    return "<ruby>" -    + alias2(alias1(((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.expression : stack1), depth0)) +    + alias4(((helper = (helper = helpers.text || (depth0 != null ? depth0.text : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"text","hash":{},"data":data}) : helper)))      + "<rt>" -    + alias2(alias1(((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.reading : stack1), depth0)) +    + alias4(((helper = (helper = helpers.furigana || (depth0 != null ? depth0.furigana : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"furigana","hash":{},"data":data}) : helper)))      + "</rt></ruby>"; -},"38":function(container,depth0,helpers,partials,data) { +},"39":function(container,depth0,helpers,partials,data) { +    var helper; + +  return container.escapeExpression(((helper = (helper = helpers.text || (depth0 != null ? depth0.text : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"text","hash":{},"data":data}) : helper))) +    + "\r\n"; +},"41":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.reading : stack1),{"name":"if","hash":{},"fn":container.program(39, data, 0),"inverse":container.program(32, data, 0),"data":data})) != null ? stack1 : ""); -},"39":function(container,depth0,helpers,partials,data) { -    var stack1, alias1=container.lambda, alias2=container.escapeExpression; +  return ((stack1 = helpers.blockHelperMissing.call(depth0,container.lambda(((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.furigana : stack1), depth0),{"name":"definition.furigana","hash":{},"fn":container.program(42, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"42":function(container,depth0,helpers,partials,data) { +    var stack1, helper, options, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=helpers.blockHelperMissing, buffer = ""; -  return alias2(alias1(((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.expression : stack1), depth0)) -    + " [" -    + alias2(alias1(((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.reading : stack1), depth0)) +  stack1 = ((helper = (helper = helpers.furigana || (depth0 != null ? depth0.furigana : depth0)) != null ? helper : alias2),(options={"name":"furigana","hash":{},"fn":container.program(43, data, 0),"inverse":container.noop,"data":data}),(typeof helper === alias3 ? helper.call(alias1,options) : helper)); +  if (!helpers.furigana) { stack1 = alias4.call(depth0,stack1,options)} +  if (stack1 != null) { buffer += stack1; } +  buffer += container.escapeExpression(((helper = (helper = helpers.text || (depth0 != null ? depth0.text : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"text","hash":{},"data":data}) : helper))); +  stack1 = ((helper = (helper = helpers.furigana || (depth0 != null ? depth0.furigana : depth0)) != null ? helper : alias2),(options={"name":"furigana","hash":{},"fn":container.program(45, data, 0),"inverse":container.noop,"data":data}),(typeof helper === alias3 ? helper.call(alias1,options) : helper)); +  if (!helpers.furigana) { stack1 = alias4.call(depth0,stack1,options)} +  if (stack1 != null) { buffer += stack1; } +  return buffer; +},"43":function(container,depth0,helpers,partials,data) { +    return " "; +},"45":function(container,depth0,helpers,partials,data) { +    return "[" +    + container.escapeExpression(container.lambda(depth0, depth0))      + "]"; -},"41":function(container,depth0,helpers,partials,data,blockParams,depths) { +},"47":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}); -  return ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(42, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.modeKanji : depth0),{"name":"if","hash":{},"fn":container.program(44, data, 0, blockParams, depths),"inverse":container.program(53, data, 0, blockParams, depths),"data":data})) != null ? stack1 : "") -    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(66, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"42":function(container,depth0,helpers,partials,data) { +  return ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(48, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.modeKanji : depth0),{"name":"if","hash":{},"fn":container.program(50, data, 0, blockParams, depths),"inverse":container.program(59, data, 0, blockParams, depths),"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(72, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"48":function(container,depth0,helpers,partials,data) {      return "<div style=\"text-align: left;\">"; -},"44":function(container,depth0,helpers,partials,data) { +},"50":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.glossary : stack1)) != null ? stack1["1"] : stack1),{"name":"if","hash":{},"fn":container.program(45, data, 0),"inverse":container.program(51, data, 0),"data":data})) != null ? stack1 : ""); -},"45":function(container,depth0,helpers,partials,data) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.glossary : stack1)) != null ? stack1["1"] : stack1),{"name":"if","hash":{},"fn":container.program(51, data, 0),"inverse":container.program(57, data, 0),"data":data})) != null ? stack1 : ""); +},"51":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(46, data, 0),"inverse":container.program(49, data, 0),"data":data})) != null ? stack1 : ""); -},"46":function(container,depth0,helpers,partials,data) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(52, data, 0),"inverse":container.program(55, data, 0),"data":data})) != null ? stack1 : ""); +},"52":function(container,depth0,helpers,partials,data) {      var stack1;    return "<ol>" -    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.glossary : stack1),{"name":"each","hash":{},"fn":container.program(47, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.glossary : stack1),{"name":"each","hash":{},"fn":container.program(53, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "</ol>"; -},"47":function(container,depth0,helpers,partials,data) { +},"53":function(container,depth0,helpers,partials,data) {      return "<li>"      + container.escapeExpression(container.lambda(depth0, depth0))      + "</li>"; -},"49":function(container,depth0,helpers,partials,data) { +},"55":function(container,depth0,helpers,partials,data) {      var stack1;    return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.glossary : stack1),{"name":"each","hash":{},"fn":container.program(20, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"51":function(container,depth0,helpers,partials,data) { +},"57":function(container,depth0,helpers,partials,data) {      var stack1;    return container.escapeExpression(container.lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.glossary : stack1)) != null ? stack1["0"] : stack1), depth0)); -},"53":function(container,depth0,helpers,partials,data,blockParams,depths) { +},"59":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.group : depth0),{"name":"if","hash":{},"fn":container.program(54, data, 0, blockParams, depths),"inverse":container.program(64, data, 0, blockParams, depths),"data":data})) != null ? stack1 : ""); -},"54":function(container,depth0,helpers,partials,data,blockParams,depths) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.group : depth0),{"name":"if","hash":{},"fn":container.program(60, data, 0, blockParams, depths),"inverse":container.program(70, data, 0, blockParams, depths),"data":data})) != null ? stack1 : ""); +},"60":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.definitions : stack1)) != null ? stack1["1"] : stack1),{"name":"if","hash":{},"fn":container.program(55, data, 0, blockParams, depths),"inverse":container.program(62, data, 0, blockParams, depths),"data":data})) != null ? stack1 : ""); -},"55":function(container,depth0,helpers,partials,data,blockParams,depths) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.definitions : stack1)) != null ? stack1["1"] : stack1),{"name":"if","hash":{},"fn":container.program(61, data, 0, blockParams, depths),"inverse":container.program(68, data, 0, blockParams, depths),"data":data})) != null ? stack1 : ""); +},"61":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(56, data, 0, blockParams, depths),"inverse":container.program(59, data, 0, blockParams, depths),"data":data})) != null ? stack1 : ""); -},"56":function(container,depth0,helpers,partials,data,blockParams,depths) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(62, data, 0, blockParams, depths),"inverse":container.program(65, data, 0, blockParams, depths),"data":data})) != null ? stack1 : ""); +},"62":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1;    return "<ol>" -    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.definitions : stack1),{"name":"each","hash":{},"fn":container.program(57, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") +    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.definitions : stack1),{"name":"each","hash":{},"fn":container.program(63, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + "</ol>"; -},"57":function(container,depth0,helpers,partials,data,blockParams,depths) { +},"63":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1;    return "<li>"      + ((stack1 = container.invokePartial(partials["glossary-single"],depth0,{"name":"glossary-single","hash":{"brief":(depths[1] != null ? depths[1].brief : depths[1]),"html":(depths[1] != null ? depths[1].html : depths[1])},"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : "")      + "</li>"; -},"59":function(container,depth0,helpers,partials,data,blockParams,depths) { +},"65":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1; -  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.definitions : stack1),{"name":"each","hash":{},"fn":container.program(60, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"60":function(container,depth0,helpers,partials,data,blockParams,depths) { +  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.definitions : stack1),{"name":"each","hash":{},"fn":container.program(66, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"66":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1;    return " * "      + ((stack1 = container.invokePartial(partials["glossary-single"],depth0,{"name":"glossary-single","hash":{"brief":(depths[1] != null ? depths[1].brief : depths[1]),"html":(depths[1] != null ? depths[1].html : depths[1])},"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : ""); -},"62":function(container,depth0,helpers,partials,data) { +},"68":function(container,depth0,helpers,partials,data) {      var stack1;    return ((stack1 = container.invokePartial(partials["glossary-single"],((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.definitions : stack1)) != null ? stack1["0"] : stack1),{"name":"glossary-single","hash":{"brief":(depth0 != null ? depth0.brief : depth0),"html":(depth0 != null ? depth0.html : depth0)},"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : ""); -},"64":function(container,depth0,helpers,partials,data) { +},"70":function(container,depth0,helpers,partials,data) {      var stack1;    return ((stack1 = container.invokePartial(partials["glossary-single"],(depth0 != null ? depth0.definition : depth0),{"name":"glossary-single","hash":{"brief":(depth0 != null ? depth0.brief : depth0),"html":(depth0 != null ? depth0.html : depth0)},"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : ""); -},"66":function(container,depth0,helpers,partials,data) { +},"72":function(container,depth0,helpers,partials,data) {      return "</div>"; -},"68":function(container,depth0,helpers,partials,data) { +},"74":function(container,depth0,helpers,partials,data) {      var stack1;    return ((stack1 = container.invokePartial(partials.glossary,depth0,{"name":"glossary","hash":{"brief":true},"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : ""); -},"70":function(container,depth0,helpers,partials,data) { +},"76":function(container,depth0,helpers,partials,data) {      var stack1;    return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.kunyomi : stack1),{"name":"each","hash":{},"fn":container.program(20, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"72":function(container,depth0,helpers,partials,data) { +},"78":function(container,depth0,helpers,partials,data) {      var stack1;    return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.onyomi : stack1),{"name":"each","hash":{},"fn":container.program(20, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"74":function(container,depth0,helpers,partials,data) { +},"80":function(container,depth0,helpers,partials,data) {      var stack1;    return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.modeTermKana : depth0),{"name":"unless","hash":{},"fn":container.program(30, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"76":function(container,depth0,helpers,partials,data) { +},"82":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1),{"name":"if","hash":{},"fn":container.program(77, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"77":function(container,depth0,helpers,partials,data) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1),{"name":"if","hash":{},"fn":container.program(83, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"83":function(container,depth0,helpers,partials,data) {      var stack1;    return container.escapeExpression(container.lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1)) != null ? stack1.sentence : stack1), depth0)); -},"79":function(container,depth0,helpers,partials,data) { +},"85":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1),{"name":"if","hash":{},"fn":container.program(80, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"80":function(container,depth0,helpers,partials,data) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1),{"name":"if","hash":{},"fn":container.program(86, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"86":function(container,depth0,helpers,partials,data) {      var stack1;    return container.escapeExpression(container.lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1)) != null ? stack1.prefix : stack1), depth0)); -},"82":function(container,depth0,helpers,partials,data) { +},"88":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1),{"name":"if","hash":{},"fn":container.program(83, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"83":function(container,depth0,helpers,partials,data) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1),{"name":"if","hash":{},"fn":container.program(89, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"89":function(container,depth0,helpers,partials,data) {      var stack1;    return container.escapeExpression(container.lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1)) != null ? stack1.body : stack1), depth0)); -},"85":function(container,depth0,helpers,partials,data) { +},"91":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1),{"name":"if","hash":{},"fn":container.program(86, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"86":function(container,depth0,helpers,partials,data) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1),{"name":"if","hash":{},"fn":container.program(92, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"92":function(container,depth0,helpers,partials,data) {      var stack1;    return container.escapeExpression(container.lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.cloze : stack1)) != null ? stack1.suffix : stack1), depth0)); -},"88":function(container,depth0,helpers,partials,data) { +},"94":function(container,depth0,helpers,partials,data) {      var stack1;    return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.tags : stack1),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"90":function(container,depth0,helpers,partials,data) { +},"96":function(container,depth0,helpers,partials,data) {      var stack1; -  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(91, data, 0),"inverse":container.program(93, data, 0),"data":data})) != null ? stack1 : ""); -},"91":function(container,depth0,helpers,partials,data) { +  return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.html : depth0),{"name":"if","hash":{},"fn":container.program(97, data, 0),"inverse":container.program(99, data, 0),"data":data})) != null ? stack1 : ""); +},"97":function(container,depth0,helpers,partials,data) {      var stack1, alias1=container.lambda, alias2=container.escapeExpression;    return "<a href=\"" @@ -291,14 +310,14 @@ templates['fields.html'] = template({"1":function(container,depth0,helpers,parti      + "\">"      + alias2(alias1(((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.url : stack1), depth0))      + "</a>"; -},"93":function(container,depth0,helpers,partials,data) { +},"99":function(container,depth0,helpers,partials,data) {      var stack1;    return container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.definition : depth0)) != null ? stack1.url : stack1), depth0));  },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1; -  return "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" +  return "\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"      + ((stack1 = container.invokePartial(helpers.lookup.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,"marker",{"name":"lookup","hash":{},"data":data}),depth0,{"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : "");  },"main_d":  function(fn, props, container, depth0, data, blockParams, depths) { @@ -310,17 +329,17 @@ templates['fields.html'] = template({"1":function(container,depth0,helpers,parti    fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(26, data, 0, blockParams, depths),"inverse":container.noop,"args":["dictionary"],"data":data}) || fn;    fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(28, data, 0, blockParams, depths),"inverse":container.noop,"args":["expression"],"data":data}) || fn;    fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(34, data, 0, blockParams, depths),"inverse":container.noop,"args":["furigana"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(41, data, 0, blockParams, depths),"inverse":container.noop,"args":["glossary"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(68, data, 0, blockParams, depths),"inverse":container.noop,"args":["glossary-brief"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(70, data, 0, blockParams, depths),"inverse":container.noop,"args":["kunyomi"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(72, data, 0, blockParams, depths),"inverse":container.noop,"args":["onyomi"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(74, data, 0, blockParams, depths),"inverse":container.noop,"args":["reading"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(76, data, 0, blockParams, depths),"inverse":container.noop,"args":["sentence"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(79, data, 0, blockParams, depths),"inverse":container.noop,"args":["cloze-prefix"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(82, data, 0, blockParams, depths),"inverse":container.noop,"args":["cloze-body"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(85, data, 0, blockParams, depths),"inverse":container.noop,"args":["cloze-suffix"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(88, data, 0, blockParams, depths),"inverse":container.noop,"args":["tags"],"data":data}) || fn; -  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(90, data, 0, blockParams, depths),"inverse":container.noop,"args":["url"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(47, data, 0, blockParams, depths),"inverse":container.noop,"args":["glossary"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(74, data, 0, blockParams, depths),"inverse":container.noop,"args":["glossary-brief"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(76, data, 0, blockParams, depths),"inverse":container.noop,"args":["kunyomi"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(78, data, 0, blockParams, depths),"inverse":container.noop,"args":["onyomi"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(80, data, 0, blockParams, depths),"inverse":container.noop,"args":["reading"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(82, data, 0, blockParams, depths),"inverse":container.noop,"args":["sentence"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(85, data, 0, blockParams, depths),"inverse":container.noop,"args":["cloze-prefix"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(88, data, 0, blockParams, depths),"inverse":container.noop,"args":["cloze-body"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(91, data, 0, blockParams, depths),"inverse":container.noop,"args":["cloze-suffix"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(94, data, 0, blockParams, depths),"inverse":container.noop,"args":["tags"],"data":data}) || fn; +  fn = decorators.inline(fn,props,container,{"name":"inline","hash":{},"fn":container.program(96, data, 0, blockParams, depths),"inverse":container.noop,"args":["url"],"data":data}) || fn;    return fn;    } @@ -328,33 +347,33 @@ templates['fields.html'] = template({"1":function(container,depth0,helpers,parti  templates['kanji.html'] = template({"1":function(container,depth0,helpers,partials,data) {      var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}); -  return "<div class=\"entry\" data-type=\"kanji\">\n    <div class=\"actions\">\n" +  return "<div class=\"entry\" data-type=\"kanji\">\r\n    <div class=\"actions\">\r\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.addable : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.source : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "        <img src=\"/mixed/img/entry-current.png\" class=\"current\" title=\"Current entry (Alt + Up/Down/Home/End/PgUp/PgDn)\" alt>\n    </div>\n\n    <div class=\"glyph\">" +    + "        <img src=\"/mixed/img/entry-current.png\" class=\"current\" title=\"Current entry (Alt + Up/Down/Home/End/PgUp/PgDn)\" alt>\r\n    </div>\r\n\r\n    <div class=\"glyph\">"      + container.escapeExpression(((helper = (helper = helpers.character || (depth0 != null ? depth0.character : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"character","hash":{},"data":data}) : helper))) -    + "</div>\n\n    <div class=\"reading\">\n        <table>\n            <tr>\n                <th>Kunyomi:</th>\n                <td>\n" +    + "</div>\r\n\r\n    <div class=\"reading\">\r\n        <table>\r\n            <tr>\r\n                <th>Kunyomi:</th>\r\n                <td>\r\n"      + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.kunyomi : depth0),{"name":"each","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "                </td>\n            </tr>\n            <tr>\n                <th>Onyomi:</th>\n                <td>\n" +    + "                </td>\r\n            </tr>\r\n            <tr>\r\n                <th>Onyomi:</th>\r\n                <td>\r\n"      + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.onyomi : depth0),{"name":"each","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "                </td>\n            </tr>\n        </table>\n    </div>\n\n    <div>\n" +    + "                </td>\r\n            </tr>\r\n        </table>\r\n    </div>\r\n\r\n    <div>\r\n"      + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.tags : depth0),{"name":"each","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "    </div>\n\n    <div class=\"glossary\">\n" +    + "    </div>\r\n\r\n    <div class=\"glossary\">\r\n"      + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.glossary : depth0)) != null ? stack1["1"] : stack1),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.program(15, data, 0),"data":data})) != null ? stack1 : "") -    + "    </div>\n\n" +    + "    </div>\r\n\r\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.debug : depth0),{"name":"if","hash":{},"fn":container.program(18, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "</div>\n"; +    + "</div>\r\n";  },"2":function(container,depth0,helpers,partials,data) { -    return "        <a href=\"#\" class=\"action-view-note pending disabled\"><img src=\"/mixed/img/view-note.png\" title=\"View added note (Alt + V)\" alt></a>\n        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"kanji\"><img src=\"/mixed/img/add-kanji.png\" title=\"Add Kanji (Alt + K)\" alt></a>\n"; +    return "        <a href=\"#\" class=\"action-view-note pending disabled\"><img src=\"/mixed/img/view-note.png\" title=\"View added note (Alt + V)\" alt></a>\r\n        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"kanji\"><img src=\"/mixed/img/add-kanji.png\" title=\"Add Kanji (Alt + K)\" alt></a>\r\n";  },"4":function(container,depth0,helpers,partials,data) { -    return "        <a href=\"#\" class=\"source-term\"><img src=\"/mixed/img/source-term.png\" title=\"Source term (Alt + B)\" alt></a>\n"; +    return "        <a href=\"#\" class=\"source-term\"><img src=\"/mixed/img/source-term.png\" title=\"Source term (Alt + B)\" alt></a>\r\n";  },"6":function(container,depth0,helpers,partials,data) {      var stack1;    return "                    "      + container.escapeExpression(container.lambda(depth0, depth0))      + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(data && data.last),{"name":"unless","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "\n"; +    + "\r\n";  },"7":function(container,depth0,helpers,partials,data) {      return ", ";  },"9":function(container,depth0,helpers,partials,data) { @@ -366,20 +385,20 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia      + alias4(((helper = (helper = helpers.notes || (depth0 != null ? depth0.notes : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"notes","hash":{},"data":data}) : helper)))      + "\">"      + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper))) -    + "</span>\n"; +    + "</span>\r\n";  },"11":function(container,depth0,helpers,partials,data) {      var stack1; -  return "        <ol>\n" +  return "        <ol>\r\n"      + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(12, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "        </ol>\n"; +    + "        </ol>\r\n";  },"12":function(container,depth0,helpers,partials,data) {      var stack1, helper, options, buffer =     "            <li><span class=\"glossary-item\">";    stack1 = ((helper = (helper = helpers.multiLine || (depth0 != null ? depth0.multiLine : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"multiLine","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));    if (!helpers.multiLine) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; } -  return buffer + "</span></li>\n"; +  return buffer + "</span></li>\r\n";  },"13":function(container,depth0,helpers,partials,data) {      return container.escapeExpression(container.lambda(depth0, depth0));  },"15":function(container,depth0,helpers,partials,data) { @@ -388,7 +407,7 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia    stack1 = ((helper = (helper = helpers.multiLine || (depth0 != null ? depth0.multiLine : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"multiLine","hash":{},"fn":container.program(16, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));    if (!helpers.multiLine) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; } -  return buffer + "</div>\n"; +  return buffer + "</div>\r\n";  },"16":function(container,depth0,helpers,partials,data) {      var stack1; @@ -399,7 +418,7 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia    stack1 = ((helper = (helper = helpers.dumpObject || (depth0 != null ? depth0.dumpObject : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"dumpObject","hash":{},"fn":container.program(19, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));    if (!helpers.dumpObject) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; } -  return buffer + "</pre>\n"; +  return buffer + "</pre>\r\n";  },"19":function(container,depth0,helpers,partials,data) {      var stack1; @@ -412,16 +431,16 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia      var stack1;    return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(data && data.first),{"name":"unless","hash":{},"fn":container.program(23, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "\n" +    + "\r\n"      + ((stack1 = container.invokePartial(partials.kanji,depth0,{"name":"kanji","hash":{"root":(depths[1] != null ? depths[1].root : depths[1]),"source":(depths[1] != null ? depths[1].source : depths[1]),"addable":(depths[1] != null ? depths[1].addable : depths[1]),"debug":(depths[1] != null ? depths[1].debug : depths[1])},"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : "");  },"23":function(container,depth0,helpers,partials,data) {      return "<hr>";  },"25":function(container,depth0,helpers,partials,data) { -    return "<p class=\"note\">No results found.</p>\n"; +    return "<p class=\"note\">No results found.</p>\r\n";  },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1; -  return "\n" +  return "\r\n"      + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.definitions : depth0),{"name":"if","hash":{},"fn":container.program(21, data, 0, blockParams, depths),"inverse":container.program(25, data, 0, blockParams, depths),"data":data})) != null ? stack1 : "");  },"main_d":  function(fn, props, container, depth0, data, blockParams, depths) { @@ -435,19 +454,19 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia  templates['model.html'] = template({"1":function(container,depth0,helpers,partials,data) {      return "                    <li><a class=\"marker-link\" href=\"#\">"      + container.escapeExpression(container.lambda(depth0, depth0)) -    + "</a></li>\n"; +    + "</a></li>\r\n";  },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {      var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; -  return "<tr>\n    <td class=\"col-sm-2\">" +  return "<tr>\r\n    <td class=\"col-sm-2\">"      + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper))) -    + "</td>\n    <td class=\"col-sm-10\">\n        <div class=\"input-group\">\n            <input type=\"text\" class=\"anki-field-value form-control\" data-field=\"" +    + "</td>\r\n    <td class=\"col-sm-10\">\r\n        <div class=\"input-group\">\r\n            <input type=\"text\" class=\"anki-field-value form-control\" data-field=\""      + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper)))      + "\" value=\""      + alias4(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"value","hash":{},"data":data}) : helper))) -    + "\">\n            <div class=\"input-group-btn\">\n                <button type=\"button\" class=\"btn btn-default dropdown-toggle\" data-toggle=\"dropdown\">\n                    <span class=\"caret\"></span>\n                </button>\n                <ul class=\"dropdown-menu dropdown-menu-right\">\n" +    + "\">\r\n            <div class=\"input-group-btn\">\r\n                <button type=\"button\" class=\"btn btn-default dropdown-toggle\" data-toggle=\"dropdown\">\r\n                    <span class=\"caret\"></span>\r\n                </button>\r\n                <ul class=\"dropdown-menu dropdown-menu-right\">\r\n"      + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.markers : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "                </ul>\n            </div>\n        </div>\n    </td>\n</tr>\n"; +    + "                </ul>\r\n            </div>\r\n        </div>\r\n    </td>\r\n</tr>\r\n";  },"useData":true});  templates['terms.html'] = template({"1":function(container,depth0,helpers,partials,data) {      var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}); @@ -457,9 +476,9 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia  },"2":function(container,depth0,helpers,partials,data) {      var stack1; -  return "<div>\n" +  return "<div>\r\n"      + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.tags : depth0),{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "</div>\n"; +    + "</div>\r\n";  },"3":function(container,depth0,helpers,partials,data) {      var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; @@ -469,20 +488,20 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia      + alias4(((helper = (helper = helpers.notes || (depth0 != null ? depth0.notes : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"notes","hash":{},"data":data}) : helper)))      + "\">"      + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper))) -    + "</span>\n"; +    + "</span>\r\n";  },"5":function(container,depth0,helpers,partials,data) {      var stack1; -  return "<ul>\n" +  return "<ul>\r\n"      + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "</ul>\n"; +    + "</ul>\r\n";  },"6":function(container,depth0,helpers,partials,data) {      var stack1, helper, options, buffer =     "    <li><span class=\"glossary-item\">";    stack1 = ((helper = (helper = helpers.multiLine || (depth0 != null ? depth0.multiLine : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"multiLine","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));    if (!helpers.multiLine) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; } -  return buffer + "</span></li>\n"; +  return buffer + "</span></li>\r\n";  },"7":function(container,depth0,helpers,partials,data) {      return container.escapeExpression(container.lambda(depth0, depth0));  },"9":function(container,depth0,helpers,partials,data) { @@ -491,7 +510,7 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia    stack1 = ((helper = (helper = helpers.multiLine || (depth0 != null ? depth0.multiLine : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"multiLine","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));    if (!helpers.multiLine) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; } -  return buffer + "</div>\n"; +  return buffer + "</div>\r\n";  },"10":function(container,depth0,helpers,partials,data) {      var stack1; @@ -499,22 +518,22 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia  },"12":function(container,depth0,helpers,partials,data) {      var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}); -  return "<div class=\"entry\" data-type=\"term\">\n    <div class=\"actions\">\n" +  return "<div class=\"entry\" data-type=\"term\">\r\n    <div class=\"actions\">\r\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.addable : depth0),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.playback : depth0),{"name":"if","hash":{},"fn":container.program(15, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "        <img src=\"/mixed/img/entry-current.png\" class=\"current\" title=\"Current entry (Alt + Up/Down/Home/End/PgUp/PgDn)\" alt>\n    </div>\n\n" +    + "        <img src=\"/mixed/img/entry-current.png\" class=\"current\" title=\"Current entry (Alt + Up/Down/Home/End/PgUp/PgDn)\" alt>\r\n    </div>\r\n\r\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.reading : depth0),{"name":"if","hash":{},"fn":container.program(17, data, 0),"inverse":container.program(20, data, 0),"data":data})) != null ? stack1 : "") -    + "\n" +    + "\r\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.reasons : depth0),{"name":"if","hash":{},"fn":container.program(22, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "\n    <div class=\"glossary\">\n" +    + "\r\n    <div class=\"glossary\">\r\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.grouped : depth0),{"name":"if","hash":{},"fn":container.program(26, data, 0),"inverse":container.program(32, data, 0),"data":data})) != null ? stack1 : "") -    + "    </div>\n\n" +    + "    </div>\r\n\r\n"      + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.debug : depth0),{"name":"if","hash":{},"fn":container.program(34, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "</div>\n"; +    + "</div>\r\n";  },"13":function(container,depth0,helpers,partials,data) { -    return "        <a href=\"#\" class=\"action-view-note pending disabled\"><img src=\"/mixed/img/view-note.png\" title=\"View added note (Alt + V)\" alt></a>\n        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"term-kanji\"><img src=\"/mixed/img/add-term-kanji.png\" title=\"Add expression (Alt + E)\" alt></a>\n        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"term-kana\"><img src=\"/mixed/img/add-term-kana.png\" title=\"Add reading (Alt + R)\" alt></a>\n"; +    return "        <a href=\"#\" class=\"action-view-note pending disabled\"><img src=\"/mixed/img/view-note.png\" title=\"View added note (Alt + V)\" alt></a>\r\n        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"term-kanji\"><img src=\"/mixed/img/add-term-kanji.png\" title=\"Add expression (Alt + E)\" alt></a>\r\n        <a href=\"#\" class=\"action-add-note pending disabled\" data-mode=\"term-kana\"><img src=\"/mixed/img/add-term-kana.png\" title=\"Add reading (Alt + R)\" alt></a>\r\n";  },"15":function(container,depth0,helpers,partials,data) { -    return "        <a href=\"#\" class=\"action-play-audio\"><img src=\"/mixed/img/play-audio.png\" title=\"Play audio (Alt + P)\" alt></a>\n"; +    return "        <a href=\"#\" class=\"action-play-audio\"><img src=\"/mixed/img/play-audio.png\" title=\"Play audio (Alt + P)\" alt></a>\r\n";  },"17":function(container,depth0,helpers,partials,data) {      var stack1, helper, options, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", buffer =     "    <div class=\"expression\"><ruby>"; @@ -523,7 +542,7 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia    if (stack1 != null) { buffer += stack1; }    return buffer + "<rt>"      + container.escapeExpression(((helper = (helper = helpers.reading || (depth0 != null ? depth0.reading : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"reading","hash":{},"data":data}) : helper))) -    + "</rt></ruby></div>\n"; +    + "</rt></ruby></div>\r\n";  },"18":function(container,depth0,helpers,partials,data) {      var helper; @@ -534,13 +553,13 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia    stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"kanjiLinks","hash":{},"fn":container.program(18, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));    if (!helpers.kanjiLinks) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; } -  return buffer + "</div>\n"; +  return buffer + "</div>\r\n";  },"22":function(container,depth0,helpers,partials,data) {      var stack1; -  return "    <div class=\"reasons\">\n" +  return "    <div class=\"reasons\">\r\n"      + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.reasons : depth0),{"name":"each","hash":{},"fn":container.program(23, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "    </div>\n"; +    + "    </div>\r\n";  },"23":function(container,depth0,helpers,partials,data) {      var stack1; @@ -548,7 +567,7 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia      + container.escapeExpression(container.lambda(depth0, depth0))      + "</span> "      + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(data && data.last),{"name":"unless","hash":{},"fn":container.program(24, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "\n"; +    + "\r\n";  },"24":function(container,depth0,helpers,partials,data) {      return "«";  },"26":function(container,depth0,helpers,partials,data) { @@ -558,15 +577,15 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia  },"27":function(container,depth0,helpers,partials,data) {      var stack1; -  return "        <ol>\n" +  return "        <ol>\r\n"      + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.definitions : depth0),{"name":"each","hash":{},"fn":container.program(28, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "        </ol>\n"; +    + "        </ol>\r\n";  },"28":function(container,depth0,helpers,partials,data) {      var stack1;    return "            <li>"      + ((stack1 = container.invokePartial(partials.definition,depth0,{"name":"definition","data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : "") -    + "</li>\n"; +    + "</li>\r\n";  },"30":function(container,depth0,helpers,partials,data) {      var stack1; @@ -581,7 +600,7 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia    stack1 = ((helper = (helper = helpers.dumpObject || (depth0 != null ? depth0.dumpObject : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"dumpObject","hash":{},"fn":container.program(35, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));    if (!helpers.dumpObject) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}    if (stack1 != null) { buffer += stack1; } -  return buffer + "</pre>\n"; +  return buffer + "</pre>\r\n";  },"35":function(container,depth0,helpers,partials,data) {      var stack1; @@ -594,16 +613,16 @@ templates['terms.html'] = template({"1":function(container,depth0,helpers,partia      var stack1;    return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(data && data.first),{"name":"unless","hash":{},"fn":container.program(39, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") -    + "\n" +    + "\r\n"      + ((stack1 = container.invokePartial(partials.term,depth0,{"name":"term","hash":{"playback":(depths[1] != null ? depths[1].playback : depths[1]),"addable":(depths[1] != null ? depths[1].addable : depths[1]),"grouped":(depths[1] != null ? depths[1].grouped : depths[1]),"debug":(depths[1] != null ? depths[1].debug : depths[1])},"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : "");  },"39":function(container,depth0,helpers,partials,data) {      return "<hr>";  },"41":function(container,depth0,helpers,partials,data) { -    return "<p class=\"note\">No results found.</p>\n"; +    return "<p class=\"note\">No results found.</p>\r\n";  },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) {      var stack1; -  return "\n\n" +  return "\r\n\r\n"      + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.definitions : depth0),{"name":"if","hash":{},"fn":container.program(37, data, 0, blockParams, depths),"inverse":container.program(41, data, 0, blockParams, depths),"data":data})) != null ? stack1 : "");  },"main_d":  function(fn, props, container, depth0, data, blockParams, depths) { diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js index 1be485c7..daed3109 100644 --- a/ext/bg/js/translator.js +++ b/ext/bg/js/translator.js @@ -71,7 +71,8 @@ class Translator {                      expression: definition.expression,                      reading: definition.reading,                      glossary: definition.glossary, -                    tags: dictTagsSort(tags) +                    tags: dictTagsSort(tags),  +                    furigana: distributeFurigana(definition.expression, definition.reading)                   });              }          } diff --git a/ext/mixed/js/japanese.js b/ext/mixed/js/japanese.js index c11e955b..a8f72059 100644 --- a/ext/mixed/js/japanese.js +++ b/ext/mixed/js/japanese.js @@ -38,3 +38,81 @@ function jpKatakanaToHiragana(text) {      return result;  } + +function distributeFurigana(word, reading) {  +    reading = reading || wanakana.toHiragana(word);  +    function span(str, pred) {  +        let i = 0;  +        while (i < str.length && pred(str[i])) {  +            i++;  +        }  +        return [str.substring(0, i), str.substring(i)];  +    }  +    const isKanji = c => jpIsKanji(c) ||  +        c == "\u3005"; /* kurikaeshi */  +    const isKana = c => jpIsKana(c) ||  +        c == "\u30fc"; /* chouonpu */  +    function parse(word) {  +        const res = [];  +        while (word.length > 0) {  +            const c = word.charAt(0);  +            if (isKana(c)) {  +                const [text, rest] = span(word, isKana);  +                res.push({ type: "kana", text });  +                word = rest;  +            } else if (isKanji(c)) {  +                const [text, rest] = span(word, isKanji);  +                res.push({ type: "kanji", text });  +                word = rest;  +            } else return null;  +        }  +        return res;  +    }  +  +    let fallback = () => [{ text: word, furigana: reading }];  +    let parts = parse(word);  +    if (parts == null) return fallback();  +    let parti = 0;  +    let readingi = 0;  +    let res = [];  +    let current = null;  +    function backtrack() {  +        parti--;  +        const prev = res.pop();  +        current = prev.furigana;  +    }  +    while (parti < parts.length) {  +        const part = parts[parti];  +        switch (part.type) {  +            case 'kana':  +                if (reading.startsWith(wanakana.toHiragana(part.text), readingi)) {  +                    if (parti == parts.length - 1 && readingi != reading.length - part.text.length) {  +                        backtrack();  +                    } else {  +                        readingi += part.text.length;  +                        res.push({ text: part.text });  +                        parti++;  +                    }  +                } else backtrack();  +                break;  +            case "kanji":  +                current = current || "";  +                if (parti == parts.length - 1) {  +                    // last part, consume all  +                    current += reading.substring(readingi);  +                } else {  +                    const nextText = parts[parti + 1].text;  +                    let end = reading.indexOf(nextText, readingi + 1); // consume at least one character  +                    if (end == -1) {  +                        return fallback();  +                    }  +                    current += reading.substring(readingi, end);  +                    readingi = end;  +                }  +                res.push({ text: part.text, furigana: current });  +                current = null;  +                parti++;  +        }  +    }  +    return res; +}  diff --git a/tmpl/fields.html b/tmpl/fields.html index 944a43e6..8bd94dc0 100644 --- a/tmpl/fields.html +++ b/tmpl/fields.html @@ -44,9 +44,19 @@  {{#*inline "furigana"}}      {{~#if html~}} -        {{~#if definition.reading}}<ruby>{{definition.expression}}<rt>{{definition.reading}}</rt></ruby>{{else}}{{definition.expression}}{{/if~}} +        {{~#definition.furigana~}} +            {{~#if furigana~}} +                <ruby>{{text}}<rt>{{furigana}}</rt></ruby> +            {{~else~}} +                {{text}} +            {{/if~}} +        {{~/definition.furigana~}}      {{~else~}} -        {{~#if definition.reading}}{{definition.expression}} [{{definition.reading}}]{{else}}{{definition.expression}}{{/if~}} +        {{#definition.furigana}} +            {{~#furigana}} {{/furigana~}} +            {{text}} +            {{~#furigana}}[{{.}}]{{/furigana~}} +        {{/definition.furigana}}       {{~/if~}}  {{/inline}} |