PageSourceSearch

https://biblewebapp.com/study-v2/js/docs/plugins.hebrewpointing.js

js biblewebapp.com collected 2026-09-24 19:09:44 UTC 6,888 bytes, 318 lines download raw bytes

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.