jbarnette-johnson 1.0.0.20090326122910 → 1.0.0.20090326154650

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,1564 +0,0 @@
1
- // =========================================================================
2
- //
3
- // xmlsax.js - an XML SAX parser in JavaScript.
4
- //
5
- // version 3.1
6
- //
7
- // =========================================================================
8
- //
9
- // Copyright (C) 2001 - 2002 David Joham (djoham@yahoo.com) and Scott Severtson
10
- //
11
- // This library is free software; you can redistribute it and/or
12
- // modify it under the terms of the GNU Lesser General Public
13
- // License as published by the Free Software Foundation; either
14
- // version 2.1 of the License, or (at your option) any later version.
15
-
16
- // This library is distributed in the hope that it will be useful,
17
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19
- // Lesser General Public License for more details.
20
-
21
- // You should have received a copy of the GNU Lesser General Public
22
- // License along with this library; if not, write to the Free Software
23
- // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24
- //
25
- //
26
- // Visit the XML for <SCRIPT> home page at http://xmljs.sourceforge.net
27
- //
28
-
29
- // CONSTANTS
30
-
31
- // =========================================================================
32
- // =========================================================================
33
- // =========================================================================
34
- var whitespace = "\n\r\t ";
35
-
36
-
37
- /***************************************************************************************************************
38
- XMLP is a pull-based parser. The calling application passes in a XML string
39
- to the constructor, then repeatedly calls .next() to parse the next segment.
40
- .next() returns a flag indicating what type of segment was found, and stores
41
- data temporarily in couple member variables (name, content, array of
42
- attributes), which can be accessed by several .get____() methods.
43
-
44
- Basically, XMLP is the lowest common denominator parser - an very simple
45
- API which other wrappers can be built against.
46
- *****************************************************************************************************************/
47
-
48
-
49
- XMLP = function(strXML) {
50
- /*******************************************************************************************************************
51
- function: this is the constructor to the XMLP Object
52
-
53
- Author: Scott Severtson
54
-
55
- Description:
56
- Instantiates and initializes the object
57
- *********************************************************************************************************************/
58
- // Normalize line breaks
59
- strXML = SAXStrings.replace(strXML, null, null, "\r\n", "\n");
60
- strXML = SAXStrings.replace(strXML, null, null, "\r", "\n");
61
-
62
- this.m_xml = strXML;
63
- this.m_iP = 0;
64
- this.m_iState = XMLP._STATE_PROLOG;
65
- this.m_stack = new Stack();
66
- this._clearAttributes();
67
-
68
- } // end XMLP constructor
69
-
70
-
71
- // CONSTANTS (these must be below the constructor)
72
-
73
- // =========================================================================
74
- // =========================================================================
75
- // =========================================================================
76
-
77
- XMLP._NONE = 0;
78
- XMLP._ELM_B = 1;
79
- XMLP._ELM_E = 2;
80
- XMLP._ELM_EMP = 3;
81
- XMLP._ATT = 4;
82
- XMLP._TEXT = 5;
83
- XMLP._ENTITY = 6;
84
- XMLP._PI = 7;
85
- XMLP._CDATA = 8;
86
- XMLP._COMMENT = 9;
87
- XMLP._DTD = 10;
88
- XMLP._ERROR = 11;
89
-
90
- XMLP._CONT_XML = 0;
91
- XMLP._CONT_ALT = 1;
92
-
93
- XMLP._ATT_NAME = 0;
94
- XMLP._ATT_VAL = 1;
95
-
96
- XMLP._STATE_PROLOG = 1;
97
- XMLP._STATE_DOCUMENT = 2;
98
- XMLP._STATE_MISC = 3;
99
-
100
- XMLP._errs = new Array();
101
- XMLP._errs[XMLP.ERR_CLOSE_PI = 0 ] = "PI: missing closing sequence";
102
- XMLP._errs[XMLP.ERR_CLOSE_DTD = 1 ] = "DTD: missing closing sequence";
103
- XMLP._errs[XMLP.ERR_CLOSE_COMMENT = 2 ] = "Comment: missing closing sequence";
104
- XMLP._errs[XMLP.ERR_CLOSE_CDATA = 3 ] = "CDATA: missing closing sequence";
105
- XMLP._errs[XMLP.ERR_CLOSE_ELM = 4 ] = "Element: missing closing sequence";
106
- XMLP._errs[XMLP.ERR_CLOSE_ENTITY = 5 ] = "Entity: missing closing sequence";
107
- XMLP._errs[XMLP.ERR_PI_TARGET = 6 ] = "PI: target is required";
108
- XMLP._errs[XMLP.ERR_ELM_EMPTY = 7 ] = "Element: cannot be both empty and closing";
109
- XMLP._errs[XMLP.ERR_ELM_NAME = 8 ] = "Element: name must immediatly follow \"<\"";
110
- XMLP._errs[XMLP.ERR_ELM_LT_NAME = 9 ] = "Element: \"<\" not allowed in element names";
111
- XMLP._errs[XMLP.ERR_ATT_VALUES = 10] = "Attribute: values are required and must be in quotes";
112
- XMLP._errs[XMLP.ERR_ATT_LT_NAME = 11] = "Element: \"<\" not allowed in attribute names";
113
- XMLP._errs[XMLP.ERR_ATT_LT_VALUE = 12] = "Attribute: \"<\" not allowed in attribute values";
114
- XMLP._errs[XMLP.ERR_ATT_DUP = 13] = "Attribute: duplicate attributes not allowed";
115
- XMLP._errs[XMLP.ERR_ENTITY_UNKNOWN = 14] = "Entity: unknown entity";
116
- XMLP._errs[XMLP.ERR_INFINITELOOP = 15] = "Infininte loop";
117
- XMLP._errs[XMLP.ERR_DOC_STRUCTURE = 16] = "Document: only comments, processing instructions, or whitespace allowed outside of document element";
118
- XMLP._errs[XMLP.ERR_ELM_NESTING = 17] = "Element: must be nested correctly";
119
-
120
- // =========================================================================
121
- // =========================================================================
122
- // =========================================================================
123
-
124
-
125
- XMLP.prototype._addAttribute = function(name, value) {
126
- /*******************************************************************************************************************
127
- function: _addAttribute
128
-
129
- Author: Scott Severtson
130
- *********************************************************************************************************************/
131
- this.m_atts[this.m_atts.length] = new Array(name, value);
132
- } // end function _addAttribute
133
-
134
-
135
- XMLP.prototype._checkStructure = function(iEvent) {
136
- /*******************************************************************************************************************
137
- function: _checkStructure
138
-
139
- Author: Scott Severtson
140
- *********************************************************************************************************************/
141
-
142
- if(XMLP._STATE_PROLOG == this.m_iState) {
143
- if((XMLP._TEXT == iEvent) || (XMLP._ENTITY == iEvent)) {
144
- if(SAXStrings.indexOfNonWhitespace(this.getContent(), this.getContentBegin(), this.getContentEnd()) != -1) {
145
- return this._setErr(XMLP.ERR_DOC_STRUCTURE);
146
- }
147
- }
148
-
149
- if((XMLP._ELM_B == iEvent) || (XMLP._ELM_EMP == iEvent)) {
150
- this.m_iState = XMLP._STATE_DOCUMENT;
151
- // Don't return - fall through to next state
152
- }
153
- }
154
- if(XMLP._STATE_DOCUMENT == this.m_iState) {
155
- if((XMLP._ELM_B == iEvent) || (XMLP._ELM_EMP == iEvent)) {
156
- this.m_stack.push(this.getName());
157
- }
158
-
159
- if((XMLP._ELM_E == iEvent) || (XMLP._ELM_EMP == iEvent)) {
160
- var strTop = this.m_stack.pop();
161
- if((strTop == null) || (strTop != this.getName())) {
162
- return this._setErr(XMLP.ERR_ELM_NESTING);
163
- }
164
- }
165
-
166
- if(this.m_stack.count() == 0) {
167
- this.m_iState = XMLP._STATE_MISC;
168
- return iEvent;
169
- }
170
- }
171
- if(XMLP._STATE_MISC == this.m_iState) {
172
- if((XMLP._ELM_B == iEvent) || (XMLP._ELM_E == iEvent) || (XMLP._ELM_EMP == iEvent) || (XMLP.EVT_DTD == iEvent)) {
173
- return this._setErr(XMLP.ERR_DOC_STRUCTURE);
174
- }
175
-
176
- if((XMLP._TEXT == iEvent) || (XMLP._ENTITY == iEvent)) {
177
- if(SAXStrings.indexOfNonWhitespace(this.getContent(), this.getContentBegin(), this.getContentEnd()) != -1) {
178
- return this._setErr(XMLP.ERR_DOC_STRUCTURE);
179
- }
180
- }
181
- }
182
-
183
- return iEvent;
184
-
185
- } // end function _checkStructure
186
-
187
-
188
- XMLP.prototype._clearAttributes = function() {
189
- /*******************************************************************************************************************
190
- function: _clearAttributes
191
-
192
- Author: Scott Severtson
193
- *********************************************************************************************************************/
194
- this.m_atts = new Array();
195
- } // end function _clearAttributes
196
-
197
-
198
- XMLP.prototype._findAttributeIndex = function(name) {
199
- /*******************************************************************************************************************
200
- function: findAttributeIndex
201
-
202
- Author: Scott Severtson
203
- *********************************************************************************************************************/
204
- for(var i = 0; i < this.m_atts.length; i++) {
205
- if(this.m_atts[i][XMLP._ATT_NAME] == name) {
206
- return i;
207
- }
208
- }
209
- return -1;
210
-
211
- } // end function _findAttributeIndex
212
-
213
-
214
- XMLP.prototype.getAttributeCount = function() {
215
- /*******************************************************************************************************************
216
- function: getAttributeCount
217
-
218
- Author: Scott Severtson
219
- *********************************************************************************************************************/
220
-
221
- return this.m_atts ? this.m_atts.length : 0;
222
-
223
- } // end function getAttributeCount()
224
-
225
-
226
- XMLP.prototype.getAttributeName = function(index) {
227
- /*******************************************************************************************************************
228
- function: getAttributeName
229
-
230
- Author: Scott Severtson
231
- *********************************************************************************************************************/
232
-
233
- return ((index < 0) || (index >= this.m_atts.length)) ? null : this.m_atts[index][XMLP._ATT_NAME];
234
-
235
- } //end function getAttributeName
236
-
237
-
238
- XMLP.prototype.getAttributeValue = function(index) {
239
- /*******************************************************************************************************************
240
- function: getAttributeValue
241
-
242
- Author: Scott Severtson
243
- *********************************************************************************************************************/
244
-
245
- return ((index < 0) || (index >= this.m_atts.length)) ? null : __unescapeString(this.m_atts[index][XMLP._ATT_VAL]);
246
-
247
- } // end function getAttributeValue
248
-
249
-
250
- XMLP.prototype.getAttributeValueByName = function(name) {
251
- /*******************************************************************************************************************
252
- function: getAttributeValueByName
253
-
254
- Author: Scott Severtson
255
- *********************************************************************************************************************/
256
-
257
- return this.getAttributeValue(this._findAttributeIndex(name));
258
-
259
- } // end function getAttributeValueByName
260
-
261
-
262
- XMLP.prototype.getColumnNumber = function() {
263
- /*******************************************************************************************************************
264
- function: getColumnNumber
265
-
266
- Author: Scott Severtson
267
- *********************************************************************************************************************/
268
-
269
- return SAXStrings.getColumnNumber(this.m_xml, this.m_iP);
270
-
271
- } // end function getColumnNumber
272
-
273
-
274
- XMLP.prototype.getContent = function() {
275
- /*******************************************************************************************************************
276
- function: getContent
277
-
278
- Author: Scott Severtson
279
- *********************************************************************************************************************/
280
-
281
- return (this.m_cSrc == XMLP._CONT_XML) ? this.m_xml : this.m_cAlt;
282
-
283
- } //end function getContent
284
-
285
-
286
- XMLP.prototype.getContentBegin = function() {
287
- /*******************************************************************************************************************
288
- function: getContentBegin
289
-
290
- Author: Scott Severtson
291
- *********************************************************************************************************************/
292
-
293
- return this.m_cB;
294
-
295
- } //end function getContentBegin
296
-
297
-
298
- XMLP.prototype.getContentEnd = function() {
299
- /*******************************************************************************************************************
300
- function: getContentEnd
301
-
302
- Author: Scott Severtson
303
- *********************************************************************************************************************/
304
-
305
- return this.m_cE;
306
-
307
- } // end function getContentEnd
308
-
309
-
310
- XMLP.prototype.getLineNumber = function() {
311
- /*******************************************************************************************************************
312
- function: getLineNumber
313
-
314
- Author: Scott Severtson
315
- *********************************************************************************************************************/
316
-
317
- return SAXStrings.getLineNumber(this.m_xml, this.m_iP);
318
-
319
- } // end function getLineNumber
320
-
321
-
322
- XMLP.prototype.getName = function() {
323
- /*******************************************************************************************************************
324
- function: getName
325
-
326
- Author: Scott Severtson
327
- *********************************************************************************************************************/
328
-
329
- return this.m_name;
330
-
331
- } // end function getName()
332
-
333
-
334
- XMLP.prototype.next = function() {
335
- /*******************************************************************************************************************
336
- function: next
337
-
338
- Author: Scott Severtson
339
- *********************************************************************************************************************/
340
-
341
- return this._checkStructure(this._parse());
342
-
343
- } // end function next()
344
-
345
-
346
- XMLP.prototype._parse = function() {
347
- /*******************************************************************************************************************
348
- function: _parse
349
-
350
- Author: Scott Severtson
351
- *********************************************************************************************************************/
352
-
353
- if(this.m_iP == this.m_xml.length) {
354
- return XMLP._NONE;
355
- }
356
-
357
- if(this.m_iP == this.m_xml.indexOf("<?", this.m_iP)) {
358
- return this._parsePI (this.m_iP + 2);
359
- }
360
- else if(this.m_iP == this.m_xml.indexOf("<!DOCTYPE", this.m_iP)) {
361
- return this._parseDTD (this.m_iP + 9);
362
- }
363
- else if(this.m_iP == this.m_xml.indexOf("<!--", this.m_iP)) {
364
- return this._parseComment(this.m_iP + 4);
365
- }
366
- else if(this.m_iP == this.m_xml.indexOf("<![CDATA[", this.m_iP)) {
367
- return this._parseCDATA (this.m_iP + 9);
368
- }
369
- else if(this.m_iP == this.m_xml.indexOf("<", this.m_iP)) {
370
- return this._parseElement(this.m_iP + 1);
371
- }
372
- else if(this.m_iP == this.m_xml.indexOf("&", this.m_iP)) {
373
- return this._parseEntity (this.m_iP + 1);
374
- }
375
- else{
376
- return this._parseText (this.m_iP);
377
- }
378
-
379
-
380
- } // end function _parse
381
-
382
-
383
- XMLP.prototype._parseAttribute = function(iB, iE) {
384
- /*******************************************************************************************************************
385
- function: _parseAttribute
386
-
387
- Author: Scott Severtson
388
- *********************************************************************************************************************/
389
- var iNB, iNE, iEq, iVB, iVE;
390
- var cQuote, strN, strV;
391
-
392
- this.m_cAlt = ""; //resets the value so we don't use an old one by accident (see testAttribute7 in the test suite)
393
-
394
- iNB = SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iE);
395
- if((iNB == -1) ||(iNB >= iE)) {
396
- return iNB;
397
- }
398
-
399
- iEq = this.m_xml.indexOf("=", iNB);
400
- if((iEq == -1) || (iEq > iE)) {
401
- return this._setErr(XMLP.ERR_ATT_VALUES);
402
- }
403
-
404
- iNE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iNB, iEq);
405
-
406
- iVB = SAXStrings.indexOfNonWhitespace(this.m_xml, iEq + 1, iE);
407
- if((iVB == -1) ||(iVB > iE)) {
408
- return this._setErr(XMLP.ERR_ATT_VALUES);
409
- }
410
-
411
- cQuote = this.m_xml.charAt(iVB);
412
- if(SAXStrings.QUOTES.indexOf(cQuote) == -1) {
413
- return this._setErr(XMLP.ERR_ATT_VALUES);
414
- }
415
-
416
- iVE = this.m_xml.indexOf(cQuote, iVB + 1);
417
- if((iVE == -1) ||(iVE > iE)) {
418
- return this._setErr(XMLP.ERR_ATT_VALUES);
419
- }
420
-
421
- strN = this.m_xml.substring(iNB, iNE + 1);
422
- strV = this.m_xml.substring(iVB + 1, iVE);
423
-
424
- if(strN.indexOf("<") != -1) {
425
- return this._setErr(XMLP.ERR_ATT_LT_NAME);
426
- }
427
-
428
- if(strV.indexOf("<") != -1) {
429
- return this._setErr(XMLP.ERR_ATT_LT_VALUE);
430
- }
431
-
432
- strV = SAXStrings.replace(strV, null, null, "\n", " ");
433
- strV = SAXStrings.replace(strV, null, null, "\t", " ");
434
- iRet = this._replaceEntities(strV);
435
- if(iRet == XMLP._ERROR) {
436
- return iRet;
437
- }
438
-
439
- strV = this.m_cAlt;
440
-
441
- if(this._findAttributeIndex(strN) == -1) {
442
- this._addAttribute(strN, strV);
443
- }
444
- else {
445
- return this._setErr(XMLP.ERR_ATT_DUP);
446
- }
447
-
448
- this.m_iP = iVE + 2;
449
-
450
- return XMLP._ATT;
451
-
452
- } // end function _parseAttribute
453
-
454
-
455
- XMLP.prototype._parseCDATA = function(iB) {
456
- /*******************************************************************************************************************
457
- function: _parseCDATA
458
-
459
- Author: Scott Severtson
460
- *********************************************************************************************************************/
461
- var iE = this.m_xml.indexOf("]]>", iB);
462
- if (iE == -1) {
463
- return this._setErr(XMLP.ERR_CLOSE_CDATA);
464
- }
465
-
466
- this._setContent(XMLP._CONT_XML, iB, iE);
467
-
468
- this.m_iP = iE + 3;
469
-
470
- return XMLP._CDATA;
471
-
472
- } // end function _parseCDATA
473
-
474
-
475
- XMLP.prototype._parseComment = function(iB) {
476
- /*******************************************************************************************************************
477
- function: _parseComment
478
-
479
- Author: Scott Severtson
480
- *********************************************************************************************************************/
481
- var iE = this.m_xml.indexOf("-" + "->", iB);
482
- if (iE == -1) {
483
- return this._setErr(XMLP.ERR_CLOSE_COMMENT);
484
- }
485
-
486
- this._setContent(XMLP._CONT_XML, iB, iE);
487
-
488
- this.m_iP = iE + 3;
489
-
490
- return XMLP._COMMENT;
491
-
492
- } // end function _parseComment
493
-
494
-
495
- XMLP.prototype._parseDTD = function(iB) {
496
- /*******************************************************************************************************************
497
- function: _parseDTD
498
-
499
- Author: Scott Severtson
500
- *********************************************************************************************************************/
501
-
502
- // Eat DTD
503
-
504
- var iE, strClose, iInt, iLast;
505
-
506
- iE = this.m_xml.indexOf(">", iB);
507
- if(iE == -1) {
508
- return this._setErr(XMLP.ERR_CLOSE_DTD);
509
- }
510
-
511
- iInt = this.m_xml.indexOf("[", iB);
512
- strClose = ((iInt != -1) && (iInt < iE)) ? "]>" : ">";
513
-
514
- while(true) {
515
- // DEBUG: Remove
516
- if(iE == iLast) {
517
- return this._setErr(XMLP.ERR_INFINITELOOP);
518
- }
519
-
520
- iLast = iE;
521
- // DEBUG: Remove End
522
-
523
- iE = this.m_xml.indexOf(strClose, iB);
524
- if(iE == -1) {
525
- return this._setErr(XMLP.ERR_CLOSE_DTD);
526
- }
527
-
528
- // Make sure it is not the end of a CDATA section
529
- if (this.m_xml.substring(iE - 1, iE + 2) != "]]>") {
530
- break;
531
- }
532
- }
533
-
534
- this.m_iP = iE + strClose.length;
535
-
536
- return XMLP._DTD;
537
-
538
- } // end function _parseDTD
539
-
540
-
541
- XMLP.prototype._parseElement = function(iB) {
542
- /*******************************************************************************************************************
543
- function: _parseElement
544
-
545
- Author: Scott Severtson
546
- *********************************************************************************************************************/
547
- var iE, iDE, iNE, iRet;
548
- var iType, strN, iLast;
549
-
550
- iDE = iE = this.m_xml.indexOf(">", iB);
551
- if(iE == -1) {
552
- return this._setErr(XMLP.ERR_CLOSE_ELM);
553
- }
554
-
555
- if(this.m_xml.charAt(iB) == "/") {
556
- iType = XMLP._ELM_E;
557
- iB++;
558
- } else {
559
- iType = XMLP._ELM_B;
560
- }
561
-
562
- if(this.m_xml.charAt(iE - 1) == "/") {
563
- if(iType == XMLP._ELM_E) {
564
- return this._setErr(XMLP.ERR_ELM_EMPTY);
565
- }
566
- iType = XMLP._ELM_EMP;
567
- iDE--;
568
- }
569
-
570
- iDE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iB, iDE);
571
-
572
- //djohack
573
- //hack to allow for elements with single character names to be recognized
574
-
575
- if (iE - iB != 1 ) {
576
- if(SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iDE) != iB) {
577
- return this._setErr(XMLP.ERR_ELM_NAME);
578
- }
579
- }
580
- // end hack -- original code below
581
-
582
- /*
583
- if(SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iDE) != iB)
584
- return this._setErr(XMLP.ERR_ELM_NAME);
585
- */
586
- this._clearAttributes();
587
-
588
- iNE = SAXStrings.indexOfWhitespace(this.m_xml, iB, iDE);
589
- if(iNE == -1) {
590
- iNE = iDE + 1;
591
- }
592
- else {
593
- this.m_iP = iNE;
594
- while(this.m_iP < iDE) {
595
- // DEBUG: Remove
596
- if(this.m_iP == iLast) return this._setErr(XMLP.ERR_INFINITELOOP);
597
- iLast = this.m_iP;
598
- // DEBUG: Remove End
599
-
600
-
601
- iRet = this._parseAttribute(this.m_iP, iDE);
602
- if(iRet == XMLP._ERROR) return iRet;
603
- }
604
- }
605
-
606
- strN = this.m_xml.substring(iB, iNE);
607
-
608
- if(strN.indexOf("<") != -1) {
609
- return this._setErr(XMLP.ERR_ELM_LT_NAME);
610
- }
611
-
612
- this.m_name = strN;
613
- this.m_iP = iE + 1;
614
-
615
- return iType;
616
-
617
- } // end function _parseElement
618
-
619
-
620
- XMLP.prototype._parseEntity = function(iB) {
621
- /*******************************************************************************************************************
622
- function: _parseEntity
623
-
624
- Author: Scott Severtson
625
- *********************************************************************************************************************/
626
- var iE = this.m_xml.indexOf(";", iB);
627
- if(iE == -1) {
628
- return this._setErr(XMLP.ERR_CLOSE_ENTITY);
629
- }
630
-
631
- this.m_iP = iE + 1;
632
-
633
- return this._replaceEntity(this.m_xml, iB, iE);
634
-
635
- } // end function _parseEntity
636
-
637
-
638
- XMLP.prototype._parsePI = function(iB) {
639
- /*******************************************************************************************************************
640
- function: _parsePI
641
-
642
- Author: Scott Severtson
643
- *********************************************************************************************************************/
644
-
645
- var iE, iTB, iTE, iCB, iCE;
646
-
647
- iE = this.m_xml.indexOf("?>", iB);
648
- if(iE == -1) {
649
- return this._setErr(XMLP.ERR_CLOSE_PI);
650
- }
651
-
652
- iTB = SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iE);
653
- if(iTB == -1) {
654
- return this._setErr(XMLP.ERR_PI_TARGET);
655
- }
656
-
657
- iTE = SAXStrings.indexOfWhitespace(this.m_xml, iTB, iE);
658
- if(iTE == -1) {
659
- iTE = iE;
660
- }
661
-
662
- iCB = SAXStrings.indexOfNonWhitespace(this.m_xml, iTE, iE);
663
- if(iCB == -1) {
664
- iCB = iE;
665
- }
666
-
667
- iCE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iCB, iE);
668
- if(iCE == -1) {
669
- iCE = iE - 1;
670
- }
671
-
672
- this.m_name = this.m_xml.substring(iTB, iTE);
673
- this._setContent(XMLP._CONT_XML, iCB, iCE + 1);
674
- this.m_iP = iE + 2;
675
-
676
- return XMLP._PI;
677
-
678
- } // end function _parsePI
679
-
680
-
681
- XMLP.prototype._parseText = function(iB) {
682
- /*******************************************************************************************************************
683
- function: _parseText
684
-
685
- Author: Scott Severtson
686
- *********************************************************************************************************************/
687
- var iE, iEE;
688
-
689
- iE = this.m_xml.indexOf("<", iB);
690
- if(iE == -1) {
691
- iE = this.m_xml.length;
692
- }
693
-
694
- iEE = this.m_xml.indexOf("&", iB);
695
- if((iEE != -1) && (iEE <= iE)) {
696
- iE = iEE;
697
- }
698
-
699
- this._setContent(XMLP._CONT_XML, iB, iE);
700
-
701
- this.m_iP = iE;
702
-
703
- return XMLP._TEXT;
704
-
705
- } // end function _parseText
706
-
707
-
708
- XMLP.prototype._replaceEntities = function(strD, iB, iE) {
709
- /*******************************************************************************************************************
710
- function: _replaceEntities
711
-
712
- Author: Scott Severtson
713
- *********************************************************************************************************************/
714
- if(SAXStrings.isEmpty(strD)) return "";
715
- iB = iB || 0;
716
- iE = iE || strD.length;
717
-
718
-
719
- var iEB, iEE, strRet = "";
720
-
721
- iEB = strD.indexOf("&", iB);
722
- iEE = iB;
723
-
724
- while((iEB > 0) && (iEB < iE)) {
725
- strRet += strD.substring(iEE, iEB);
726
-
727
- iEE = strD.indexOf(";", iEB) + 1;
728
-
729
- if((iEE == 0) || (iEE > iE)) {
730
- return this._setErr(XMLP.ERR_CLOSE_ENTITY);
731
- }
732
-
733
- iRet = this._replaceEntity(strD, iEB + 1, iEE - 1);
734
- if(iRet == XMLP._ERROR) {
735
- return iRet;
736
- }
737
-
738
- strRet += this.m_cAlt;
739
-
740
- iEB = strD.indexOf("&", iEE);
741
- }
742
-
743
- if(iEE != iE) {
744
- strRet += strD.substring(iEE, iE);
745
- }
746
-
747
- this._setContent(XMLP._CONT_ALT, strRet);
748
-
749
- return XMLP._ENTITY;
750
-
751
- } // end function _replaceEntities
752
-
753
-
754
- XMLP.prototype._replaceEntity = function(strD, iB, iE) {
755
- /*******************************************************************************************************************
756
- function: _replaceEntity
757
-
758
- Author: Scott Severtson
759
- *********************************************************************************************************************/
760
- if(SAXStrings.isEmpty(strD)) return -1;
761
- iB = iB || 0;
762
- iE = iE || strD.length;
763
-
764
- switch(strD.substring(iB, iE)) {
765
- case "amp": strEnt = "&"; break;
766
- case "lt": strEnt = "<"; break;
767
- case "gt": strEnt = ">"; break;
768
- case "apos": strEnt = "'"; break;
769
- case "quot": strEnt = "\""; break;
770
- default:
771
- if(strD.charAt(iB) == "#") {
772
- strEnt = String.fromCharCode(parseInt(strD.substring(iB + 1, iE)));
773
- } else {
774
- return this._setErr(XMLP.ERR_ENTITY_UNKNOWN);
775
- }
776
- break;
777
- }
778
- this._setContent(XMLP._CONT_ALT, strEnt);
779
-
780
- return XMLP._ENTITY;
781
- } // end function _replaceEntity
782
-
783
-
784
- XMLP.prototype._setContent = function(iSrc) {
785
- /*******************************************************************************************************************
786
- function: _setContent
787
-
788
- Author: Scott Severtson
789
- *********************************************************************************************************************/
790
- var args = arguments;
791
-
792
- if(XMLP._CONT_XML == iSrc) {
793
- this.m_cAlt = null;
794
- this.m_cB = args[1];
795
- this.m_cE = args[2];
796
- } else {
797
- this.m_cAlt = args[1];
798
- this.m_cB = 0;
799
- this.m_cE = args[1].length;
800
- }
801
- this.m_cSrc = iSrc;
802
-
803
- } // end function _setContent
804
-
805
-
806
- XMLP.prototype._setErr = function(iErr) {
807
- /*******************************************************************************************************************
808
- function: _setErr
809
-
810
- Author: Scott Severtson
811
- *********************************************************************************************************************/
812
- var strErr = XMLP._errs[iErr];
813
-
814
- this.m_cAlt = strErr;
815
- this.m_cB = 0;
816
- this.m_cE = strErr.length;
817
- this.m_cSrc = XMLP._CONT_ALT;
818
-
819
- return XMLP._ERROR;
820
-
821
- } // end function _setErr
822
-
823
-
824
-
825
-
826
-
827
-
828
- /***************************************************************************************************************
829
- SAXDriver is an object that basically wraps an XMLP instance, and provides an
830
- event-based interface for parsing. This is the object users interact with when coding
831
- with XML for <SCRIPT>
832
- *****************************************************************************************************************/
833
-
834
-
835
- SAXDriver = function() {
836
- /*******************************************************************************************************************
837
- function: SAXDriver
838
-
839
- Author: Scott Severtson
840
-
841
- Description:
842
- This is the constructor for the SAXDriver Object
843
- *********************************************************************************************************************/
844
- this.m_hndDoc = null;
845
- this.m_hndErr = null;
846
- this.m_hndLex = null;
847
- }
848
-
849
-
850
- // CONSTANTS (these must be below the constructor)
851
-
852
- // =========================================================================
853
- // =========================================================================
854
- // =========================================================================
855
- SAXDriver.DOC_B = 1;
856
- SAXDriver.DOC_E = 2;
857
- SAXDriver.ELM_B = 3;
858
- SAXDriver.ELM_E = 4;
859
- SAXDriver.CHARS = 5;
860
- SAXDriver.PI = 6;
861
- SAXDriver.CD_B = 7;
862
- SAXDriver.CD_E = 8;
863
- SAXDriver.CMNT = 9;
864
- SAXDriver.DTD_B = 10;
865
- SAXDriver.DTD_E = 11;
866
- // =========================================================================
867
- // =========================================================================
868
- // =========================================================================
869
-
870
-
871
-
872
- SAXDriver.prototype.parse = function(strD) {
873
- /*******************************************************************************************************************
874
- function: parse
875
-
876
- Author: Scott Severtson
877
- *********************************************************************************************************************/
878
- var parser = new XMLP(strD);
879
-
880
- if(this.m_hndDoc && this.m_hndDoc.setDocumentLocator) {
881
- this.m_hndDoc.setDocumentLocator(this);
882
- }
883
-
884
- this.m_parser = parser;
885
- this.m_bErr = false;
886
-
887
- if(!this.m_bErr) {
888
- this._fireEvent(SAXDriver.DOC_B);
889
- }
890
- this._parseLoop();
891
- if(!this.m_bErr) {
892
- this._fireEvent(SAXDriver.DOC_E);
893
- }
894
-
895
- this.m_xml = null;
896
- this.m_iP = 0;
897
-
898
- } // end function parse
899
-
900
-
901
- SAXDriver.prototype.setDocumentHandler = function(hnd) {
902
- /*******************************************************************************************************************
903
- function: setDocumentHandler
904
-
905
- Author: Scott Severtson
906
- *********************************************************************************************************************/
907
-
908
- this.m_hndDoc = hnd;
909
-
910
- } // end function setDocumentHandler
911
-
912
-
913
- SAXDriver.prototype.setErrorHandler = function(hnd) {
914
- /*******************************************************************************************************************
915
- function: setErrorHandler
916
-
917
- Author: Scott Severtson
918
- *********************************************************************************************************************/
919
-
920
- this.m_hndErr = hnd;
921
-
922
- } // end function setErrorHandler
923
-
924
-
925
- SAXDriver.prototype.setLexicalHandler = function(hnd) {
926
- /*******************************************************************************************************************
927
- function: setLexicalHandler
928
-
929
- Author: Scott Severtson
930
- *********************************************************************************************************************/
931
-
932
- this.m_hndLex = hnd;
933
-
934
- } // end function setLexicalHandler
935
-
936
-
937
- /*******************************************************************************************************************
938
- LOCATOR/PARSE EXCEPTION INTERFACE
939
- *********************************************************************************************************************/
940
-
941
- SAXDriver.prototype.getColumnNumber = function() {
942
- /*******************************************************************************************************************
943
- function: getSystemId
944
-
945
- Author: Scott Severtson
946
- *********************************************************************************************************************/
947
-
948
- return this.m_parser.getColumnNumber();
949
-
950
- } // end function getColumnNumber
951
-
952
-
953
- SAXDriver.prototype.getLineNumber = function() {
954
- /*******************************************************************************************************************
955
- function: getLineNumber
956
-
957
- Author: Scott Severtson
958
- *********************************************************************************************************************/
959
-
960
- return this.m_parser.getLineNumber();
961
-
962
- } // end function getLineNumber
963
-
964
-
965
- SAXDriver.prototype.getMessage = function() {
966
- /*******************************************************************************************************************
967
- function: getMessage
968
-
969
- Author: Scott Severtson
970
- *********************************************************************************************************************/
971
-
972
- return this.m_strErrMsg;
973
-
974
- } // end function getMessage
975
-
976
-
977
- SAXDriver.prototype.getPublicId = function() {
978
- /*******************************************************************************************************************
979
- function: getPublicID
980
-
981
- Author: Scott Severtson
982
- *********************************************************************************************************************/
983
-
984
- return null;
985
-
986
- } // end function getPublicID
987
-
988
-
989
- SAXDriver.prototype.getSystemId = function() {
990
- /*******************************************************************************************************************
991
- function: getSystemId
992
-
993
- Author: Scott Severtson
994
- *********************************************************************************************************************/
995
-
996
- return null;
997
-
998
- } // end function getSystemId
999
-
1000
-
1001
- /*******************************************************************************************************************
1002
- Attribute List Interface
1003
- *********************************************************************************************************************/
1004
-
1005
- SAXDriver.prototype.getLength = function() {
1006
- /*******************************************************************************************************************
1007
- function: getLength
1008
-
1009
- Author: Scott Severtson
1010
- *********************************************************************************************************************/
1011
-
1012
- return this.m_parser.getAttributeCount();
1013
-
1014
- } // end function getAttributeCount
1015
-
1016
-
1017
- SAXDriver.prototype.getName = function(index) {
1018
- /*******************************************************************************************************************
1019
- function: getName
1020
-
1021
- Author: Scott Severtson
1022
- *********************************************************************************************************************/
1023
-
1024
- return this.m_parser.getAttributeName(index);
1025
-
1026
- } // end function getAttributeName
1027
-
1028
-
1029
- SAXDriver.prototype.getValue = function(index) {
1030
- /*******************************************************************************************************************
1031
- function: getValue
1032
-
1033
- Author: Scott Severtson
1034
- *********************************************************************************************************************/
1035
-
1036
- return this.m_parser.getAttributeValue(index);
1037
-
1038
- } // end function getAttributeValue
1039
-
1040
-
1041
- SAXDriver.prototype.getValueByName = function(name) {
1042
- /*******************************************************************************************************************
1043
- function: getValueByName
1044
-
1045
- Author: Scott Severtson
1046
- *********************************************************************************************************************/
1047
-
1048
- return this.m_parser.getAttributeValueByName(name);
1049
-
1050
- } // end function getAttributeValueByName
1051
-
1052
-
1053
- /*******************************************************************************************************************
1054
- Private functions
1055
- *********************************************************************************************************************/
1056
-
1057
- SAXDriver.prototype._fireError = function(strMsg) {
1058
- /*******************************************************************************************************************
1059
- function: _fireError
1060
-
1061
- Author: Scott Severtson
1062
- *********************************************************************************************************************/
1063
- this.m_strErrMsg = strMsg;
1064
- this.m_bErr = true;
1065
-
1066
- if(this.m_hndErr && this.m_hndErr.fatalError) {
1067
- this.m_hndErr.fatalError(this);
1068
- }
1069
-
1070
- } // end function _fireError
1071
-
1072
-
1073
- SAXDriver.prototype._fireEvent = function(iEvt) {
1074
- /*******************************************************************************************************************
1075
- function: _fireEvent
1076
-
1077
- Author: Scott Severtson
1078
- *********************************************************************************************************************/
1079
- var hnd, func, args = arguments, iLen = args.length - 1;
1080
-
1081
- if(this.m_bErr) return;
1082
-
1083
- if(SAXDriver.DOC_B == iEvt) {
1084
- func = "startDocument"; hnd = this.m_hndDoc;
1085
- }
1086
- else if (SAXDriver.DOC_E == iEvt) {
1087
- func = "endDocument"; hnd = this.m_hndDoc;
1088
- }
1089
- else if (SAXDriver.ELM_B == iEvt) {
1090
- func = "startElement"; hnd = this.m_hndDoc;
1091
- }
1092
- else if (SAXDriver.ELM_E == iEvt) {
1093
- func = "endElement"; hnd = this.m_hndDoc;
1094
- }
1095
- else if (SAXDriver.CHARS == iEvt) {
1096
- func = "characters"; hnd = this.m_hndDoc;
1097
- }
1098
- else if (SAXDriver.PI == iEvt) {
1099
- func = "processingInstruction"; hnd = this.m_hndDoc;
1100
- }
1101
- else if (SAXDriver.CD_B == iEvt) {
1102
- func = "startCDATA"; hnd = this.m_hndLex;
1103
- }
1104
- else if (SAXDriver.CD_E == iEvt) {
1105
- func = "endCDATA"; hnd = this.m_hndLex;
1106
- }
1107
- else if (SAXDriver.CMNT == iEvt) {
1108
- func = "comment"; hnd = this.m_hndLex;
1109
- }
1110
-
1111
- if(hnd && hnd[func]) {
1112
- if(0 == iLen) {
1113
- hnd[func]();
1114
- }
1115
- else if (1 == iLen) {
1116
- hnd[func](args[1]);
1117
- }
1118
- else if (2 == iLen) {
1119
- hnd[func](args[1], args[2]);
1120
- }
1121
- else if (3 == iLen) {
1122
- hnd[func](args[1], args[2], args[3]);
1123
- }
1124
- }
1125
-
1126
- } // end function _fireEvent
1127
-
1128
-
1129
- SAXDriver.prototype._parseLoop = function(parser) {
1130
- /*******************************************************************************************************************
1131
- function: _parseLoop
1132
-
1133
- Author: Scott Severtson
1134
- *********************************************************************************************************************/
1135
- var iEvent, parser;
1136
-
1137
- parser = this.m_parser;
1138
- while(!this.m_bErr) {
1139
- iEvent = parser.next();
1140
-
1141
- if(iEvent == XMLP._ELM_B) {
1142
- this._fireEvent(SAXDriver.ELM_B, parser.getName(), this);
1143
- }
1144
- else if(iEvent == XMLP._ELM_E) {
1145
- this._fireEvent(SAXDriver.ELM_E, parser.getName());
1146
- }
1147
- else if(iEvent == XMLP._ELM_EMP) {
1148
- this._fireEvent(SAXDriver.ELM_B, parser.getName(), this);
1149
- this._fireEvent(SAXDriver.ELM_E, parser.getName());
1150
- }
1151
- else if(iEvent == XMLP._TEXT) {
1152
- this._fireEvent(SAXDriver.CHARS, parser.getContent(), parser.getContentBegin(), parser.getContentEnd() - parser.getContentBegin());
1153
- }
1154
- else if(iEvent == XMLP._ENTITY) {
1155
- this._fireEvent(SAXDriver.CHARS, parser.getContent(), parser.getContentBegin(), parser.getContentEnd() - parser.getContentBegin());
1156
- }
1157
- else if(iEvent == XMLP._PI) {
1158
- this._fireEvent(SAXDriver.PI, parser.getName(), parser.getContent().substring(parser.getContentBegin(), parser.getContentEnd()));
1159
- }
1160
- else if(iEvent == XMLP._CDATA) {
1161
- this._fireEvent(SAXDriver.CD_B);
1162
- this._fireEvent(SAXDriver.CHARS, parser.getContent(), parser.getContentBegin(), parser.getContentEnd() - parser.getContentBegin());
1163
- this._fireEvent(SAXDriver.CD_E);
1164
- }
1165
- else if(iEvent == XMLP._COMMENT) {
1166
- this._fireEvent(SAXDriver.CMNT, parser.getContent(), parser.getContentBegin(), parser.getContentEnd() - parser.getContentBegin());
1167
- }
1168
- else if(iEvent == XMLP._DTD) {
1169
- }
1170
- else if(iEvent == XMLP._ERROR) {
1171
- this._fireError(parser.getContent());
1172
- }
1173
- else if(iEvent == XMLP._NONE) {
1174
- return;
1175
- }
1176
- }
1177
-
1178
- } // end function _parseLoop
1179
-
1180
-
1181
-
1182
- /***************************************************************************************************************
1183
- SAXStrings: a useful object containing string manipulation functions
1184
- *****************************************************************************************************************/
1185
-
1186
-
1187
- SAXStrings = function() {
1188
- /*******************************************************************************************************************
1189
- function: SAXStrings
1190
-
1191
- Author: Scott Severtson
1192
-
1193
- Description:
1194
- This is the constructor of the SAXStrings object
1195
- *********************************************************************************************************************/
1196
- } // end function SAXStrings
1197
-
1198
-
1199
- // CONSTANTS (these must be below the constructor)
1200
-
1201
- // =========================================================================
1202
- // =========================================================================
1203
- // =========================================================================
1204
- SAXStrings.WHITESPACE = " \t\n\r";
1205
- SAXStrings.QUOTES = "\"'";
1206
- // =========================================================================
1207
- // =========================================================================
1208
- // =========================================================================
1209
-
1210
-
1211
- SAXStrings.getColumnNumber = function(strD, iP) {
1212
- /*******************************************************************************************************************
1213
- function: replace
1214
-
1215
- Author: Scott Severtson
1216
- *********************************************************************************************************************/
1217
- if(SAXStrings.isEmpty(strD)) {
1218
- return -1;
1219
- }
1220
- iP = iP || strD.length;
1221
-
1222
- var arrD = strD.substring(0, iP).split("\n");
1223
- var strLine = arrD[arrD.length - 1];
1224
- arrD.length--;
1225
- var iLinePos = arrD.join("\n").length;
1226
-
1227
- return iP - iLinePos;
1228
-
1229
- } // end function getColumnNumber
1230
-
1231
-
1232
- SAXStrings.getLineNumber = function(strD, iP) {
1233
- /*******************************************************************************************************************
1234
- function: getLineNumber
1235
-
1236
- Author: Scott Severtson
1237
- *********************************************************************************************************************/
1238
- if(SAXStrings.isEmpty(strD)) {
1239
- return -1;
1240
- }
1241
- iP = iP || strD.length;
1242
-
1243
- return strD.substring(0, iP).split("\n").length
1244
- } // end function getLineNumber
1245
-
1246
-
1247
- SAXStrings.indexOfNonWhitespace = function(strD, iB, iE) {
1248
- /*******************************************************************************************************************
1249
- function: indexOfNonWhitespace
1250
-
1251
- Author: Scott Severtson
1252
- *********************************************************************************************************************/
1253
- if(SAXStrings.isEmpty(strD)) {
1254
- return -1;
1255
- }
1256
- iB = iB || 0;
1257
- iE = iE || strD.length;
1258
-
1259
- for(var i = iB; i < iE; i++){
1260
- if(SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) == -1) {
1261
- return i;
1262
- }
1263
- }
1264
- return -1;
1265
-
1266
- } // end function indexOfNonWhitespace
1267
-
1268
-
1269
- SAXStrings.indexOfWhitespace = function(strD, iB, iE) {
1270
- /*******************************************************************************************************************
1271
- function: indexOfWhitespace
1272
-
1273
- Author: Scott Severtson
1274
- *********************************************************************************************************************/
1275
- if(SAXStrings.isEmpty(strD)) {
1276
- return -1;
1277
- }
1278
- iB = iB || 0;
1279
- iE = iE || strD.length;
1280
-
1281
- for(var i = iB; i < iE; i++) {
1282
- if(SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) != -1) {
1283
- return i;
1284
- }
1285
- }
1286
- return -1;
1287
- } // end function indexOfWhitespace
1288
-
1289
-
1290
- SAXStrings.isEmpty = function(strD) {
1291
- /*******************************************************************************************************************
1292
- function: isEmpty
1293
-
1294
- Author: Scott Severtson
1295
- *********************************************************************************************************************/
1296
-
1297
- return (strD == null) || (strD.length == 0);
1298
-
1299
- } // end function isEmpty
1300
-
1301
-
1302
- SAXStrings.lastIndexOfNonWhitespace = function(strD, iB, iE) {
1303
- /*******************************************************************************************************************
1304
- function: lastIndexOfNonWhiteSpace
1305
-
1306
- Author: Scott Severtson
1307
- *********************************************************************************************************************/
1308
- if(SAXStrings.isEmpty(strD)) {
1309
- return -1;
1310
- }
1311
- iB = iB || 0;
1312
- iE = iE || strD.length;
1313
-
1314
- for(var i = iE - 1; i >= iB; i--){
1315
- if(SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) == -1){
1316
- return i;
1317
- }
1318
- }
1319
- return -1;
1320
- } // end function lastIndexOfNonWhitespace
1321
-
1322
-
1323
- SAXStrings.replace = function(strD, iB, iE, strF, strR) {
1324
- /*******************************************************************************************************************
1325
- function: replace
1326
-
1327
- Author: Scott Severtson
1328
- *********************************************************************************************************************/
1329
- if(SAXStrings.isEmpty(strD)) {
1330
- return "";
1331
- }
1332
- iB = iB || 0;
1333
- iE = iE || strD.length;
1334
-
1335
- return strD.substring(iB, iE).split(strF).join(strR);
1336
-
1337
- } // end function replace
1338
-
1339
-
1340
-
1341
- /***************************************************************************************************************
1342
- Stack: A simple stack class, used for verifying document structure.
1343
- *****************************************************************************************************************/
1344
-
1345
- Stack = function() {
1346
- /*******************************************************************************************************************
1347
- function: Stack
1348
-
1349
- Author: Scott Severtson
1350
-
1351
- Description:
1352
- Constructor of the Stack Object
1353
- *********************************************************************************************************************/
1354
- this.m_arr = new Array();
1355
-
1356
- } // end function Stack
1357
-
1358
-
1359
- Stack.prototype.clear = function() {
1360
- /*******************************************************************************************************************
1361
- function: clear
1362
-
1363
- Author: Scott Severtson
1364
- *********************************************************************************************************************/
1365
-
1366
- this.m_arr = new Array();
1367
-
1368
- } // end function clear
1369
-
1370
-
1371
- Stack.prototype.count = function() {
1372
- /*******************************************************************************************************************
1373
- function: count
1374
-
1375
- Author: Scott Severtson
1376
- *********************************************************************************************************************/
1377
-
1378
- return this.m_arr.length;
1379
-
1380
- } // end function count
1381
-
1382
-
1383
- Stack.prototype.destroy = function() {
1384
- /*******************************************************************************************************************
1385
- function: destroy
1386
-
1387
- Author: Scott Severtson
1388
- *********************************************************************************************************************/
1389
-
1390
- this.m_arr = null;
1391
-
1392
- } // end function destroy
1393
-
1394
-
1395
- Stack.prototype.peek = function() {
1396
- /*******************************************************************************************************************
1397
- function: peek
1398
-
1399
- Author: Scott Severtson
1400
- *********************************************************************************************************************/
1401
- if(this.m_arr.length == 0) {
1402
- return null;
1403
- }
1404
-
1405
- return this.m_arr[this.m_arr.length - 1];
1406
-
1407
- } // end function peek
1408
-
1409
-
1410
- Stack.prototype.pop = function() {
1411
- /*******************************************************************************************************************
1412
- function: pop
1413
-
1414
- Author: Scott Severtson
1415
- *********************************************************************************************************************/
1416
- if(this.m_arr.length == 0) {
1417
- return null;
1418
- }
1419
-
1420
- var o = this.m_arr[this.m_arr.length - 1];
1421
- this.m_arr.length--;
1422
- return o;
1423
-
1424
- } // end function pop
1425
-
1426
-
1427
- Stack.prototype.push = function(o) {
1428
- /*******************************************************************************************************************
1429
- function: push
1430
-
1431
- Author: Scott Severtson
1432
- *********************************************************************************************************************/
1433
-
1434
- this.m_arr[this.m_arr.length] = o;
1435
-
1436
- } // end function push
1437
-
1438
-
1439
-
1440
- // =========================================================================
1441
- // =========================================================================
1442
- // =========================================================================
1443
-
1444
- // CONVENIENCE FUNCTIONS
1445
-
1446
- // =========================================================================
1447
- // =========================================================================
1448
- // =========================================================================
1449
-
1450
- function isEmpty(str) {
1451
- /*******************************************************************************************************************
1452
- function: isEmpty
1453
-
1454
- Author: mike@idle.org
1455
-
1456
- Description:
1457
- convenience function to identify an empty string
1458
-
1459
- *********************************************************************************************************************/
1460
- return (str==null) || (str.length==0);
1461
-
1462
- } // end function isEmpty
1463
-
1464
-
1465
-
1466
- function trim(trimString, leftTrim, rightTrim) {
1467
- /*******************************************************************************************************************
1468
- function: trim
1469
-
1470
- Author: may106@psu.edu
1471
-
1472
- Description:
1473
- helper function to trip a string (trimString) of leading (leftTrim)
1474
- and trailing (rightTrim) whitespace
1475
-
1476
- *********************************************************************************************************************/
1477
- if (isEmpty(trimString)) {
1478
- return "";
1479
- }
1480
-
1481
- // the general focus here is on minimal method calls - hence only one
1482
- // substring is done to complete the trim.
1483
-
1484
- if (leftTrim == null) {
1485
- leftTrim = true;
1486
- }
1487
-
1488
- if (rightTrim == null) {
1489
- rightTrim = true;
1490
- }
1491
-
1492
- var left=0;
1493
- var right=0;
1494
- var i=0;
1495
- var k=0;
1496
-
1497
-
1498
- // modified to properly handle strings that are all whitespace
1499
- if (leftTrim == true) {
1500
- while ((i<trimString.length) && (whitespace.indexOf(trimString.charAt(i++))!=-1)) {
1501
- left++;
1502
- }
1503
- }
1504
- if (rightTrim == true) {
1505
- k=trimString.length-1;
1506
- while((k>=left) && (whitespace.indexOf(trimString.charAt(k--))!=-1)) {
1507
- right++;
1508
- }
1509
- }
1510
- return trimString.substring(left, trimString.length - right);
1511
- } // end function trim
1512
-
1513
- /**
1514
- * function __escapeString
1515
- *
1516
- * author: David Joham djoham@yahoo.com
1517
- *
1518
- * @param str : string - The string to be escaped
1519
- *
1520
- * @return : string - The escaped string
1521
- */
1522
- function __escapeString(str) {
1523
-
1524
- var escAmpRegEx = /&/g;
1525
- var escLtRegEx = /</g;
1526
- var escGtRegEx = />/g;
1527
- var quotRegEx = /"/g;
1528
- var aposRegEx = /'/g;
1529
-
1530
- str = str.replace(escAmpRegEx, "&amp;");
1531
- str = str.replace(escLtRegEx, "&lt;");
1532
- str = str.replace(escGtRegEx, "&gt;");
1533
- str = str.replace(quotRegEx, "&quot;");
1534
- str = str.replace(aposRegEx, "&apos;");
1535
-
1536
- return str;
1537
- }
1538
-
1539
- /**
1540
- * function __unescapeString
1541
- *
1542
- * author: David Joham djoham@yahoo.com
1543
- *
1544
- * @param str : string - The string to be unescaped
1545
- *
1546
- * @return : string - The unescaped string
1547
- */
1548
- function __unescapeString(str) {
1549
-
1550
- var escAmpRegEx = /&amp;/g;
1551
- var escLtRegEx = /&lt;/g;
1552
- var escGtRegEx = /&gt;/g;
1553
- var quotRegEx = /&quot;/g;
1554
- var aposRegEx = /&apos;/g;
1555
-
1556
- str = str.replace(escAmpRegEx, "&");
1557
- str = str.replace(escLtRegEx, "<");
1558
- str = str.replace(escGtRegEx, ">");
1559
- str = str.replace(quotRegEx, "\"");
1560
- str = str.replace(aposRegEx, "'");
1561
-
1562
- return str;
1563
- }
1564
-