1 2/** 3 * Highlights words based on morphological data 4 * 5 * @author John Dyer (http://j.hn/) 6 */ 7 8docs.plugins.push({ 9 10 init: function(docManager) { 11 12 13 14 docManager.addStyle('\ 15.hebrew-vowel {\ 16 color: #ff0000;\ 17}\ 18.hebrew-accent-major {\ 19 color: #00ff00;\ 20}\ 21.hebrew-accent-minor {\ 22 color: #0000ff;\ 23}\ 24.hebrew-layers {\ 25 display: inline-block;\ 26 position: relative;\ 27}\ 28.hebrew-layers .hebrew-layers-original {\ 29 color: transparent;\ 30}\ 31.hebrew-layers .hebrew-layers-vowels {\ 32 position: absolute;\ 33 top: 0;\ 34 right: 0;\ 35 color: #ff0000;\ 36}\ 37.hebrew-layers .hebrew-layers-accents {\ 38 position: absolute;\ 39 top: 0;\ 40 right: 0;\ 41 color: #00ff00;\ 42}\ 43.hebrew-layers .hebrew-layers-consonants {\ 44 position: absolute;\ 45 top: 0;\ 46 right: 0;\ 47 color: #000000;\ 48}\ 49.hebrew-accent-minor {\ 50 color: #0000ff;\ 51}'); 52 53 54 55 function runTransforms(node) { 56 node.find('span.w').each(function() { 57 58 var span = $(this), 59 html = span.html(); 60 61 // color it! 62 span 63 .html ( 64 hebrewTools.colorizeLayers( html ) 65 ); 66 67 }); 68 69 } 70 71 72 // run transforms 73 docManager.addEventListener('load', function(e) { 74 if (e.chapter.attr('lang') == 'heb') { 75 runTransforms(e.chapter); 76 } 77 }); 78 79 } 80}); 81 82 83var hebrewTools = { 84 vowels: [ 85 {name:'Sheva',value:'\u05B0'}, 86 {name:'Hatef Segol',value:'\u05B1'}, 87 {name:'Hatef Patah',value:'\u05B2'}, 88 {name:'Hatef Qamats',value:'\u05B3'}, 89 {name:'Hiriq',value:'\u05B4'}, 90 {name:'Tsere',value:'\u05B5'}, 91 {name:'Segol',value:'\u05B6'}, 92 {name:'Patah',value:'\u05B7'}, 93 {name:'Qamats',value:'\u05B8'}, 94 {name:'Holam',value:'\u05B9'}, 95 /*{name:'Qubuts',value:'\u05BA'},*/ 96 {name:'Qubuts',value:'\u05BB'}, 97 {name:'Dagesh, Mapiq, Shuruq',value:'\u05BC'}, 98 {name:'Meteg',value:'\u05BD'}, 99 /*{name:'Meteg',value:'\u05BE'},*/ 100 {name:'Rafe',value:'\u05BF'}, 101 {name:'Shin Dot',value:'\u05C1'}, 102 {name:'Sin Dot',value:'\u05C2'}, 103 {name:'Mark Upper Dot',value:'\u05C4'} 104 ], 105 106 major_accents: [ 107 {name:'Etnahta',value:'\u0591'}, 108 {name:'Segol',value:'\u0592'}, 109 {name:'Shalshelet',value:'\u0593'}, 110 {name:'Zaqef Qatan',value:'\u0594'}, 111 {name:'Gadol',value:'\u0595'}, 112 {name:'Tipeha',value:'\u0596'}, 113 {name:'Revia',value:'\u0597'}, 114 {name:'Zarqa',value:'\u0598'}, 115 {name:'Pashta',value:'\u0599'} 116 ], 117 118 /* minor */ 119 minor_accents: [ 120 {name:'Yetiv',value:'\u059A'}, 121 {name:'Tevir',value:'\u059B'}, 122 {name:'Geresh',value:'\u059C'}, 123 {name:'Geresh Muqdam',value:'\u059D'}, 124 {name:'Gershayim',value:'\u059E'}, 125 {name:'Qarney Para',value:'\u059F'}, 126 {name:'Telisha Gedola',value:'\u05A0'}, 127 {name:'Pazer',value:'\u05A1'}, 128 {name:'?',value:'\u05A2'}, 129 {name:'Munah',value:'\u05A3'}, 130 {name:'Mahapakh',value:'\u05A4'}, 131 {name:'Merkha',value:'\u05A5'}, 132 {name:'Merkha Kefula',value:'\u05A6'}, 133 {name:'Darga',value:'\u05A7'}, 134 {name:'Qadma',value:'\u05A8'}, 135 {name:'Telisha Qetana',value:'\u05A9'}, 136 {name:'Yerah Ben Yomo',value:'\u05AA'}, 137 {name:'Ole',value:'\u05AB'}, 138 {name:'Iluy',value:'\u05AC'}, 139 {name:'Dehi',value:'\u05AD'}, 140 {name:'Zinor',value:'\u05AE'}, 141 {name:'Masora Circle',value:'\u05AF'} 142 ], 143 144 removeVowels: function(input) { 145 var output = ''; 146 147 // process the text 148 for (var i=0; i<input.length; i++) { 149 var letter = input[i], 150 skip = false; 151 152 for (var j=0; j<this.vowels.length; j++) { 153 var vowel = this.vowels[j]; 154 if (letter == vowel.value) { 155 skip = true; 156 break; 157 } 158 } 159 160 if (!skip) { 161 output += letter; 162 } 163 164 } 165 166 return output; 167 168 }, 169 170 removeAccents: function(input) { 171 var output = ''; 172 173 // process the text 174 for (var i=0; i<input.length; i++) { 175 var letter = input[i], 176 skip = false; 177 178 179 // major 180 for (var j=0; j<this.major_accents.length; j++) { 181 var accent = this.major_accents[j]; 182 if (letter == accent.value) { 183 skip = true; 184 break; 185 } 186 } 187 188 if (!skip) { 189 // minor 190 for (var j=0; j<this.minor_accents.length; j++) { 191 var accent = this.minor_accents[j]; 192 if (letter == accent.value) { 193 skip = true; 194 break; 195 } 196 } 197 } 198 199 if (!skip) { 200 output += letter; 201 } 202 203 } 204 205 return output; 206 }, 207 208 onlyConsonants: function(input) { 209 var output = ''; 210 211 // process the text 212 for (var i=0; i<input.length; i++) {
213 var letter = input[i], 214 skip = false; 215 216 217 // major 218 for (var j=0; j<this.major_accents.length; j++) { 219 var accent = this.major_accents[j]; 220 if (letter == accent.value) { 221 skip = true; 222 break; 223 } 224 } 225 226 // check vowels 227 if (!skip) { 228 for (var j=0; j<this.vowels.length; j++) { 229 var vowel = this.vowels[j]; 230 if (letter == vowel.value) { 231 skip = true; 232 break; 233 } 234 } 235 } 236 237 if (!skip) { 238 // minor 239 for (var j=0; j<this.minor_accents.length; j++) { 240 var accent = this.minor_accents[j]; 241 if (letter == accent.value) { 242 skip = true; 243 break; 244 } 245 } 246 } 247 248 if (!skip) { 249 output += letter; 250 } 251 252 } 253 254 return output; 255 }, 256 257 colorizeLayers: function(input) { 258 var output = 259 '<span class="hebrew-layers">' + 260 '<span class="hebrew-layers-original">' + input + '</span>' + 261 '<span class="hebrew-layers-accents">' + this.removeVowels(input) + '</span>' + 262 '<span class="hebrew-layers-vowels">' + this.removeAccents(input) + '</span>' + 263 '<span class="hebrew-layers-consonants">' + this.onlyConsonants(input) + '</span>' + 264 '</span>'; 265 266 return output; 267 }, 268 269 colorizeInline: function(input) { 270 271 var output = ''; 272 273 // process the text 274 for (var i=0; i<input.length; i++) { 275 var letter = input[i], 276 marked = false; 277 278 // check vowels 279 for (var j=0; j<this.vowels.length; j++) { 280 var vowel = this.vowels[j]; 281 if (letter == vowel.value) { 282 letter = '<span class="hebrew-vowel">' + letter + '</span>'; 283 marked = true; 284 break; 285 } 286 } 287 288 if (!marked) { 289 // minor 290 for (var j=0; j<this.minor_accents.length; j++) { 291 var accent = this.minor_accents[j]; 292 if (letter == accent.value) { 293 letter = '<span class="hebrew-accent-minor">' + letter + '</span>'; 294 marked = true; 295 break; 296 } 297 } 298 } 299 300 if (!marked) { 301 302 // major 303 for (var j=0; j<this.major_accents.length; j++) { 304 var accent = this.major_accents[j]; 305 if (letter == accent.value) { 306 letter = '<span class="hebrew-accent-major">' + letter + '</span>'; 307 marked = true; 308 break; 309 } 310 } 311 } 312 313 output += letter; 314 } 315 316 return output; 317 } 318};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.