commit
6156f4b2a9
@ -0,0 +1,3 @@ |
||||
.idea/ |
||||
*~ |
||||
*.bak |
@ -0,0 +1,44 @@ |
||||
ABBR |
||||
==== |
||||
|
||||
Abbr is a JavaScript library / function for finding, highlighting and annotating abbreviations in text. |
||||
|
||||
It needs no extra markup, all is done automatically. Just tell it what words you want to explain, and it'll do it. |
||||
|
||||
Abbr takes the following arguments: |
||||
|
||||
var opts = { |
||||
// selector in which to search for abbreviations |
||||
where: 'body', |
||||
// abbreviation list - word: explanation |
||||
words: {}, |
||||
// Tag used to mark the matches |
||||
tag: 'abbr', |
||||
// Attribute holding the "description" to be added to the tag |
||||
attr: 'title', |
||||
// Case insensitive |
||||
ci: true, |
||||
// tags that shall not be traversed (in addition to opts.tag) |
||||
excluded: ['script', 'style', 'code', 'head', 'textarea', 'embed'], |
||||
// Extra excluded (doesn't overwrite the original list) |
||||
exclude: [] |
||||
}; |
||||
|
||||
All config options are optional (though, obviously, you don't want to leave `words` empty). |
||||
|
||||
To run it, simply call: |
||||
|
||||
abbr({ |
||||
// Your options here |
||||
}); |
||||
|
||||
For example: |
||||
|
||||
abbr({ |
||||
where: 'article', |
||||
words: { |
||||
'NSA': 'National Spying Agency', |
||||
'Putin': 'Bear rider' |
||||
} |
||||
}); |
||||
|
@ -0,0 +1,131 @@ |
||||
/** |
||||
* HTML abbreviation builder |
||||
* ------------------------- |
||||
* (c) MightyPork, 2015 |
||||
* MIT License |
||||
*/ |
||||
|
||||
(function () { |
||||
"use strict"; |
||||
|
||||
function _extend(a, b) { |
||||
if (!b) return; |
||||
for (var i in a) { |
||||
if (b.hasOwnProperty(i)) { |
||||
a[i] = b[i]; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
function _escape(s) { |
||||
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); |
||||
} |
||||
|
||||
|
||||
/** Public function */ |
||||
function abbr(config) { |
||||
|
||||
// Default config options
|
||||
|
||||
var opts = { |
||||
// selector in which to search for abbreviations
|
||||
where: 'body', |
||||
// abbreviation list - word: explanation
|
||||
words: {}, |
||||
// Tag used to mark the matches
|
||||
tag: 'abbr', |
||||
// Attribute holding the "description" to be added to the tag
|
||||
attr: 'title', |
||||
// Case insensitive
|
||||
ci: true, |
||||
// tags that shall not be traversed (in addition to opts.tag)
|
||||
excluded: ['script', 'style', 'code', 'head', 'textarea', 'embed'], |
||||
// Extra excluded (doesn't overwrite the original list)
|
||||
exclude: [] |
||||
}; |
||||
|
||||
|
||||
_extend(opts, config); |
||||
|
||||
// matches tags that shouldn't be traversed
|
||||
var badRegex = new RegExp('(' + opts.excluded.concat(opts.exclude).join('|') + '|' + opts.tag + ')', 'i'); |
||||
|
||||
var wordlist = []; |
||||
for (var word in opts.words) { |
||||
if (!opts.words.hasOwnProperty(word)) continue; |
||||
|
||||
wordlist.push({ |
||||
w: word, |
||||
t: opts.words[word], |
||||
r: new RegExp('\\b' + _escape(word) + '\\b', opts.ci ? 'gi' : 'g'), |
||||
l: word.length |
||||
}); |
||||
} |
||||
|
||||
function _handle_nodes(nodes) { |
||||
var i, j, node, offset, chop, collected, wrap, abbr_txt, abbr_txt_clone; |
||||
|
||||
for (i = 0; i < nodes.length; i++) { |
||||
node = nodes[i]; |
||||
|
||||
if (node.nodeType == 1) { |
||||
|
||||
if (node.childNodes && !badRegex.test(node.tagName)) { |
||||
// ugly hack to convert live node list to array
|
||||
var nl = []; |
||||
for (j = 0; j < node.childNodes.length; j++) nl.push(node.childNodes[j]); |
||||
_handle_nodes(nl); |
||||
} |
||||
|
||||
} else if (node.nodeType == 3) { |
||||
|
||||
// find replacement positions within the text node
|
||||
var text = node.textContent; |
||||
var replpairs = []; |
||||
for (j = 0; j < wordlist.length; j++) { |
||||
var obj = wordlist[j]; |
||||
text.replace(obj.r, function (_, offset) { |
||||
replpairs.push({at: offset, len: obj.l, t: obj.t}); |
||||
}); |
||||
} |
||||
|
||||
// sort by position
|
||||
replpairs.sort(function (a, b) { |
||||
return a.at - b.at; |
||||
}); |
||||
|
||||
for (offset = 0, j = 0; j < replpairs.length; j++) { |
||||
var rp = replpairs[j]; |
||||
|
||||
// remove non-abbr text
|
||||
chop = rp.at - offset; |
||||
if (chop < 0) continue; |
||||
|
||||
node = node.splitText(chop); |
||||
offset += chop; |
||||
|
||||
// collect abbr text
|
||||
chop = rp.len; |
||||
collected = node; |
||||
node = node.splitText(chop); |
||||
offset += chop; |
||||
|
||||
// the highlight thing
|
||||
wrap = document.createElement(opts.tag); |
||||
wrap.setAttribute(opts.attr, rp.t); |
||||
abbr_txt = collected; |
||||
abbr_txt_clone = abbr_txt.cloneNode(true); |
||||
wrap.appendChild(abbr_txt_clone); |
||||
abbr_txt.parentNode.replaceChild(wrap, abbr_txt); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
_handle_nodes(document.querySelectorAll(opts.where)); |
||||
} |
||||
|
||||
// make it public
|
||||
window.abbr = abbr; |
||||
})(); |
@ -0,0 +1,80 @@ |
||||
<!DOCTYPE HTML> |
||||
<html> |
||||
<head> |
||||
<style> |
||||
abbr {border-bottom: 1px dashed black; cursor: help;} |
||||
abbr:hover {border-bottom-color: #1b6196;} |
||||
</style> |
||||
|
||||
<!-- Include it --> |
||||
<script src="abbr.js"></script> |
||||
|
||||
<script type="text/javascript"> |
||||
|
||||
function init() { |
||||
abbr({ |
||||
// It supports various options, |
||||
// see the library file for reference. |
||||
words: { |
||||
'GNU/Linux': 'Combo of GNU utils and Linux Kernel.', |
||||
'Linux': 'Holy grail', |
||||
'Unix': "Not sure, google it!", |
||||
'operating system': 'something in a computer', |
||||
'system': 'order', |
||||
'automation': 'doing stuff by itself', |
||||
'free': 'not paid', |
||||
'open-source': 'With publicly available code.', |
||||
'Wikipedia': 'free online encyclopedia', |
||||
'formware': 'low level system code' |
||||
}, |
||||
exclude: ['h1'] |
||||
}); |
||||
} |
||||
|
||||
</script> |
||||
</head> |
||||
|
||||
<body onload="init()"><!-- Use $(document).ready() if you have jQuery --> |
||||
|
||||
<h1>Example text from Wikipedia</h1> |
||||
|
||||
<h2>This is a text from Wikipedia</h2> |
||||
|
||||
<p> |
||||
Linux (pronounced Listeni/ˈlɪnəks/ lin-uks or, less frequently, /ˈlaɪnəks/ lyn-uks) is a Unix-like and mostly POSIX-compliant computer |
||||
operating system assembled under the model of free and open-source software development and distribution. The defining component of |
||||
Linux is the Linux kernel, an operating system kernel first released on 5 October 1991 by Linus Torvalds. The Free Software Foundation |
||||
uses the name GNU/Linux to describe the operating system, which has led to some controversy. |
||||
</p> |
||||
|
||||
<pre><code> |
||||
here be code. Linux Unix system. Not highlighted. |
||||
</code></pre> |
||||
|
||||
<p> |
||||
Linux was originally developed as a free operating system for Intel x86–based personal computers, but has since been ported to more |
||||
computer hardware platforms than any other operating system. It is the leading operating system on servers and other big iron systems |
||||
such as mainframe computers and supercomputers, but is used on only around 1.5% of desktop computers. Linux also runs on embedded |
||||
systems, which are devices whose operating system is typically built into the firmware and is highly tailored to the system; this |
||||
includes mobile phones, tablet computers, network routers, facility automation controls, televisions and video game consoles. Android, |
||||
the most widely used operating system for tablets and smartphones, is built on top of the Linux kernel. |
||||
</p> |
||||
|
||||
<p> |
||||
The development of Linux is one of the most prominent examples of free and open-source software collaboration. The underlying source |
||||
code may be used, modified, and distributed—commercially or non-commercially—by anyone under licenses such as the GNU General Public |
||||
License. Typically, Linux is packaged in a form known as a Linux distribution, for both desktop and server use. Some popular mainstream |
||||
Linux distributions include Debian, Ubuntu, Linux Mint, Fedora, openSUSE, Arch Linux, and the commercial Red Hat Enterprise Linux and |
||||
SUSE Linux Enterprise Server. Linux distributions include the Linux kernel, supporting utilities and libraries and usually a large |
||||
amount of application software to fulfill the distribution's intended use. |
||||
</p> |
||||
|
||||
<p> |
||||
A distribution oriented toward desktop use will typically include X11, Wayland or Mir as the windowing system, and an accompanying |
||||
desktop environment such as GNOME or the KDE Software Compilation. Some such distributions may include a less resource intensive |
||||
desktop such as LXDE or Xfce, for use on older or less powerful computers. A distribution intended to run as a server may omit all |
||||
graphical environments from the standard install, and instead include other software to set up and operate a solution stack such as |
||||
LAMP. Because Linux is freely redistributable, anyone may create a distribution for any intended use. |
||||
</p> |
||||
</body> |
||||
</html> |
Loading…
Reference in new issue