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