Search function overhaul: now search by case sensitive and regardless of diacritics!
Changed markdown parser to allow Github-Flavored Markdown.
This commit is contained in:
parent
d3f296e560
commit
dcecb90b62
|
@ -102,7 +102,7 @@ input, textarea, select, option, button {
|
||||||
}
|
}
|
||||||
|
|
||||||
#loginLink, #logoutLink,
|
#loginLink, #logoutLink,
|
||||||
#descriptionToggle, #settingsButton,
|
#descriptionToggle, #searchFilterToggle, #settingsButton,
|
||||||
.deleteCancelButton, .deleteConfirmButton,
|
.deleteCancelButton, .deleteConfirmButton,
|
||||||
#settingsScreenCloseButton, #infoScreenCloseButton,
|
#settingsScreenCloseButton, #infoScreenCloseButton,
|
||||||
.helperlink {
|
.helperlink {
|
||||||
|
|
|
@ -153,7 +153,9 @@ input[type=checkbox] {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
#descriptionToggle {
|
#descriptionToggle, #searchFilterToggle {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 8px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
12
index.php
12
index.php
|
@ -68,6 +68,8 @@ if ($_GET['adminoverride'] == 'dictionarytotext') {
|
||||||
<span id="descriptionToggle" class="clickable" onclick="ToggleDescription();">Show Description</span>
|
<span id="descriptionToggle" class="clickable" onclick="ToggleDescription();">Show Description</span>
|
||||||
<div id="dictionaryDescription" style="display:none;"></div>
|
<div id="dictionaryDescription" style="display:none;"></div>
|
||||||
|
|
||||||
|
<span id="searchFilterToggle" class="clickable" onclick="ToggleSearchFilter();">Search/Filter Options</span>
|
||||||
|
<div id="searchFilterArea" style="display:none;">
|
||||||
<div id="searchArea" style="display:block;">
|
<div id="searchArea" style="display:block;">
|
||||||
<label style="margin-top:10px;">
|
<label style="margin-top:10px;">
|
||||||
<span>Search</span>
|
<span>Search</span>
|
||||||
|
@ -79,6 +81,9 @@ if ($_GET['adminoverride'] == 'dictionarytotext') {
|
||||||
<label style="display:inline;margin:0;">Word <input type="checkbox" id="searchOptionWord" checked="checked" onchange="ShowDictionary()" /></label>
|
<label style="display:inline;margin:0;">Word <input type="checkbox" id="searchOptionWord" checked="checked" onchange="ShowDictionary()" /></label>
|
||||||
<label style="display:inline;margin:0;">Equivalent <input type="checkbox" id="searchOptionSimple" checked="checked" onchange="ShowDictionary()" /></label>
|
<label style="display:inline;margin:0;">Equivalent <input type="checkbox" id="searchOptionSimple" checked="checked" onchange="ShowDictionary()" /></label>
|
||||||
<label style="display:inline;margin:0;">Explanation <input type="checkbox" id="searchOptionLong" checked="checked" onchange="ShowDictionary()" /></label>
|
<label style="display:inline;margin:0;">Explanation <input type="checkbox" id="searchOptionLong" checked="checked" onchange="ShowDictionary()" /></label>
|
||||||
|
<br />
|
||||||
|
<label style="display:inline;margin:0;">Search Case-Sensitive <input type="checkbox" id="searchCaseSensitive" onchange="ShowDictionary()" /></label>
|
||||||
|
<label style="display:inline;margin:0;" title="Note: Matching diacritics will appear but may not highlight.">Ignore Diacritics/Accents <input type="checkbox" id="searchIgnoreDiacritics" onchange="ShowDictionary()" /></label>
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
@ -87,6 +92,7 @@ if ($_GET['adminoverride'] == 'dictionarytotext') {
|
||||||
<option value="">All</option>
|
<option value="">All</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="theDictionary"></div>
|
<div id="theDictionary"></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -167,9 +173,11 @@ if ($_GET['adminoverride'] == 'dictionarytotext') {
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<!-- Markdown Parser -->
|
<!-- Markdown Parser -->
|
||||||
<script src="js/markdown-js/markdown.min.js"></script>
|
<script src="js/marked.js"></script>
|
||||||
<!-- JSON Search -->
|
<!-- JSON Search -->
|
||||||
<script src="js/defiant-js/defiant-latest.min.js"></script>
|
<script src="js/defiant-js/defiant-latest.js"></script>
|
||||||
|
<!-- Diacritics Removal for Exports -->
|
||||||
|
<script src="js/removeDiacritics.js"></script>
|
||||||
<!-- Main Script -->
|
<!-- Main Script -->
|
||||||
<script src="js/dictionaryBuilder.js"></script>
|
<script src="js/dictionaryBuilder.js"></script>
|
||||||
<script src="js/ui.js"></script>
|
<script src="js/ui.js"></script>
|
||||||
|
|
|
@ -0,0 +1,687 @@
|
||||||
|
/*
|
||||||
|
* Defiant.js v1.2.5
|
||||||
|
* Serch JSON structures plus smart templating with XSLT and XPath.
|
||||||
|
* http://defiantjs.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2015, Hakan Bilgin <hbi@longscript.com>
|
||||||
|
* Licensed under the MIT License
|
||||||
|
*
|
||||||
|
* NOTE:
|
||||||
|
* Robbie Antenesse edited line 165's RegExp to search global and case-insensitive in case of multiple contains() groups.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (typeof module === "undefined") {
|
||||||
|
var module = { exports: undefined };
|
||||||
|
} else {
|
||||||
|
// Node env adaptation goes here...
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Defiant = (function(window, undefined) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var Defiant = {
|
||||||
|
is_ie : /msie/i.test(navigator.userAgent),
|
||||||
|
is_safari : /safari/i.test(navigator.userAgent),
|
||||||
|
env : 'production',
|
||||||
|
xml_decl : '<?xml version="1.0" encoding="utf-8"?>',
|
||||||
|
namespace : 'xmlns:d="defiant-namespace"',
|
||||||
|
tabsize : 4,
|
||||||
|
render: function(template, data) {
|
||||||
|
var processor = new XSLTProcessor(),
|
||||||
|
span = document.createElement('span'),
|
||||||
|
opt = {match: '/'},
|
||||||
|
tmpltXpath,
|
||||||
|
scripts,
|
||||||
|
temp,
|
||||||
|
sorter;
|
||||||
|
// handle arguments
|
||||||
|
switch (typeof(template)) {
|
||||||
|
case 'object':
|
||||||
|
this.extend(opt, template);
|
||||||
|
if (!opt.data) opt.data = data;
|
||||||
|
break;
|
||||||
|
case 'string':
|
||||||
|
opt.template = template;
|
||||||
|
opt.data = data;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw 'error';
|
||||||
|
}
|
||||||
|
opt.data = JSON.toXML(opt.data);
|
||||||
|
tmpltXpath = '//xsl:template[@name="'+ opt.template +'"]';
|
||||||
|
|
||||||
|
if (!this.xsl_template) this.gatherTemplates();
|
||||||
|
|
||||||
|
if (opt.sorter) {
|
||||||
|
sorter = this.node.selectSingleNode(this.xsl_template, tmpltXpath +'//xsl:for-each//xsl:sort');
|
||||||
|
if (sorter) {
|
||||||
|
if (opt.sorter.order) sorter.setAttribute('order', opt.sorter.order);
|
||||||
|
if (opt.sorter.select) sorter.setAttribute('select', opt.sorter.select);
|
||||||
|
sorter.setAttribute('data-type', opt.sorter.type || 'text');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = this.node.selectSingleNode(this.xsl_template, tmpltXpath);
|
||||||
|
temp.setAttribute('match', opt.match);
|
||||||
|
processor.importStylesheet(this.xsl_template);
|
||||||
|
span.appendChild(processor.transformToFragment(opt.data, document));
|
||||||
|
temp.removeAttribute('match');
|
||||||
|
|
||||||
|
if (this.is_safari) {
|
||||||
|
scripts = span.getElementsByTagName('script');
|
||||||
|
for (var i=0, il=scripts.length; i<il; i++) scripts[i].defer = true;
|
||||||
|
}
|
||||||
|
return span.innerHTML;
|
||||||
|
},
|
||||||
|
gatherTemplates: function() {
|
||||||
|
var scripts = document.getElementsByTagName('script'),
|
||||||
|
str = '',
|
||||||
|
i = 0,
|
||||||
|
il = scripts.length;
|
||||||
|
for (; i<il; i++) {
|
||||||
|
if (scripts[i].type === 'defiant/xsl-template') str += scripts[i].innerHTML;
|
||||||
|
}
|
||||||
|
this.xsl_template = this.xmlFromString('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" '+ this.namespace +'>'+ str.replace(/defiant:(\w+)/g, '$1') +'</xsl:stylesheet>');
|
||||||
|
},
|
||||||
|
getSnapshot: function(data) {
|
||||||
|
return JSON.toXML(data, true);
|
||||||
|
},
|
||||||
|
xmlFromString: function(str) {
|
||||||
|
var parser,
|
||||||
|
doc;
|
||||||
|
str = str.replace(/>\s{1,}</g, '><');
|
||||||
|
if (str.trim().match(/<\?xml/) === null) {
|
||||||
|
str = this.xml_decl + str;
|
||||||
|
}
|
||||||
|
if (this.is_ie) {
|
||||||
|
doc = new ActiveXObject('Msxml2.DOMDocument');
|
||||||
|
doc.loadXML(str);
|
||||||
|
if (str.indexOf('xsl:stylesheet') === -1) {
|
||||||
|
doc.setProperty('SelectionLanguage', 'XPath');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
parser = new DOMParser();
|
||||||
|
doc = parser.parseFromString(str, 'text/xml');
|
||||||
|
}
|
||||||
|
return doc;
|
||||||
|
},
|
||||||
|
extend: function(src, dest) {
|
||||||
|
for (var content in dest) {
|
||||||
|
if (!src[content] || typeof(dest[content]) !== 'object') {
|
||||||
|
src[content] = dest[content];
|
||||||
|
} else {
|
||||||
|
this.extend(src[content], dest[content]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return src;
|
||||||
|
},
|
||||||
|
node: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
return Defiant;
|
||||||
|
|
||||||
|
})(this);
|
||||||
|
|
||||||
|
|
||||||
|
if (typeof(XSLTProcessor) === 'undefined') {
|
||||||
|
|
||||||
|
// emulating XSLT Processor (enough to be used in defiant)
|
||||||
|
var XSLTProcessor = function() {};
|
||||||
|
XSLTProcessor.prototype = {
|
||||||
|
importStylesheet: function(xsldoc) {
|
||||||
|
this.xsldoc = xsldoc;
|
||||||
|
},
|
||||||
|
transformToFragment: function(data, doc) {
|
||||||
|
var str = data.transformNode(this.xsldoc),
|
||||||
|
span = document.createElement('span');
|
||||||
|
span.innerHTML = str;
|
||||||
|
return span;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// extending STRING
|
||||||
|
if (!String.prototype.fill) {
|
||||||
|
String.prototype.fill = function(i,c) {
|
||||||
|
var str = this;
|
||||||
|
c = c || ' ';
|
||||||
|
for (; str.length<i; str+=c){}
|
||||||
|
return str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!String.prototype.trim) {
|
||||||
|
String.prototype.trim = function () {
|
||||||
|
return this.replace(/^\s+|\s+$/gm, '');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!String.prototype.xTransform) {
|
||||||
|
String.prototype.xTransform = function () {
|
||||||
|
var str = this;
|
||||||
|
if (this.indexOf('translate(') === -1) {
|
||||||
|
str = this.replace(/contains\(([^,]+),([^\\)]+)\)/gi, function(c,h,n) {
|
||||||
|
var a = 'abcdefghijklmnopqrstuvwxyz',
|
||||||
|
q = n.trim().slice(-1);
|
||||||
|
return "contains(translate("+ h +", "+ q + a.toUpperCase() + q +", "+ q + a + q +"),"+ n.toLowerCase() +")";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return str.toString();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof(JSON) === 'undefined') {
|
||||||
|
window.JSON = {
|
||||||
|
parse: function (sJSON) { return eval("(" + sJSON + ")"); },
|
||||||
|
stringify: function (vContent) {
|
||||||
|
if (vContent instanceof Object) {
|
||||||
|
var sOutput = "";
|
||||||
|
if (vContent.constructor === Array) {
|
||||||
|
for (var nId = 0; nId < vContent.length; sOutput += this.stringify(vContent[nId]) + ",", nId++);
|
||||||
|
return "[" + sOutput.substr(0, sOutput.length - 1) + "]";
|
||||||
|
}
|
||||||
|
if (vContent.toString !== Object.prototype.toString) {
|
||||||
|
return "\"" + vContent.toString().replace(/"/g, "\\$&") + "\"";
|
||||||
|
}
|
||||||
|
for (var sProp in vContent) {
|
||||||
|
sOutput += "\"" + sProp.replace(/"/g, "\\$&") + "\":" + this.stringify(vContent[sProp]) + ",";
|
||||||
|
}
|
||||||
|
return "{" + sOutput.substr(0, sOutput.length - 1) + "}";
|
||||||
|
}
|
||||||
|
return typeof vContent === "string" ? "\"" + vContent.replace(/"/g, "\\$&") + "\"" : String(vContent);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/* jshint ignore:end */
|
||||||
|
|
||||||
|
if (!JSON.toXML) {
|
||||||
|
JSON.toXML = function(tree, snapshot) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var interpreter = {
|
||||||
|
map : [],
|
||||||
|
rx_validate_name : /^(?!xml)[a-z_][\w\d.:]*$/i,
|
||||||
|
rx_node : /<(.+?)( .*?)>/,
|
||||||
|
rx_constructor : /<(.+?)( d:contr=".*?")>/,
|
||||||
|
rx_namespace : / xmlns\:d="defiant\-namespace"/,
|
||||||
|
rx_data : /(<.+?>)(.*?)(<\/d:data>)/i,
|
||||||
|
rx_function : /function (\w+)/i,
|
||||||
|
to_xml: function(tree) {
|
||||||
|
var str = this.hash_to_xml(null, tree);
|
||||||
|
return Defiant.xmlFromString(str);
|
||||||
|
},
|
||||||
|
hash_to_xml: function(name, tree, array_child) {
|
||||||
|
var is_array = tree.constructor === Array,
|
||||||
|
elem = [],
|
||||||
|
attr = [],
|
||||||
|
key,
|
||||||
|
val,
|
||||||
|
val_is_array,
|
||||||
|
type,
|
||||||
|
is_attr,
|
||||||
|
cname,
|
||||||
|
constr,
|
||||||
|
cnName,
|
||||||
|
i;
|
||||||
|
|
||||||
|
for (key in tree) {
|
||||||
|
val = tree[key];
|
||||||
|
if (val === null || val === undefined || val.toString() === 'NaN') val = null;
|
||||||
|
|
||||||
|
is_attr = key.slice(0,1) === '@';
|
||||||
|
cname = array_child ? name : key;
|
||||||
|
if (cname == +cname && tree.constructor !== Object) cname = 'd:item';
|
||||||
|
if (val === null) {
|
||||||
|
constr = null;
|
||||||
|
cnName = false;
|
||||||
|
} else {
|
||||||
|
constr = val.constructor;
|
||||||
|
cnName = constr.toString().match(this.rx_function)[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_attr) {
|
||||||
|
attr.push( cname.slice(1) +'="'+ this.escape_xml(val) +'"' );
|
||||||
|
if (cnName !== 'String') attr.push( 'd:'+ cname.slice(1) +'="'+ cnName +'"' );
|
||||||
|
} else if (val === null) {
|
||||||
|
elem.push( this.scalar_to_xml( cname, val ) );
|
||||||
|
} else {
|
||||||
|
switch (constr) {
|
||||||
|
case Function:
|
||||||
|
// if constructor is function, then it's not a JSON structure
|
||||||
|
// throw ERROR ?
|
||||||
|
break;
|
||||||
|
case Object:
|
||||||
|
elem.push( this.hash_to_xml( cname, val ) );
|
||||||
|
break;
|
||||||
|
case Array:
|
||||||
|
if (key === cname) {
|
||||||
|
val_is_array = val.constructor === Array;
|
||||||
|
if (val_is_array) {
|
||||||
|
i = val.length;
|
||||||
|
while (i--) {
|
||||||
|
if (val[i].constructor === Array) val_is_array = true;
|
||||||
|
if (!val_is_array && val[i].constructor === Object) val_is_array = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elem.push( this.scalar_to_xml( cname, val, val_is_array ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* falls through */
|
||||||
|
case String:
|
||||||
|
if (typeof(val) === 'string') {
|
||||||
|
val = val.toString().replace(/\&/g, '&')
|
||||||
|
.replace(/\r|\n/g, ' ');
|
||||||
|
}
|
||||||
|
if (cname === '#text') {
|
||||||
|
// prepare map
|
||||||
|
this.map.push(tree);
|
||||||
|
attr.push('d:mi="'+ this.map.length +'"');
|
||||||
|
attr.push('d:constr="'+ cnName +'"');
|
||||||
|
elem.push( this.escape_xml(val) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* falls through */
|
||||||
|
case Number:
|
||||||
|
case Boolean:
|
||||||
|
if (cname === '#text' && cnName !== 'String') {
|
||||||
|
// prepare map
|
||||||
|
this.map.push(tree);
|
||||||
|
attr.push('d:mi="'+ this.map.length +'"');
|
||||||
|
attr.push('d:constr="'+ cnName +'"');
|
||||||
|
elem.push( this.escape_xml(val) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
elem.push( this.scalar_to_xml( cname, val ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!name) {
|
||||||
|
name = 'd:data';
|
||||||
|
attr.push(Defiant.namespace);
|
||||||
|
if (is_array) attr.push('d:constr="Array"');
|
||||||
|
}
|
||||||
|
if (name.match(this.rx_validate_name) === null) {
|
||||||
|
attr.push( 'd:name="'+ name +'"' );
|
||||||
|
name = 'd:name';
|
||||||
|
}
|
||||||
|
if (array_child) return elem.join('');
|
||||||
|
// prepare map
|
||||||
|
this.map.push(tree);
|
||||||
|
attr.push('d:mi="'+ this.map.length +'"');
|
||||||
|
|
||||||
|
return '<'+ name + (attr.length ? ' '+ attr.join(' ') : '') + (elem.length ? '>'+ elem.join('') +'</'+ name +'>' : '/>' );
|
||||||
|
},
|
||||||
|
scalar_to_xml: function(name, val, override) {
|
||||||
|
var attr = '',
|
||||||
|
text,
|
||||||
|
constr,
|
||||||
|
cnName;
|
||||||
|
|
||||||
|
// check whether the nodename is valid
|
||||||
|
if (name.match(this.rx_validate_name) === null) {
|
||||||
|
attr += ' d:name="'+ name +'"';
|
||||||
|
name = 'd:name';
|
||||||
|
override = false;
|
||||||
|
}
|
||||||
|
if (val === null || val.toString() === 'NaN') val = null;
|
||||||
|
if (val === null) return '<'+ name +' d:constr="null"/>';
|
||||||
|
if (val.length === 1 && val[0].constructor === Object) {
|
||||||
|
|
||||||
|
text = this.hash_to_xml(false, val[0]);
|
||||||
|
|
||||||
|
var a1 = text.match(this.rx_node),
|
||||||
|
a2 = text.match(this.rx_constructor);
|
||||||
|
a1 = (a1 !== null)? a1[2]
|
||||||
|
.replace(this.rx_namespace, '')
|
||||||
|
.replace(/>/, '')
|
||||||
|
.replace(/"\/$/, '"') : '';
|
||||||
|
a2 = (a2 !== null)? a2[2] : '';
|
||||||
|
|
||||||
|
text = text.match(this.rx_data);
|
||||||
|
text = (text !== null)? text[2] : '';
|
||||||
|
|
||||||
|
return '<'+ name + a1 +' '+ a2 +' d:type="ArrayItem">'+ text +'</'+ name +'>';
|
||||||
|
} else if (val.length === 0 && val.constructor === Array) {
|
||||||
|
return '<'+ name +' d:constr="Array"/>';
|
||||||
|
}
|
||||||
|
// else
|
||||||
|
if (override) {
|
||||||
|
return this.hash_to_xml( name, val, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
constr = val.constructor;
|
||||||
|
cnName = constr.toString().match(this.rx_function)[1];
|
||||||
|
text = (constr === Array) ? this.hash_to_xml( 'd:item', val, true )
|
||||||
|
: this.escape_xml(val);
|
||||||
|
|
||||||
|
attr += ' d:constr="'+ cnName +'"';
|
||||||
|
// prepare map
|
||||||
|
this.map.push(val);
|
||||||
|
attr += ' d:mi="'+ this.map.length +'"';
|
||||||
|
|
||||||
|
return (name === '#text') ? this.escape_xml(val) : '<'+ name + attr +'>'+ text +'</'+ name +'>';
|
||||||
|
},
|
||||||
|
escape_xml: function(text) {
|
||||||
|
return String(text) .replace(/</g, '<')
|
||||||
|
.replace(/>/g, '>')
|
||||||
|
.replace(/"/g, '"')
|
||||||
|
.replace(/ /g, ' ');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
doc = interpreter.to_xml.call(interpreter, tree);
|
||||||
|
|
||||||
|
// snapshot distinctly improves performance
|
||||||
|
if (snapshot) {
|
||||||
|
return {
|
||||||
|
doc: doc,
|
||||||
|
src: tree,
|
||||||
|
map: interpreter.map
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
this.search.map = interpreter.map;
|
||||||
|
return doc;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!JSON.search) {
|
||||||
|
JSON.search = function(tree, xpath, single) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var isSnapshot = tree.doc && tree.doc.nodeType,
|
||||||
|
doc = isSnapshot ? tree.doc : JSON.toXML(tree),
|
||||||
|
map = isSnapshot ? tree.map : this.search.map,
|
||||||
|
src = isSnapshot ? tree.src : tree,
|
||||||
|
xres = Defiant.node[ single ? 'selectSingleNode' : 'selectNodes' ](doc, xpath.xTransform()),
|
||||||
|
ret = [],
|
||||||
|
mapIndex,
|
||||||
|
i;
|
||||||
|
|
||||||
|
if (single) xres = [xres];
|
||||||
|
i = xres.length;
|
||||||
|
|
||||||
|
while (i--) {
|
||||||
|
switch(xres[i].nodeType) {
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
ret.unshift( xres[i].nodeValue );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mapIndex = +xres[i].getAttribute('d:mi');
|
||||||
|
if (map[mapIndex-1]) ret.unshift( map[mapIndex-1] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if environment = development, add search tracing
|
||||||
|
if (Defiant.env === 'development') {
|
||||||
|
this.trace = JSON.mtrace(src, ret, xres);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!JSON.mtrace) {
|
||||||
|
JSON.mtrace = function(root, hits, xres) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var win = window,
|
||||||
|
stringify = JSON.stringify,
|
||||||
|
sroot = stringify( root, null, '\t' ).replace(/\t/g, ''),
|
||||||
|
trace = [],
|
||||||
|
i = 0,
|
||||||
|
il = xres.length,
|
||||||
|
od = il ? xres[i].ownerDocument.documentElement : false,
|
||||||
|
map = this.search.map,
|
||||||
|
hstr,
|
||||||
|
cConstr,
|
||||||
|
fIndex = 0,
|
||||||
|
mIndex,
|
||||||
|
lStart,
|
||||||
|
lEnd;
|
||||||
|
|
||||||
|
for (; i<il; i++) {
|
||||||
|
switch (xres[i].nodeType) {
|
||||||
|
case 2:
|
||||||
|
cConstr = xres[i].ownerElement ? xres[i].ownerElement.getAttribute('d:'+ xres[i].nodeName) : 'String';
|
||||||
|
hstr = '"@'+ xres[i].nodeName +'": '+ win[ cConstr ]( hits[i] );
|
||||||
|
mIndex = sroot.indexOf(hstr);
|
||||||
|
lEnd = 0;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
cConstr = xres[i].parentNode.getAttribute('d:constr');
|
||||||
|
hstr = win[ cConstr ]( hits[i] );
|
||||||
|
hstr = '"'+ xres[i].parentNode.nodeName +'": '+ (hstr === 'Number' ? hstr : '"'+ hstr +'"');
|
||||||
|
mIndex = sroot.indexOf(hstr);
|
||||||
|
lEnd = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (xres[i] === od) continue;
|
||||||
|
if (xres[i].getAttribute('d:constr') === 'String') {
|
||||||
|
cConstr = xres[i].getAttribute('d:constr');
|
||||||
|
hstr = win[ cConstr ]( hits[i] );
|
||||||
|
hstr = '"'+ xres[i].nodeName +'": '+ (hstr === 'Number' ? hstr : '"'+ hstr +'"');
|
||||||
|
mIndex = sroot.indexOf(hstr, fIndex);
|
||||||
|
lEnd = 0;
|
||||||
|
fIndex = mIndex + 1;
|
||||||
|
} else {
|
||||||
|
hstr = stringify( hits[i], null, '\t' ).replace(/\t/g, '');
|
||||||
|
mIndex = sroot.indexOf(hstr);
|
||||||
|
lEnd = hstr.match(/\n/g).length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lStart = sroot.substring(0,mIndex).match(/\n/g).length+1;
|
||||||
|
trace.push([lStart, lEnd]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return trace;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Defiant.node.selectNodes = function(XNode, XPath) {
|
||||||
|
if (XNode.evaluate) {
|
||||||
|
var ns = XNode.createNSResolver(XNode.documentElement),
|
||||||
|
qI = XNode.evaluate(XPath, XNode, ns, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null),
|
||||||
|
res = [],
|
||||||
|
i = 0,
|
||||||
|
il = qI.snapshotLength;
|
||||||
|
for (; i<il; i++) {
|
||||||
|
res.push( qI.snapshotItem(i) );
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
} else {
|
||||||
|
return XNode.selectNodes(XPath);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Defiant.node.selectSingleNode = function(XNode, XPath) {
|
||||||
|
if (XNode.evaluate) {
|
||||||
|
var xI = this.selectNodes(XNode, XPath);
|
||||||
|
return (xI.length > 0)? xI[0] : null;
|
||||||
|
} else {
|
||||||
|
return XNode.selectSingleNode(XPath);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Defiant.node.prettyPrint = function(node) {
|
||||||
|
var root = Defiant,
|
||||||
|
tabs = root.tabsize,
|
||||||
|
decl = root.xml_decl.toLowerCase(),
|
||||||
|
ser,
|
||||||
|
xstr;
|
||||||
|
if (root.is_ie) {
|
||||||
|
xstr = node.xml;
|
||||||
|
} else {
|
||||||
|
ser = new XMLSerializer();
|
||||||
|
xstr = ser.serializeToString(node);
|
||||||
|
}
|
||||||
|
if (root.env !== 'development') {
|
||||||
|
// if environment is not development, remove defiant related info
|
||||||
|
xstr = xstr.replace(/ \w+\:d=".*?"| d\:\w+=".*?"/g, '');
|
||||||
|
}
|
||||||
|
var str = xstr.trim().replace(/(>)\s*(<)(\/*)/g, '$1\n$2$3'),
|
||||||
|
lines = str.split('\n'),
|
||||||
|
indent = -1,
|
||||||
|
i = 0,
|
||||||
|
il = lines.length,
|
||||||
|
start,
|
||||||
|
end;
|
||||||
|
for (; i<il; i++) {
|
||||||
|
if (i === 0 && lines[i].toLowerCase() === decl) continue;
|
||||||
|
start = lines[i].match(/<[A-Za-z_\:]+.*?>/g) !== null;
|
||||||
|
//start = lines[i].match(/<[^\/]+>/g) !== null;
|
||||||
|
end = lines[i].match(/<\/[\w\:]+>/g) !== null;
|
||||||
|
if (lines[i].match(/<.*?\/>/g) !== null) start = end = true;
|
||||||
|
if (start) indent++;
|
||||||
|
lines[i] = String().fill(indent, '\t') + lines[i];
|
||||||
|
if (start && end) indent--;
|
||||||
|
if (!start && end) indent--;
|
||||||
|
}
|
||||||
|
return lines.join('\n').replace(/\t/g, String().fill(tabs, ' '));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Defiant.node.toJSON = function(xnode, stringify) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var interpret = function(leaf) {
|
||||||
|
var obj = {},
|
||||||
|
win = window,
|
||||||
|
attr,
|
||||||
|
type,
|
||||||
|
item,
|
||||||
|
cname,
|
||||||
|
cConstr,
|
||||||
|
cval,
|
||||||
|
text,
|
||||||
|
i, il, a;
|
||||||
|
|
||||||
|
switch (leaf.nodeType) {
|
||||||
|
case 1:
|
||||||
|
cConstr = leaf.getAttribute('d:constr');
|
||||||
|
if (cConstr === 'Array') obj = [];
|
||||||
|
else if (cConstr === 'String' && leaf.textContent === '') obj = '';
|
||||||
|
|
||||||
|
attr = leaf.attributes;
|
||||||
|
i = 0;
|
||||||
|
il = attr.length;
|
||||||
|
for (; i<il; i++) {
|
||||||
|
a = attr.item(i);
|
||||||
|
if (a.nodeName.match(/\:d|d\:/g) !== null) continue;
|
||||||
|
|
||||||
|
cConstr = leaf.getAttribute('d:'+ a.nodeName);
|
||||||
|
if (cConstr && cConstr !== 'undefined') {
|
||||||
|
if (a.nodeValue === 'null') cval = null;
|
||||||
|
else cval = win[ cConstr ]( (a.nodeValue === 'false') ? '' : a.nodeValue );
|
||||||
|
} else {
|
||||||
|
cval = a.nodeValue;
|
||||||
|
}
|
||||||
|
obj['@'+ a.nodeName] = cval;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
type = leaf.parentNode.getAttribute('d:type');
|
||||||
|
cval = (type) ? win[ type ]( leaf.nodeValue === 'false' ? '' : leaf.nodeValue ) : leaf.nodeValue;
|
||||||
|
obj = cval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (leaf.hasChildNodes()) {
|
||||||
|
i = 0;
|
||||||
|
il = leaf.childNodes.length;
|
||||||
|
for(; i<il; i++) {
|
||||||
|
item = leaf.childNodes.item(i);
|
||||||
|
cname = item.nodeName;
|
||||||
|
attr = leaf.attributes;
|
||||||
|
|
||||||
|
if (cname === 'd:name') {
|
||||||
|
cname = item.getAttribute('d:name');
|
||||||
|
}
|
||||||
|
if (cname === '#text') {
|
||||||
|
cConstr = leaf.getAttribute('d:constr');
|
||||||
|
if (cConstr === 'undefined') cConstr = undefined;
|
||||||
|
text = item.textContent || item.text;
|
||||||
|
cval = cConstr === 'Boolean' && text === 'false' ? '' : text;
|
||||||
|
|
||||||
|
if (!cConstr && !attr.length) obj = cval;
|
||||||
|
else if (cConstr && il === 1) {
|
||||||
|
obj = win[cConstr](cval);
|
||||||
|
} else if (!leaf.hasChildNodes()) {
|
||||||
|
obj[cname] = (cConstr)? win[cConstr](cval) : cval;
|
||||||
|
} else {
|
||||||
|
if (attr.length < 3) obj = (cConstr)? win[cConstr](cval) : cval;
|
||||||
|
else obj[cname] = (cConstr)? win[cConstr](cval) : cval;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (obj[cname]) {
|
||||||
|
if (obj[cname].push) obj[cname].push( interpret(item) );
|
||||||
|
else obj[cname] = [obj[cname], interpret(item)];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
cConstr = item.getAttribute('d:constr');
|
||||||
|
switch (cConstr) {
|
||||||
|
case 'null':
|
||||||
|
if (obj.push) obj.push(null);
|
||||||
|
else obj[cname] = null;
|
||||||
|
break;
|
||||||
|
case 'Array':
|
||||||
|
//console.log( Defiant.node.prettyPrint(item) );
|
||||||
|
if (item.parentNode.firstChild === item && cConstr === 'Array' && cname !== 'd:item') {
|
||||||
|
if (cname === 'd:item' || cConstr === 'Array') {
|
||||||
|
cval = interpret(item);
|
||||||
|
obj[cname] = cval.length ? [cval] : cval;
|
||||||
|
} else {
|
||||||
|
obj[cname] = interpret(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (obj.push) obj.push( interpret(item) );
|
||||||
|
else obj[cname] = interpret(item);
|
||||||
|
break;
|
||||||
|
case 'String':
|
||||||
|
case 'Number':
|
||||||
|
case 'Boolean':
|
||||||
|
text = item.textContent || item.text;
|
||||||
|
cval = cConstr === 'Boolean' && text === 'false' ? '' : text;
|
||||||
|
|
||||||
|
if (obj.push) obj.push( win[cConstr](cval) );
|
||||||
|
else obj[cname] = interpret(item);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (obj.push) obj.push( interpret( item ) );
|
||||||
|
else obj[cname] = interpret( item );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (leaf.nodeType === 1 && leaf.getAttribute('d:type') === 'ArrayItem') {
|
||||||
|
obj = [obj];
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
node = (xnode.nodeType === 9) ? xnode.documentElement : xnode,
|
||||||
|
ret = interpret(node),
|
||||||
|
rn = ret[node.nodeName];
|
||||||
|
|
||||||
|
// exclude root, if "this" is root node
|
||||||
|
if (node === node.ownerDocument.documentElement && rn && rn.constructor === Array) {
|
||||||
|
ret = rn;
|
||||||
|
}
|
||||||
|
if (stringify && stringify.toString() === 'true') stringify = '\t';
|
||||||
|
return stringify ? JSON.stringify(ret, null, stringify) : ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// check if jQuery is present
|
||||||
|
if (typeof(jQuery) !== 'undefined') {
|
||||||
|
(function ( $ ) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
$.fn.defiant = function(template, xpath) {
|
||||||
|
this.html( Defiant.render(template, xpath) );
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
}(jQuery));
|
||||||
|
}
|
|
@ -39,11 +39,11 @@ function GetTextFile(filename) {
|
||||||
readmeFileRequest.onreadystatechange = function() {
|
readmeFileRequest.onreadystatechange = function() {
|
||||||
if (readmeFileRequest.readyState == 4 && readmeFileRequest.status == 200) {
|
if (readmeFileRequest.readyState == 4 && readmeFileRequest.status == 200) {
|
||||||
if (filename == "TERMS.md") {
|
if (filename == "TERMS.md") {
|
||||||
termsText = markdown.toHTML(readmeFileRequest.responseText);
|
termsText = marked(readmeFileRequest.responseText);
|
||||||
} else if (filename == "PRIVACY.md") {
|
} else if (filename == "PRIVACY.md") {
|
||||||
privacyText = markdown.toHTML(readmeFileRequest.responseText);
|
privacyText = marked(readmeFileRequest.responseText);
|
||||||
} else {
|
} else {
|
||||||
aboutText = markdown.toHTML(readmeFileRequest.responseText);
|
aboutText = marked(readmeFileRequest.responseText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -203,26 +203,41 @@ function ShowDictionary() {
|
||||||
var filter = document.getElementById("wordFilter").value;
|
var filter = document.getElementById("wordFilter").value;
|
||||||
|
|
||||||
var searchResults = [];
|
var searchResults = [];
|
||||||
var search = htmlEntities(document.getElementById("searchBox").value);
|
var search = htmlEntitiesParseForSearchEntry(document.getElementById("searchBox").value);
|
||||||
if (search != "") {
|
var searchByWord = document.getElementById("searchOptionWord").checked;
|
||||||
|
var searchBySimple = document.getElementById("searchOptionSimple").checked;
|
||||||
|
var searchByLong = document.getElementById("searchOptionLong").checked;
|
||||||
|
var searchIgnoreCase = !document.getElementById("searchCaseSensitive").checked; //It's easier to negate case here instead of negating it every use since ignore case is default.
|
||||||
|
var searchIgnoreDiacritics = document.getElementById("searchIgnoreDiacritics").checked;
|
||||||
|
if (search != "" && (searchByWord || searchBySimple || searchByLong)) {
|
||||||
var xpath = [];
|
var xpath = [];
|
||||||
if (document.getElementById("searchOptionWord").checked) {
|
var searchDictionaryJSON = htmlEntitiesParseForSearch(JSON.stringify(currentDictionary));
|
||||||
xpath.push('contains(name, "'+ search +'")');
|
if (searchIgnoreCase) {
|
||||||
|
search = search.toLowerCase();
|
||||||
|
//searchDictionaryJSON = searchDictionaryJSON.toLowerCase();
|
||||||
}
|
}
|
||||||
if (document.getElementById("searchOptionSimple").checked) {
|
if (searchIgnoreDiacritics) {
|
||||||
xpath.push('contains(simpleDefinition, "'+ search +'")');
|
search = removeDiacritics(search);
|
||||||
|
searchDictionaryJSON = removeDiacritics(searchDictionaryJSON);
|
||||||
}
|
}
|
||||||
if (document.getElementById("searchOptionLong").checked) {
|
if (searchByWord) {
|
||||||
xpath.push('contains(longDefinition, "'+ search +'")');
|
xpath.push('contains('+ ((searchIgnoreCase) ? 'name' : 'translate(name, "", "")') +', "'+ search +'")');
|
||||||
}
|
}
|
||||||
searchResults = JSON.search(currentDictionary, '//words['+ xpath.join(' or ') +']/name');
|
if (searchBySimple) {
|
||||||
|
xpath.push('contains('+ ((searchIgnoreCase) ? 'simpleDefinition' : 'translate(simpleDefinition, "", "")') +', "'+ search +'")');
|
||||||
|
}
|
||||||
|
if (searchByLong) {
|
||||||
|
xpath.push('contains('+ ((searchIgnoreCase) ? 'longDefinition' : 'translate(longDefinition, "", "")') +', "'+ search +'")');
|
||||||
|
}
|
||||||
|
var searchDictionary = JSON.parse(searchDictionaryJSON);
|
||||||
|
searchResults = JSON.search(searchDictionary, '//words['+ xpath.join(' or ') +']/wordId');
|
||||||
}
|
}
|
||||||
|
|
||||||
var dictionaryNameArea = document.getElementById("dictionaryName");
|
var dictionaryNameArea = document.getElementById("dictionaryName");
|
||||||
dictionaryNameArea.innerHTML = htmlEntitiesParse(currentDictionary.name) + " Dictionary";
|
dictionaryNameArea.innerHTML = htmlEntitiesParse(currentDictionary.name) + " Dictionary";
|
||||||
|
|
||||||
var dictionaryDescriptionArea = document.getElementById("dictionaryDescription");
|
var dictionaryDescriptionArea = document.getElementById("dictionaryDescription");
|
||||||
dictionaryDescriptionArea.innerHTML = markdown.toHTML(htmlEntitiesParse(currentDictionary.description));
|
dictionaryDescriptionArea.innerHTML = marked(htmlEntitiesParse(currentDictionary.description));
|
||||||
|
|
||||||
var dictionaryArea = document.getElementById("theDictionary");
|
var dictionaryArea = document.getElementById("theDictionary");
|
||||||
var dictionaryText = "";
|
var dictionaryText = "";
|
||||||
|
@ -230,7 +245,7 @@ function ShowDictionary() {
|
||||||
if (currentDictionary.words.length > 0) {
|
if (currentDictionary.words.length > 0) {
|
||||||
for (var i = 0; i < currentDictionary.words.length; i++) {
|
for (var i = 0; i < currentDictionary.words.length; i++) {
|
||||||
if (filter == "" || (filter != "" && currentDictionary.words[i].partOfSpeech == filter)) {
|
if (filter == "" || (filter != "" && currentDictionary.words[i].partOfSpeech == filter)) {
|
||||||
if (search == "" || (search != "" && searchResults.indexOf(htmlEntities(currentDictionary.words[i].name)) >= 0)) {
|
if (search == "" || (search != "" && (searchByWord || searchBySimple || searchByLong) && searchResults.indexOf(currentDictionary.words[i].wordId) >= 0)) {
|
||||||
if (!currentDictionary.words[i].hasOwnProperty("pronunciation")) {
|
if (!currentDictionary.words[i].hasOwnProperty("pronunciation")) {
|
||||||
currentDictionary.words[i].pronunciation = ""; //Account for new property
|
currentDictionary.words[i].pronunciation = ""; //Account for new property
|
||||||
}
|
}
|
||||||
|
@ -246,32 +261,67 @@ function ShowDictionary() {
|
||||||
}
|
}
|
||||||
|
|
||||||
dictionaryArea.innerHTML = dictionaryText;
|
dictionaryArea.innerHTML = dictionaryText;
|
||||||
|
console.log("dictionary shown");
|
||||||
}
|
}
|
||||||
|
|
||||||
function DictionaryEntry(itemIndex) {
|
function DictionaryEntry(itemIndex) {
|
||||||
var entryText = "<entry><a name='" + currentDictionary.words[itemIndex].wordId + "'></a><a href='#" + currentDictionary.words[itemIndex].wordId + "' class='wordLink clickable'>🔗</a>";
|
var entryText = "<entry><a name='" + currentDictionary.words[itemIndex].wordId + "'></a><a href='#" + currentDictionary.words[itemIndex].wordId + "' class='wordLink clickable'>🔗</a>";
|
||||||
|
|
||||||
var searchTerm = htmlEntities(document.getElementById("searchBox").value);
|
var searchTerm = document.getElementById("searchBox").value;
|
||||||
var searchRegEx = new RegExp(searchTerm, "gi");
|
var searchByWord = document.getElementById("searchOptionWord").checked;
|
||||||
|
var searchBySimple = document.getElementById("searchOptionSimple").checked;
|
||||||
|
var searchByLong = document.getElementById("searchOptionLong").checked;
|
||||||
|
var searchIgnoreCase = !document.getElementById("searchCaseSensitive").checked; //It's easier to negate case here instead of negating it every use since ignore case is default.
|
||||||
|
var searchIgnoreDiacritics = document.getElementById("searchIgnoreDiacritics").checked;
|
||||||
|
|
||||||
entryText += "<word>" + ((searchTerm != "" && document.getElementById("searchOptionWord").checked) ? currentDictionary.words[itemIndex].name.replace(searchRegEx, "<searchTerm>" + searchTerm + "</searchterm>") : currentDictionary.words[itemIndex].name) + "</word>";
|
var searchRegEx = new RegExp("(" + ((searchIgnoreDiacritics) ? removeDiacritics(searchTerm) + "|" + searchTerm : searchTerm) + ")", "g" + ((searchIgnoreCase) ? "i" : ""));
|
||||||
|
|
||||||
|
entryText += "<word>";
|
||||||
|
|
||||||
|
if (searchTerm != "" && searchByWord) {
|
||||||
|
entryText += htmlEntitiesParse(currentDictionary.words[itemIndex].name).replace(searchRegEx, "<searchTerm>$1</searchterm>");
|
||||||
|
} else {
|
||||||
|
entryText += currentDictionary.words[itemIndex].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
entryText += "</word>";
|
||||||
|
|
||||||
if (currentDictionary.words[itemIndex].pronunciation != "") {
|
if (currentDictionary.words[itemIndex].pronunciation != "") {
|
||||||
entryText += "<pronunciation>" + markdown.toHTML(htmlEntitiesParse(currentDictionary.words[itemIndex].pronunciation)).replace("<p>","").replace("</p>","") + "</pronunciation>";
|
entryText += "<pronunciation>";
|
||||||
|
entryText += marked(htmlEntitiesParse(currentDictionary.words[itemIndex].pronunciation)).replace("<p>","").replace("</p>","");
|
||||||
|
entryText += "</pronunciation>";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentDictionary.words[itemIndex].partOfSpeech != "") {
|
if (currentDictionary.words[itemIndex].partOfSpeech != "") {
|
||||||
entryText += "<partofspeech>" + currentDictionary.words[itemIndex].partOfSpeech + "</partofspeech>";
|
entryText += "<partofspeech>";
|
||||||
|
entryText += currentDictionary.words[itemIndex].partOfSpeech;
|
||||||
|
entryText += "</partofspeech>";
|
||||||
}
|
}
|
||||||
|
|
||||||
entryText += "<br>";
|
entryText += "<br>";
|
||||||
|
|
||||||
if (currentDictionary.words[itemIndex].simpleDefinition != "") {
|
if (currentDictionary.words[itemIndex].simpleDefinition != "") {
|
||||||
entryText += "<simpledefinition>" + ((searchTerm != "" && document.getElementById("searchOptionSimple").checked) ? currentDictionary.words[itemIndex].simpleDefinition.replace(searchRegEx, "<searchTerm>" + searchTerm + "</searchterm>") : currentDictionary.words[itemIndex].simpleDefinition) + "</simpledefinition>";
|
entryText += "<simpledefinition>";
|
||||||
|
|
||||||
|
if (searchTerm != "" && searchBySimple) {
|
||||||
|
entryText += htmlEntitiesParse(currentDictionary.words[itemIndex].simpleDefinition).replace(searchRegEx, "<searchTerm>$1</searchterm>");
|
||||||
|
} else {
|
||||||
|
entryText += currentDictionary.words[itemIndex].simpleDefinition;
|
||||||
|
}
|
||||||
|
|
||||||
|
entryText += "</simpledefinition>";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentDictionary.words[itemIndex].longDefinition != "") {
|
if (currentDictionary.words[itemIndex].longDefinition != "") {
|
||||||
entryText += "<longdefinition>" + ((searchTerm != "" && document.getElementById("searchOptionLong").checked) ? markdown.toHTML(htmlEntitiesParse(currentDictionary.words[itemIndex].longDefinition)).replace(searchRegEx, "<searchTerm>" + searchTerm + "</searchterm>") : markdown.toHTML(htmlEntitiesParse(currentDictionary.words[itemIndex].longDefinition))) + "</longdefinition>";
|
entryText += "<longdefinition>";
|
||||||
|
|
||||||
|
if (searchTerm != "" && searchByLong) {
|
||||||
|
entryText += marked(htmlEntitiesParse(currentDictionary.words[itemIndex].longDefinition).replace(searchRegEx, "<searchTerm>$1</searchterm>"));
|
||||||
|
} else {
|
||||||
|
entryText += marked(htmlEntitiesParse(currentDictionary.words[itemIndex].longDefinition));
|
||||||
|
}
|
||||||
|
|
||||||
|
entryText += "</longdefinition>";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!currentDictionary.settings.isComplete) {
|
if (!currentDictionary.settings.isComplete) {
|
||||||
|
@ -371,7 +421,7 @@ function LoadDictionary() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function ExportDictionary() {
|
function ExportDictionary() {
|
||||||
var downloadName = currentDictionary.name.replace(/\W/g, '');
|
var downloadName = removeDiacritics(stripHtmlEntities(currentDictionary.name)).replace(/\W/g, '');
|
||||||
if (downloadName == "") {
|
if (downloadName == "") {
|
||||||
downloadName = "export";
|
downloadName = "export";
|
||||||
}
|
}
|
||||||
|
@ -444,6 +494,19 @@ function htmlEntitiesParse(string) {
|
||||||
return String(string).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'").replace(/<br>/g, '\n');
|
return String(string).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'").replace(/<br>/g, '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function stripHtmlEntities(string) {
|
||||||
|
// This is for the export name.
|
||||||
|
return String(string).replace(/&/g, '').replace(/</g, '').replace(/>/g, '').replace(/"/g, '').replace(/'/g, "").replace(/<br>/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
function htmlEntitiesParseForSearchEntry(string) {
|
||||||
|
return String(string).replace(/"/g, '%%').replace(/'/g, "``");
|
||||||
|
}
|
||||||
|
|
||||||
|
function htmlEntitiesParseForSearch(string) {
|
||||||
|
return String(string).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '%%').replace(/'/g, "``");
|
||||||
|
}
|
||||||
|
|
||||||
function dynamicSort(property) {
|
function dynamicSort(property) {
|
||||||
/* Retrieved from http://stackoverflow.com/a/4760279
|
/* Retrieved from http://stackoverflow.com/a/4760279
|
||||||
Usage: theArray.sort(dynamicSort("objectProperty"));*/
|
Usage: theArray.sort(dynamicSort("objectProperty"));*/
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
Retrieved from http://stackoverflow.com/a/18391901/3508346
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
var defaultDiacriticsRemovalap = [
|
||||||
|
{'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'},
|
||||||
|
{'base':'AA','letters':'\uA732'},
|
||||||
|
{'base':'AE','letters':'\u00C6\u01FC\u01E2'},
|
||||||
|
{'base':'AO','letters':'\uA734'},
|
||||||
|
{'base':'AU','letters':'\uA736'},
|
||||||
|
{'base':'AV','letters':'\uA738\uA73A'},
|
||||||
|
{'base':'AY','letters':'\uA73C'},
|
||||||
|
{'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'},
|
||||||
|
{'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'},
|
||||||
|
{'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'},
|
||||||
|
{'base':'DZ','letters':'\u01F1\u01C4'},
|
||||||
|
{'base':'Dz','letters':'\u01F2\u01C5'},
|
||||||
|
{'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'},
|
||||||
|
{'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'},
|
||||||
|
{'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'},
|
||||||
|
{'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'},
|
||||||
|
{'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'},
|
||||||
|
{'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'},
|
||||||
|
{'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'},
|
||||||
|
{'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'},
|
||||||
|
{'base':'LJ','letters':'\u01C7'},
|
||||||
|
{'base':'Lj','letters':'\u01C8'},
|
||||||
|
{'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'},
|
||||||
|
{'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'},
|
||||||
|
{'base':'NJ','letters':'\u01CA'},
|
||||||
|
{'base':'Nj','letters':'\u01CB'},
|
||||||
|
{'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'},
|
||||||
|
{'base':'OI','letters':'\u01A2'},
|
||||||
|
{'base':'OO','letters':'\uA74E'},
|
||||||
|
{'base':'OU','letters':'\u0222'},
|
||||||
|
{'base':'OE','letters':'\u008C\u0152'},
|
||||||
|
{'base':'oe','letters':'\u009C\u0153'},
|
||||||
|
{'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'},
|
||||||
|
{'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'},
|
||||||
|
{'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'},
|
||||||
|
{'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'},
|
||||||
|
{'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'},
|
||||||
|
{'base':'TZ','letters':'\uA728'},
|
||||||
|
{'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'},
|
||||||
|
{'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'},
|
||||||
|
{'base':'VY','letters':'\uA760'},
|
||||||
|
{'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'},
|
||||||
|
{'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'},
|
||||||
|
{'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'},
|
||||||
|
{'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'},
|
||||||
|
{'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'},
|
||||||
|
{'base':'aa','letters':'\uA733'},
|
||||||
|
{'base':'ae','letters':'\u00E6\u01FD\u01E3'},
|
||||||
|
{'base':'ao','letters':'\uA735'},
|
||||||
|
{'base':'au','letters':'\uA737'},
|
||||||
|
{'base':'av','letters':'\uA739\uA73B'},
|
||||||
|
{'base':'ay','letters':'\uA73D'},
|
||||||
|
{'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'},
|
||||||
|
{'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'},
|
||||||
|
{'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'},
|
||||||
|
{'base':'dz','letters':'\u01F3\u01C6'},
|
||||||
|
{'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'},
|
||||||
|
{'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'},
|
||||||
|
{'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'},
|
||||||
|
{'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'},
|
||||||
|
{'base':'hv','letters':'\u0195'},
|
||||||
|
{'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'},
|
||||||
|
{'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'},
|
||||||
|
{'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'},
|
||||||
|
{'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'},
|
||||||
|
{'base':'lj','letters':'\u01C9'},
|
||||||
|
{'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'},
|
||||||
|
{'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'},
|
||||||
|
{'base':'nj','letters':'\u01CC'},
|
||||||
|
{'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'},
|
||||||
|
{'base':'oi','letters':'\u01A3'},
|
||||||
|
{'base':'ou','letters':'\u0223'},
|
||||||
|
{'base':'oo','letters':'\uA74F'},
|
||||||
|
{'base':'p','letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'},
|
||||||
|
{'base':'q','letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'},
|
||||||
|
{'base':'r','letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'},
|
||||||
|
{'base':'s','letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'},
|
||||||
|
{'base':'t','letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'},
|
||||||
|
{'base':'tz','letters':'\uA729'},
|
||||||
|
{'base':'u','letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'},
|
||||||
|
{'base':'v','letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'},
|
||||||
|
{'base':'vy','letters':'\uA761'},
|
||||||
|
{'base':'w','letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'},
|
||||||
|
{'base':'x','letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'},
|
||||||
|
{'base':'y','letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'},
|
||||||
|
{'base':'z','letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'}
|
||||||
|
];
|
||||||
|
|
||||||
|
var diacriticsMap = {};
|
||||||
|
for (var i=0; i < defaultDiacriticsRemovalap.length; i++){
|
||||||
|
var letters = defaultDiacriticsRemovalap[i].letters;
|
||||||
|
for (var j=0; j < letters.length ; j++){
|
||||||
|
diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// "what?" version ... http://jsperf.com/diacritics/12
|
||||||
|
function removeDiacritics(str) {
|
||||||
|
return str.replace(/[^\u0000-\u007E]/g, function(a){
|
||||||
|
return diacriticsMap[a] || a;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*var allDiacritics = [];
|
||||||
|
for (var i=0; i < defaultDiacriticsRemovalap.length; i++) {
|
||||||
|
var letters = defaultDiacriticsRemovalap[i].letters.split('');
|
||||||
|
for (var j=0; j < letters.length ; j++){
|
||||||
|
allDiacritics = allDiacritics.push(letters[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDiacriticIndexes(searchString) {
|
||||||
|
// Finds starting and ending positions of quoted text
|
||||||
|
// in double or single quotes with escape char support like \" \'
|
||||||
|
var patt = new RegExp("[" + allDiacritics.join[''] + "]", "gim"); ///"((?:\\.|[^"])*)"/igm;
|
||||||
|
var ret = [];
|
||||||
|
while (match = patt.exec(searchString)) {
|
||||||
|
ret.push(match.index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}*/
|
13
js/ui.js
13
js/ui.js
|
@ -29,6 +29,19 @@ function ToggleDescription() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ToggleSearchFilter() {
|
||||||
|
var searchFilterToggle = document.getElementById("searchFilterToggle");
|
||||||
|
var searchFilterArea = document.getElementById("searchFilterArea");
|
||||||
|
|
||||||
|
if (searchFilterArea.style.display == "none") {
|
||||||
|
searchFilterArea.style.display = "block";
|
||||||
|
searchFilterToggle.innerHTML = "Hide Search/Filter Options";
|
||||||
|
} else {
|
||||||
|
searchFilterArea.style.display = "none";
|
||||||
|
searchFilterToggle.innerHTML = "Search/Filter Options";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function ShowInfo(text) {
|
function ShowInfo(text) {
|
||||||
if (text == "terms") {
|
if (text == "terms") {
|
||||||
document.getElementById("infoText").innerHTML = termsText;
|
document.getElementById("infoText").innerHTML = termsText;
|
||||||
|
|
Loading…
Reference in New Issue