Mercurial > hg > xemacs-beta
comparison lisp/psgml/psgml-parse.el @ 2:ac2d302a0011 r19-15b2
Import from CVS: tag r19-15b2
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:46:35 +0200 |
parents | 376386a54a3c |
children | bcdc7deadc19 |
comparison
equal
deleted
inserted
replaced
1:c0c6a60d29db | 2:ac2d302a0011 |
---|---|
1 ;;;; psgml-parse.el --- Parser for SGML-editing mode with parsing support | 1 ;;;; psgml-parse.el --- Parser for SGML-editing mode with parsing support |
2 ;; $Id: psgml-parse.el,v 1.1.1.1 1996/12/18 03:35:21 steve Exp $ | 2 ;; $Id: psgml-parse.el,v 1.1.1.2 1996/12/18 03:47:15 steve Exp $ |
3 | 3 |
4 ;; Copyright (C) 1994, 1995 Lennart Staflin | 4 ;; Copyright (C) 1994, 1995 Lennart Staflin |
5 | 5 |
6 ;; Author: Lennart Staflin <lenst@lysator.liu.se> | 6 ;; Author: Lennart Staflin <lenst@lysator.liu.se> |
7 ;; Acknowledgment: | 7 ;; Acknowledgment: |
179 (defvar sgml-current-localcat nil | 179 (defvar sgml-current-localcat nil |
180 "Value of `sgml-local-catalogs' in main buffer. Valid during parsing.") | 180 "Value of `sgml-local-catalogs' in main buffer. Valid during parsing.") |
181 | 181 |
182 (defvar sgml-current-local-ecat nil | 182 (defvar sgml-current-local-ecat nil |
183 "Value of `sgml-local-ecat-files' in main buffer. Valid during parsing.") | 183 "Value of `sgml-local-ecat-files' in main buffer. Valid during parsing.") |
184 | |
185 (defvar sgml-current-top-buffer nil | |
186 "The buffer of the document entity, the main buffer. | |
187 Valid during parsing. This is used to find current directory for | |
188 catalogs.") | |
184 | 189 |
185 (defvar sgml-current-state nil | 190 (defvar sgml-current-state nil |
186 "Current state in content model or model type if CDATA, RCDATA or ANY.") | 191 "Current state in content model or model type if CDATA, RCDATA or ANY.") |
187 | 192 |
188 (defvar sgml-current-shortmap nil | 193 (defvar sgml-current-shortmap nil |
310 ;; 1. moves for required tokens, 2. moves for optional tokens. | 315 ;; 1. moves for required tokens, 2. moves for optional tokens. |
311 ;; By design these are keept in two different sets. | 316 ;; By design these are keept in two different sets. |
312 ;; [Alt: they could perhaps have been keept in one set but | 317 ;; [Alt: they could perhaps have been keept in one set but |
313 ;; marked in different ways.] | 318 ;; marked in different ways.] |
314 | 319 |
315 ;; The &-model groups creates too big state machines, therefor | 320 ;; The and-model groups creates too big state machines, therefor |
316 ;; there is a datastruture called &-node. | 321 ;; there is a datastruture called and-node. |
317 | 322 |
318 ;; A &-node is a specification for a dfa that has not been computed. | 323 ;; A and-node is a specification for a dfa that has not been computed. |
319 ;; It contains a set of dfas that all have to be traversed befor going | 324 ;; It contains a set of dfas that all have to be traversed befor going |
320 ;; to the next state. The &-nodes are only stored in moves and are | 325 ;; to the next state. The and-nodes are only stored in moves and are |
321 ;; not seen by the parser. When a move is taken the &-node is converted | 326 ;; not seen by the parser. When a move is taken the and-node is converted |
322 ;; to a &-state. | 327 ;; to a and-state. |
323 | 328 |
324 ;; A &-state keeps track of which dfas still need to be | 329 ;; A and-state keeps track of which dfas still need to be |
325 ;; traversed and the state of the current dfa. | 330 ;; traversed and the state of the current dfa. |
326 | 331 |
327 ;; move = <token, node> | 332 ;; move = <token, node> |
328 | 333 |
329 ;; node = normal-state | &-node | 334 ;; node = normal-state | and-node |
330 | 335 |
331 ;; &-node = <dfas, next> | 336 ;; and-node = <dfas, next> |
332 ;; where: dfas is a set of normal-state | 337 ;; where: dfas is a set of normal-state |
333 ;; next is a normal-state | 338 ;; next is a normal-state |
334 | 339 |
335 ;; State = normal-state | &-state | 340 ;; State = normal-state | and-state |
336 ;; The parser only knows about the state type. | 341 ;; The parser only knows about the state type. |
337 | 342 |
338 ;; normal-state = <opts, reqs> | 343 ;; normal-state = <opts, reqs> |
339 ;; where: opts is a set of moves for optional tokens | 344 ;; where: opts is a set of moves for optional tokens |
340 ;; reqs is a set of moves for required tokens | 345 ;; reqs is a set of moves for required tokens |
341 | 346 |
342 ;; &-state = <substate, dfas, next> | 347 ;; and-state = <substate, dfas, next> |
343 ;; where: substate is a normal-state | 348 ;; where: substate is a normal-state |
344 ;; dfas is a set of states | 349 ;; dfas is a set of states |
345 ;; next is the next state | 350 ;; next is the next state |
346 | 351 |
347 ;; The &-state is only used during the parsing. | 352 ;; The and-state is only used during the parsing. |
348 ;; Primitiv functions to get data from parse state need | 353 ;; Primitiv functions to get data from parse state need |
349 ;; to know both normal-state and &-state. | 354 ;; to know both normal-state and and-state. |
350 | 355 |
351 | 356 |
352 ;;; Representations: | 357 ;;; Representations: |
353 | 358 |
354 ;;move: (token . node) | 359 ;;move: (token . node) |
407 (let ((s1 (sgml-make-state)) | 412 (let ((s1 (sgml-make-state)) |
408 (s2 (sgml-make-state))) | 413 (s2 (sgml-make-state))) |
409 (sgml-add-req-move s1 token s2) | 414 (sgml-add-req-move s1 token s2) |
410 s1)) | 415 s1)) |
411 | 416 |
412 ;;&-state: (state next . dfas) | 417 ;;and-state: (state next . dfas) |
413 | 418 |
414 (defsubst sgml-make-&state (state dfas next) | 419 (defsubst sgml-make-and-state (state dfas next) |
415 (cons state (cons next dfas))) | 420 (cons state (cons next dfas))) |
416 | 421 |
417 (defsubst sgml-step-&state (state &state) | 422 (defsubst sgml-step-and-state (state and-state) |
418 (cons state (cdr &state))) | 423 (cons state (cdr and-state))) |
419 | 424 |
420 (defsubst sgml-&state-substate (s) | 425 (defsubst sgml-and-state-substate (s) |
421 (car s)) | 426 (car s)) |
422 | 427 |
423 (defsubst sgml-&state-dfas (s) | 428 (defsubst sgml-and-state-dfas (s) |
424 (cddr s)) | 429 (cddr s)) |
425 | 430 |
426 (defsubst sgml-&state-next (s) | 431 (defsubst sgml-and-state-next (s) |
427 (cadr s)) | 432 (cadr s)) |
428 | 433 |
429 | 434 |
430 ;;&-node: (next . dfas) | 435 ;;and-node: (next . dfas) |
431 | 436 |
432 (defsubst sgml-make-&node (dfas next) | 437 (defsubst sgml-make-and-node (dfas next) |
433 (cons next dfas)) | 438 (cons next dfas)) |
434 | 439 |
435 (defmacro sgml-&node-next (n) | 440 (defmacro sgml-and-node-next (n) |
436 (` (car (, n)))) | 441 (` (car (, n)))) |
437 | 442 |
438 (defmacro sgml-&node-dfas (n) | 443 (defmacro sgml-and-node-dfas (n) |
439 (` (cdr (, n)))) | 444 (` (cdr (, n)))) |
440 | 445 |
441 | 446 |
442 ;;; Using states | 447 ;;; Using states |
443 | 448 |
451 (sgml-moves-lookup token (sgml-state-reqs state))))) | 456 (sgml-moves-lookup token (sgml-state-reqs state))))) |
452 (if c | 457 (if c |
453 (let ((dest (sgml-move-dest c))) | 458 (let ((dest (sgml-move-dest c))) |
454 (if (sgml-normal-state-p dest) | 459 (if (sgml-normal-state-p dest) |
455 dest | 460 dest |
456 ;; dest is a &-node | 461 ;; dest is a and-node |
457 (sgml-next-sub& (sgml-&node-dfas dest) | 462 (sgml-next-sub-and (sgml-and-node-dfas dest) |
463 token | |
464 (sgml-and-node-next dest))))))) | |
465 (t ;state is a and-state | |
466 (sgml-get-and-move state token)))) | |
467 | |
468 (defun sgml-get-and-move (state token) | |
469 ;; state is a and-state | |
470 (let ((m (sgml-get-move (sgml-and-state-substate state) token))) | |
471 (cond (m (cons m (cdr state))) | |
472 ((sgml-final (sgml-and-state-substate state)) | |
473 (sgml-next-sub-and (sgml-and-state-dfas state) | |
458 token | 474 token |
459 (sgml-&node-next dest))))))) | 475 (sgml-and-state-next state)))))) |
460 (t ;state is a &-state | 476 |
461 (sgml-get-&move state token)))) | 477 (defun sgml-next-sub-and (dfas token next) |
462 | |
463 (defun sgml-get-&move (state token) | |
464 ;; state is a &-state | |
465 (let ((m (sgml-get-move (sgml-&state-substate state) token))) | |
466 (cond (m (cons m (cdr state))) | |
467 ((sgml-state-final-p (sgml-&state-substate state)) | |
468 (sgml-next-sub& (sgml-&state-dfas state) | |
469 token | |
470 (sgml-&state-next state)))))) | |
471 | |
472 (defun sgml-next-sub& (dfas token next) | |
473 "Compute the next state, choosing from DFAS and moving by TOKEN. | 478 "Compute the next state, choosing from DFAS and moving by TOKEN. |
474 If this is not possible, but all DFAS are final, move by TOKEN in NEXT." | 479 If this is not possible, but all DFAS are final, move by TOKEN in NEXT." |
475 (let ((allfinal t) | 480 (let ((allfinal t) |
476 (l dfas) | 481 (l dfas) |
477 (res nil) | 482 (res nil) |
478 s1 s2) | 483 s1 s2) |
479 (while (and l (not res)) | 484 (while (and l (not res)) |
480 (setq s1 (car l) | 485 (setq s1 (car l) |
481 allfinal (and allfinal (sgml-state-final-p s1)) | 486 allfinal (and allfinal (sgml-state-final-p s1)) |
482 s2 (sgml-get-move s1 token) | 487 s2 (sgml-get-move s1 token) |
483 res (and s2 (sgml-make-&state s2 (remq s1 dfas) next)) | 488 res (and s2 (sgml-make-and-state s2 (remq s1 dfas) next)) |
484 l (cdr l))) | 489 l (cdr l))) |
485 (cond (res) | 490 (cond (res) |
486 (allfinal (sgml-get-move next token))))) | 491 (allfinal (sgml-get-move next token))))) |
487 | 492 |
488 (defsubst sgml-tokens-of-moves (moves) | 493 (defsubst sgml-tokens-of-moves (moves) |
490 moves)) | 495 moves)) |
491 | 496 |
492 (defun sgml-required-tokens (state) | 497 (defun sgml-required-tokens (state) |
493 (if (sgml-normal-state-p state) | 498 (if (sgml-normal-state-p state) |
494 (sgml-tokens-of-moves (sgml-state-reqs state)) | 499 (sgml-tokens-of-moves (sgml-state-reqs state)) |
495 (or (sgml-required-tokens (sgml-&state-substate state)) | 500 (or (sgml-required-tokens (sgml-and-state-substate state)) |
496 (loop for s in (sgml-&state-dfas state) | 501 (loop for s in (sgml-and-state-dfas state) |
497 nconc (sgml-tokens-of-moves (sgml-state-reqs s))) | 502 nconc (sgml-tokens-of-moves (sgml-state-reqs s))) |
498 (sgml-tokens-of-moves (sgml-state-reqs (sgml-&state-next state)))))) | 503 (sgml-tokens-of-moves (sgml-state-reqs (sgml-and-state-next state)))))) |
499 | 504 |
500 | 505 |
501 (defsubst sgml-final (state) | 506 (defsubst sgml-final (state) |
502 (if (sgml-normal-state-p state) | 507 (if (sgml-normal-state-p state) |
503 (sgml-state-final-p state) | 508 (sgml-state-final-p state) |
504 (sgml-final& state))) | 509 (sgml-final-and state))) |
505 | 510 |
506 (defun sgml-final& (state) | 511 (defun sgml-final-and (state) |
507 (and (sgml-final (sgml-&state-substate state)) | 512 (and (sgml-final (sgml-and-state-substate state)) |
508 (loop for s in (sgml-&state-dfas state) | 513 (loop for s in (sgml-and-state-dfas state) |
509 always (sgml-state-final-p s)) | 514 always (sgml-state-final-p s)) |
510 (sgml-state-final-p (sgml-&state-next state)))) | 515 (sgml-state-final-p (sgml-and-state-next state)))) |
511 | 516 |
512 (defun sgml-optional-tokens (state) | 517 (defun sgml-optional-tokens (state) |
513 (if (sgml-normal-state-p state) | 518 (if (sgml-normal-state-p state) |
514 (sgml-tokens-of-moves (sgml-state-opts state)) | 519 (sgml-tokens-of-moves (sgml-state-opts state)) |
515 (nconc | 520 (nconc |
516 (sgml-optional-tokens (sgml-&state-substate state)) | 521 (sgml-optional-tokens (sgml-and-state-substate state)) |
517 (if (sgml-final (sgml-&state-substate state)) | 522 (if (sgml-final (sgml-and-state-substate state)) |
518 (loop for s in (sgml-&state-dfas state) | 523 (loop for s in (sgml-and-state-dfas state) |
519 nconc (sgml-tokens-of-moves (sgml-state-opts s)))) | 524 nconc (sgml-tokens-of-moves (sgml-state-opts s)))) |
520 (if (loop for s in (sgml-&state-dfas state) | 525 (if (loop for s in (sgml-and-state-dfas state) |
521 always (sgml-state-final-p s)) | 526 always (sgml-state-final-p s)) |
522 (sgml-tokens-of-moves (sgml-state-opts (sgml-&state-next state))))))) | 527 (sgml-tokens-of-moves |
528 (sgml-state-opts (sgml-and-state-next state))))))) | |
523 | 529 |
524 | 530 |
525 ;;;; Attribute Types | 531 ;;;; Attribute Types |
526 | 532 |
527 ;;; Basic Types | 533 ;;; Basic Types |
973 (sgml-dtd-eltypes dtd)) | 979 (sgml-dtd-eltypes dtd)) |
974 (nreverse *res*))) | 980 (nreverse *res*))) |
975 | 981 |
976 ;;;; Load a saved dtd | 982 ;;;; Load a saved dtd |
977 | 983 |
984 ;;; Wing addition | |
978 (defmacro sgml-char-int (ch) | 985 (defmacro sgml-char-int (ch) |
979 (if (fboundp 'char-int) | 986 (if (fboundp 'char-int) |
980 (` (char-int (, ch))) | 987 (` (char-int (, ch))) |
981 ch)) | 988 ch)) |
982 | 989 |
983 (defsubst sgml-read-octet () | 990 (defsubst sgml-read-octet () |
991 ;; Wing change | |
984 (prog1 (sgml-char-int (following-char)) | 992 (prog1 (sgml-char-int (following-char)) |
985 (forward-char))) | 993 (forward-char))) |
986 | 994 |
987 (defsubst sgml-read-number () | 995 (defsubst sgml-read-number () |
988 "Read a number. | 996 "Read a number. |
1026 (defun sgml-read-model () | 1034 (defun sgml-read-model () |
1027 (let* ((n (sgml-read-number)) | 1035 (let* ((n (sgml-read-number)) |
1028 (sgml-read-nodes (make-vector n nil))) | 1036 (sgml-read-nodes (make-vector n nil))) |
1029 (loop for i below n do (aset sgml-read-nodes i (sgml-make-state))) | 1037 (loop for i below n do (aset sgml-read-nodes i (sgml-make-state))) |
1030 (loop for e across sgml-read-nodes do | 1038 (loop for e across sgml-read-nodes do |
1031 (cond ((eq 255 (sgml-read-peek)) ; a &node | 1039 (cond ((eq 255 (sgml-read-peek)) ; a and-node |
1032 (sgml-read-octet) ; skip | 1040 (sgml-read-octet) ; skip |
1033 (setf (sgml-&node-next e) (sgml-read-node-ref)) | 1041 (setf (sgml-and-node-next e) (sgml-read-node-ref)) |
1034 (setf (sgml-&node-dfas e) (sgml-read-model-seq))) | 1042 (setf (sgml-and-node-dfas e) (sgml-read-model-seq))) |
1035 (t ; a normal-state | 1043 (t ; a normal-state |
1036 (setf (sgml-state-opts e) (sgml-read-moves)) | 1044 (setf (sgml-state-opts e) (sgml-read-moves)) |
1037 (setf (sgml-state-reqs e) (sgml-read-moves))))) | 1045 (setf (sgml-state-reqs e) (sgml-read-moves))))) |
1038 (aref sgml-read-nodes 0))) | 1046 (aref sgml-read-nodes 0))) |
1039 | 1047 |
1196 do (sgml-entity-declare name parameters 'text val)) | 1204 do (sgml-entity-declare name parameters 'text val)) |
1197 (sgml-push-to-entity dtd-file) | 1205 (sgml-push-to-entity dtd-file) |
1198 (sgml-check-dtd-subset) | 1206 (sgml-check-dtd-subset) |
1199 (sgml-pop-entity) | 1207 (sgml-pop-entity) |
1200 (erase-buffer) | 1208 (erase-buffer) |
1209 ;; For XEmacs-20.0/Mule | |
1210 (setq file-coding-system 'noconv) | |
1201 (sgml-write-dtd sgml-dtd-info to-file) | 1211 (sgml-write-dtd sgml-dtd-info to-file) |
1202 t)) | 1212 t)) |
1203 | 1213 |
1204 (defun sgml-check-entities (params1 params2) | 1214 (defun sgml-check-entities (params1 params2) |
1205 "Check that PARAMS1 is compatible with PARAMS2." | 1215 "Check that PARAMS1 is compatible with PARAMS2." |
1223 | 1233 |
1224 (defun sgml-bdtd-merge () | 1234 (defun sgml-bdtd-merge () |
1225 "Merge the binary coded dtd in the current buffer with the current dtd. | 1235 "Merge the binary coded dtd in the current buffer with the current dtd. |
1226 The current dtd is the variable sgml-dtd-info. Return t if mereged | 1236 The current dtd is the variable sgml-dtd-info. Return t if mereged |
1227 was successfull or nil if failed." | 1237 was successfull or nil if failed." |
1238 (setq file-coding-system 'noconv) | |
1228 (goto-char (point-min)) | 1239 (goto-char (point-min)) |
1229 (sgml-read-sexp) ; skip filev | 1240 (sgml-read-sexp) ; skip filev |
1230 (let ((dependencies (sgml-read-sexp)) | 1241 (let ((dependencies (sgml-read-sexp)) |
1231 (parameters (sgml-read-sexp)) | 1242 (parameters (sgml-read-sexp)) |
1232 (gc-cons-threshold (max gc-cons-threshold 500000)) | 1243 (gc-cons-threshold (max gc-cons-threshold 500000)) |
1775 (not (eq (sgml-entity-type entity) 'text))) | 1786 (not (eq (sgml-entity-type entity) 'text))) |
1776 | 1787 |
1777 (defun sgml-entity-marked-undefined-p (entity) | 1788 (defun sgml-entity-marked-undefined-p (entity) |
1778 (cdddr entity)) | 1789 (cdddr entity)) |
1779 | 1790 |
1780 (defun sgml-entity-insert-text (entity &optional ptype) | |
1781 "Insert the text of ENTITY. | |
1782 PTYPE can be 'param if this is a parameter entity." | |
1783 (let ((text (sgml-entity-text entity))) | |
1784 (cond | |
1785 ((stringp text) | |
1786 (insert text)) | |
1787 (t | |
1788 (unless (sgml-insert-external-entity text | |
1789 (or ptype | |
1790 (sgml-entity-type entity)) | |
1791 (sgml-entity-name entity)) | |
1792 ;; Mark entity as not found | |
1793 (setcdr (cddr entity) t) ;*** | |
1794 ))))) | |
1795 | |
1796 (defun sgml-entity-file (entity &optional ptype) | |
1797 (sgml-external-file (sgml-entity-text entity) | |
1798 (or ptype (sgml-entity-type entity)) | |
1799 (sgml-entity-name entity))) | |
1800 | 1791 |
1801 ;;; Entity tables | 1792 ;;; Entity tables |
1802 ;; Represented by a cons-cell whose car is the default entity (or nil) | 1793 ;; Represented by a cons-cell whose car is the default entity (or nil) |
1803 ;; and whose cdr is as an association list. | 1794 ;; and whose cdr is as an association list. |
1804 | 1795 |
1837 (defun sgml-merge-entity-tables (tab1 tab2) | 1828 (defun sgml-merge-entity-tables (tab1 tab2) |
1838 "Merge entity table TAB2 into TAB1. TAB1 is modified." | 1829 "Merge entity table TAB2 into TAB1. TAB1 is modified." |
1839 (nconc tab1 (cdr tab2)) | 1830 (nconc tab1 (cdr tab2)) |
1840 (setcar tab1 (or (car tab1) (car tab2)))) | 1831 (setcar tab1 (or (car tab1) (car tab2)))) |
1841 | 1832 |
1833 | |
1834 (defun sgml-entity-insert-text (entity &optional ptype) | |
1835 "Insert the text of ENTITY. | |
1836 PTYPE can be 'param if this is a parameter entity." | |
1837 (let ((text (sgml-entity-text entity))) | |
1838 (cond | |
1839 ((stringp text) | |
1840 (insert text)) | |
1841 (t | |
1842 (sgml-insert-external-entity text | |
1843 (or ptype | |
1844 (sgml-entity-type entity)) | |
1845 (sgml-entity-name entity)))))) | |
1842 | 1846 |
1843 ;;;; External identifyer resolve | 1847 ;;;; External identifyer resolve |
1844 | 1848 |
1845 (defun sgml-cache-catalog (file cache-var parser-fun) | 1849 (defun sgml-cache-catalog (file cache-var parser-fun |
1850 &optional default-dir) | |
1846 "Return parsed catalog. | 1851 "Return parsed catalog. |
1847 FILE is the file containing the catalog. Maintains a cache of parsed | 1852 FILE is the file containing the catalog. Maintains a cache of parsed |
1848 catalog files in variable CACHE-VAR. The parsing is done by function | 1853 catalog files in variable CACHE-VAR. The parsing is done by function |
1849 PARSER-FUN that should parse the current buffer and return the parsed | 1854 PARSER-FUN that should parse the current buffer and return the parsed |
1850 repreaentation of the catalog." | 1855 repreaentation of the catalog." |
1851 (setq file (expand-file-name file)) | 1856 (setq file (file-truename (expand-file-name file default-dir))) |
1852 (and | 1857 (and |
1853 (file-readable-p file) | 1858 (file-readable-p file) |
1854 (let ((c (assoc file (symbol-value cache-var))) | 1859 (let ((c (assoc file (symbol-value cache-var))) |
1855 (modtime (elt (file-attributes file) 5))) | 1860 (modtime (elt (file-attributes file) 5))) |
1856 (if (and c (equal (second c) modtime)) | 1861 (if (and c (equal (second c) modtime)) |
1864 (sgml-pop-entity) | 1869 (sgml-pop-entity) |
1865 (push (cons file (cons modtime new)) (symbol-value cache-var)) | 1870 (push (cons file (cons modtime new)) (symbol-value cache-var)) |
1866 (message "Loading %s ... done" file) | 1871 (message "Loading %s ... done" file) |
1867 new))))) | 1872 new))))) |
1868 | 1873 |
1874 (defun sgml-main-directory () | |
1875 "Directory of the document entity." | |
1876 (let ((cb (current-buffer))) | |
1877 (set-buffer sgml-current-top-buffer) | |
1878 (prog1 default-directory | |
1879 (set-buffer cb)))) | |
1880 | |
1881 (defun sgml-trace-lookup (&rest args) | |
1882 "Log a message like `sgml-log-message', but only if `sgml-trace-entity-lookup' is set." | |
1883 (when sgml-trace-entity-lookup | |
1884 (apply (function sgml-log-message) args))) | |
1885 | |
1886 | |
1869 (defun sgml-catalog-lookup (files pubid type name) | 1887 (defun sgml-catalog-lookup (files pubid type name) |
1870 "Look up the public identifier/entity name in catalogs. | 1888 "Look up the public identifier/entity name in catalogs. |
1871 FILES is a list of catalogs to use. PUBID is the public identifier | 1889 FILES is a list of catalogs to use. PUBID is the public identifier |
1872 \(if any). TYPE is the entity type and NAME is the entity name." | 1890 \(if any). TYPE is the entity type and NAME is the entity name." |
1873 (cond ((eq type 'param) | 1891 (cond ((eq type 'param) |
1874 (setq name (format "%%%s" name) | 1892 (setq name (format "%%%s" name) |
1875 type 'entity)) | 1893 type 'entity)) |
1876 ((eq type 'dtd) | 1894 ((eq type 'dtd) |
1877 (setq type 'doctype))) | 1895 (setq type 'doctype))) |
1878 | 1896 ;;(sgml-trace-lookup " [pubid='%s' type=%s name='%s']" pubid type name) |
1879 (loop | 1897 (loop |
1880 for f in files thereis | 1898 for f in files thereis |
1881 (let ((cat (sgml-cache-catalog f 'sgml-catalog-assoc | 1899 (let ((cat (sgml-cache-catalog f 'sgml-catalog-assoc |
1882 (function sgml-parse-catalog-buffer)))) | 1900 (function sgml-parse-catalog-buffer) |
1901 (sgml-main-directory)))) | |
1902 (sgml-trace-lookup " catalog: %s %s" | |
1903 (expand-file-name f (sgml-main-directory)) | |
1904 (if (null cat) "empty/non existent" "exists")) | |
1883 (or | 1905 (or |
1884 ;; Giv PUBLIC entries priority over ENTITY and DOCTYPE | 1906 ;; Giv PUBLIC entries priority over ENTITY and DOCTYPE |
1885 (if pubid | 1907 (if pubid |
1886 (loop for (key cname file) in cat | 1908 (loop for (key cname file) in cat |
1887 thereis (and (eq 'public key) | 1909 thereis (if (and (eq 'public key) |
1888 (string= pubid cname) | 1910 (string= pubid cname)) |
1889 (file-readable-p file) | 1911 (if (file-readable-p file) |
1890 file))) | 1912 (progn |
1913 (sgml-trace-lookup " >> %s [by pubid]" file) | |
1914 file) | |
1915 (progn | |
1916 (sgml-trace-lookup " !unreadable %s" file) | |
1917 nil))))) | |
1891 (loop for (key cname file) in cat | 1918 (loop for (key cname file) in cat |
1892 thereis (and (eq type key) | 1919 ;;do (sgml-trace-lookup " %s %s" key cname) |
1893 (or (null cname) | 1920 thereis (if (and (eq type key) |
1894 (string= name cname)) | 1921 (or (null cname) |
1895 (file-readable-p file) | 1922 (string= name cname))) |
1896 file)))))) | 1923 (if (file-readable-p file) |
1897 | 1924 (progn |
1898 (defun sgml-search-catalog (func filter) | 1925 (sgml-trace-lookup " >> %s [by %s %s]" |
1899 (loop | 1926 file key cname) |
1900 for files in (list sgml-local-catalogs sgml-catalog-files) | 1927 file) |
1901 thereis | 1928 (progn |
1902 (loop for file in files thereis | 1929 (sgml-trace-lookup " !unreadable %s" file) |
1903 (loop for entry in (sgml-cache-catalog | 1930 nil)))))))) |
1904 file 'sgml-catalog-assoc | |
1905 (function sgml-parse-catalog-buffer)) | |
1906 when (or (null filter) | |
1907 (memq (car entry) filter)) | |
1908 thereis (funcall func entry))))) | |
1909 | 1931 |
1910 (defun sgml-path-lookup (extid type name) | 1932 (defun sgml-path-lookup (extid type name) |
1911 (let* ((pubid (sgml-extid-pubid extid)) | 1933 (let* ((pubid (sgml-extid-pubid extid)) |
1912 (sysid (sgml-extid-sysid extid)) | 1934 (sysid (sgml-extid-sysid extid)) |
1913 (subst (list '(?% ?%)))) | 1935 (subst (list '(?% ?%)))) |
1937 Optional argument TYPE should be the type of entity and NAME should be | 1959 Optional argument TYPE should be the type of entity and NAME should be |
1938 the entity name." | 1960 the entity name." |
1939 ;; extid is (pubid . sysid) | 1961 ;; extid is (pubid . sysid) |
1940 (let ((pubid (sgml-extid-pubid extid))) | 1962 (let ((pubid (sgml-extid-pubid extid))) |
1941 (when pubid (setq pubid (sgml-canonize-pubid pubid))) | 1963 (when pubid (setq pubid (sgml-canonize-pubid pubid))) |
1964 (sgml-trace-lookup "Start looking for %s entity %s public %s system %s" | |
1965 (or type "-") | |
1966 (or name "?") | |
1967 pubid | |
1968 (sgml-extid-sysid extid)) | |
1942 (or (if sgml-system-identifiers-are-preferred | 1969 (or (if sgml-system-identifiers-are-preferred |
1943 (sgml-lookup-sysid-as-file extid)) | 1970 (sgml-lookup-sysid-as-file extid)) |
1944 (sgml-catalog-lookup sgml-current-localcat pubid type name) | 1971 (sgml-catalog-lookup sgml-current-localcat pubid type name) |
1945 (sgml-catalog-lookup sgml-catalog-files pubid type name) | 1972 (sgml-catalog-lookup sgml-catalog-files pubid type name) |
1946 (if (not sgml-system-identifiers-are-preferred) | 1973 (if (not sgml-system-identifiers-are-preferred) |
1977 | 2004 |
1978 | 2005 |
1979 ;; Parse a buffer full of catalogue entries. | 2006 ;; Parse a buffer full of catalogue entries. |
1980 (defun sgml-parse-catalog-buffer () | 2007 (defun sgml-parse-catalog-buffer () |
1981 "Parse all entries in a catalogue." | 2008 "Parse all entries in a catalogue." |
2009 (sgml-trace-lookup " (Parsing catalog)") | |
1982 (loop | 2010 (loop |
1983 while (sgml-skip-cs) | 2011 while (sgml-skip-cs) |
1984 for type = (downcase (sgml-check-cat-literal)) | 2012 for type = (downcase (sgml-check-cat-literal)) |
1985 for class = (cdr (assoc type '(("public" . public) ("dtddecl" . public) | 2013 for class = (cdr (assoc type '(("public" . public) ("dtddecl" . public) |
1986 ("entity" . name) ("linktype" . name) | 2014 ("entity" . name) ("linktype" . name) |
2120 (defun sgml-epos-eref (epos) | 2148 (defun sgml-epos-eref (epos) |
2121 (if (consp epos) | 2149 (if (consp epos) |
2122 (car epos))) | 2150 (car epos))) |
2123 | 2151 |
2124 (defun sgml-epos-pos (epos) | 2152 (defun sgml-epos-pos (epos) |
2153 "The buffer position of EPOS withing its entity." | |
2125 (if (consp epos) | 2154 (if (consp epos) |
2126 (cdr epos) | 2155 (cdr epos) |
2127 epos)) | 2156 epos)) |
2128 | 2157 |
2129 (defun sgml-bpos-p (epos) | 2158 (defun sgml-bpos-p (epos) |
2159 "True if EPOS is a position in the main buffer." | |
2130 (numberp epos)) | 2160 (numberp epos)) |
2131 | 2161 |
2132 (defun sgml-strict-epos-p (epos) | 2162 (defun sgml-strict-epos-p (epos) |
2163 "True if EPOS is a position in an entity other then the main buffer." | |
2133 (consp epos)) | 2164 (consp epos)) |
2134 | 2165 |
2135 (defun sgml-epos (pos) | 2166 (defun sgml-epos (pos) |
2136 "Convert a buffer position POS into an epos." | 2167 "Convert a buffer position POS into an epos." |
2137 (if sgml-current-eref | 2168 (if sgml-current-eref |
2138 (sgml-make-epos sgml-current-eref pos) | 2169 (sgml-make-epos sgml-current-eref pos) |
2139 pos)) | 2170 pos)) |
2140 | 2171 |
2141 (defun sgml-epos-erliest (epos) | 2172 (defun sgml-epos-before (epos) |
2173 "The last position in buffer not after EPOS. | |
2174 If EPOS is a buffer position this is the same. If EPOS is in an entity | |
2175 this is the buffer position before the entity reference." | |
2142 (while (consp epos) | 2176 (while (consp epos) |
2143 (setq epos (sgml-eref-start (sgml-epos-eref epos)))) | 2177 (setq epos (sgml-eref-start (sgml-epos-eref epos)))) |
2144 epos) | 2178 epos) |
2145 | 2179 |
2146 (defun sgml-epos-latest (epos) | 2180 (defun sgml-epos-after (epos) |
2181 "The first position in buffer after EPOS. | |
2182 If EPOS is in an other entity, buffer position is after | |
2183 entity reference leading to EPOS." | |
2147 (while (consp epos) | 2184 (while (consp epos) |
2148 (setq epos (sgml-eref-end (sgml-epos-eref epos)))) | 2185 (setq epos (sgml-eref-end (sgml-epos-eref epos)))) |
2149 epos) | 2186 epos) |
2150 | 2187 |
2151 (defun sgml-epos-promote (epos) | 2188 (defun sgml-epos-promote (epos) |
2189 "Convert position in entity structure EPOS to a buffer position. | |
2190 If EPOS is in an entity, the buffer position will be the position | |
2191 before the entity reference if EPOS is first character in entity | |
2192 text. Otherwise buffer position will be after entity reference." | |
2152 (while (and (consp epos) | 2193 (while (and (consp epos) |
2153 (= (cdr epos) 1)) | 2194 (= (cdr epos) 1)) |
2154 (setq epos (sgml-eref-start (car epos)))) | 2195 (setq epos (sgml-eref-start (car epos)))) |
2155 (sgml-epos-latest epos)) | 2196 (sgml-epos-after epos)) |
2156 | 2197 |
2157 | 2198 |
2158 ;;;; DTD repository | 2199 ;;;; DTD repository |
2159 ;;compiled-dtd: extid -> Compiled-DTD? | 2200 ;;compiled-dtd: extid -> Compiled-DTD? |
2160 ;;extid-cdtd-name: extid -> file? | 2201 ;;extid-cdtd-name: extid -> file? |
2238 (defun sgml-try-merge-compiled-dtd (pubid file) | 2279 (defun sgml-try-merge-compiled-dtd (pubid file) |
2239 (when pubid (setq pubid (sgml-canonize-pubid pubid))) | 2280 (when pubid (setq pubid (sgml-canonize-pubid pubid))) |
2240 (when file (setq file (expand-file-name file))) | 2281 (when file (setq file (expand-file-name file))) |
2241 (sgml-debug "Find compiled dtd for %s %s" pubid file) | 2282 (sgml-debug "Find compiled dtd for %s %s" pubid file) |
2242 (let ((ce (or (sgml-ecat-lookup sgml-current-local-ecat pubid file) | 2283 (let ((ce (or (sgml-ecat-lookup sgml-current-local-ecat pubid file) |
2243 (sgml-ecat-lookup sgml-ecat-files pubid file))) | 2284 (sgml-ecat-lookup sgml-ecat-files pubid file)))) |
2244 cfile dtd ents) | |
2245 (and ce | 2285 (and ce |
2246 (let ((cfile (car ce)) | 2286 (let ((cfile (car ce)) |
2247 (ents (cdr ce))) | 2287 (ents (cdr ce))) |
2248 (sgml-debug "Found %s" cfile) | 2288 (sgml-debug "Found %s" cfile) |
2249 (if (sgml-use-special-case) | 2289 (if (sgml-use-special-case) |
2299 (defun sgml-push-to-entity (entity &optional ref-start type) | 2339 (defun sgml-push-to-entity (entity &optional ref-start type) |
2300 "Set current buffer to a buffer containing the entity ENTITY. | 2340 "Set current buffer to a buffer containing the entity ENTITY. |
2301 ENTITY can also be a file name. Optional argument REF-START should be | 2341 ENTITY can also be a file name. Optional argument REF-START should be |
2302 the start point of the entity reference. Optional argument TYPE, | 2342 the start point of the entity reference. Optional argument TYPE, |
2303 overrides the entity type in entity look up." | 2343 overrides the entity type in entity look up." |
2344 (sgml-debug "Push to %s" | |
2345 (cond ((stringp entity) | |
2346 (format "string '%s'" entity)) | |
2347 (t | |
2348 (sgml-entity-name entity)))) | |
2304 (when ref-start | 2349 (when ref-start |
2350 ;; don't consider a RS shortref here again | |
2305 (setq sgml-rs-ignore-pos ref-start)) | 2351 (setq sgml-rs-ignore-pos ref-start)) |
2306 (unless (and sgml-scratch-buffer | 2352 (unless (and sgml-scratch-buffer |
2307 (buffer-name sgml-scratch-buffer)) | 2353 (buffer-name sgml-scratch-buffer)) |
2308 (setq sgml-scratch-buffer (generate-new-buffer " *entity*"))) | 2354 (setq sgml-scratch-buffer (generate-new-buffer " *entity*"))) |
2309 (let ((cb (current-buffer)) | 2355 (let ((cb (current-buffer)) |
2313 (sgml-make-entity entity nil nil) | 2359 (sgml-make-entity entity nil nil) |
2314 entity) | 2360 entity) |
2315 (sgml-epos (or ref-start (point))) | 2361 (sgml-epos (or ref-start (point))) |
2316 (sgml-epos (point))))) | 2362 (sgml-epos (point))))) |
2317 (set-buffer sgml-scratch-buffer) | 2363 (set-buffer sgml-scratch-buffer) |
2364 ;; For MULE to not misinterpret binary data set the mc-flag | |
2365 ;; (reported by Jeffrey Friedl <jfriedl@nff.ncl.omron.co.jp>) | |
2366 (setq mc-flag nil) | |
2367 ;; For XEmacs 20.0/Mule | |
2368 (setq file-coding-system 'noconv) | |
2318 (when (eq sgml-scratch-buffer (default-value 'sgml-scratch-buffer)) | 2369 (when (eq sgml-scratch-buffer (default-value 'sgml-scratch-buffer)) |
2319 (make-local-variable 'sgml-scratch-buffer) | 2370 (make-local-variable 'sgml-scratch-buffer) |
2320 (setq sgml-scratch-buffer nil)) | 2371 (setq sgml-scratch-buffer nil)) |
2372 (when after-change-function ;*** | |
2373 (message "OOPS: after-change-function not NIL in scratch buffer %s: %s" | |
2374 (current-buffer) | |
2375 after-change-function) | |
2376 (setq before-change-function nil | |
2377 after-change-function nil)) | |
2321 (setq sgml-last-entity-buffer (current-buffer)) | 2378 (setq sgml-last-entity-buffer (current-buffer)) |
2322 (erase-buffer) | 2379 (erase-buffer) |
2323 (setq default-directory dd) | 2380 (setq default-directory dd) |
2324 (make-local-variable 'sgml-current-eref) | 2381 (make-local-variable 'sgml-current-eref) |
2325 (setq sgml-current-eref eref) | 2382 (setq sgml-current-eref eref) |
2330 ; as #RS if internal entity. | 2387 ; as #RS if internal entity. |
2331 (if (or (stringp entity) | 2388 (if (or (stringp entity) |
2332 (stringp (sgml-entity-text entity))) | 2389 (stringp (sgml-entity-text entity))) |
2333 (point) | 2390 (point) |
2334 0)) | 2391 0)) |
2392 (when sgml-buffer-parse-state | |
2393 (sgml-debug "-- pstate set in scratch buffer") | |
2394 (setq sgml-buffer-parse-state nil)) | |
2335 (cond | 2395 (cond |
2336 ((stringp entity) ; a file name | 2396 ((stringp entity) ; a file name |
2337 (save-excursion (insert-file-contents entity)) | 2397 (save-excursion (insert-file-contents entity)) |
2338 (setq default-directory (file-name-directory entity))) | 2398 (setq default-directory (file-name-directory entity))) |
2339 ((and sgml-parsing-dtd | 2399 ((consp (sgml-entity-text entity)) ; external id? |
2340 (consp (sgml-entity-text entity))) ; external id? | 2400 (let* ((extid (sgml-entity-text entity)) |
2341 (let ((file (sgml-entity-file entity type))) | 2401 (file |
2342 (sgml-debug "Push to %s = %s" (sgml-entity-text entity) file) | 2402 (sgml-external-file extid |
2403 (or type (sgml-entity-type entity)) | |
2404 (sgml-entity-name entity)))) | |
2405 (when sgml-parsing-dtd | |
2406 (push (or file t) | |
2407 (sgml-dtd-dependencies sgml-dtd-info))) | |
2408 (sgml-debug "Push to %s = %s" extid file) | |
2343 (cond | 2409 (cond |
2344 ((and file | 2410 ((and file sgml-parsing-dtd |
2345 (sgml-try-merge-compiled-dtd (car (sgml-entity-text entity)) | 2411 (sgml-try-merge-compiled-dtd (sgml-extid-pubid extid) |
2346 file)) | 2412 file)) |
2347 (goto-char (point-max))) | 2413 (goto-char (point-max))) |
2348 (file | 2414 (file |
2349 ;; fifth arg not available in early v19 | 2415 ;; fifth arg not available in early v19 |
2350 (erase-buffer) | 2416 (erase-buffer) |
2351 (insert-file-contents file nil nil nil) | 2417 (insert-file-contents file nil nil nil) |
2352 (setq default-directory (file-name-directory file)) | 2418 (setq default-directory (file-name-directory file)) |
2353 (goto-char (point-min)) | 2419 (goto-char (point-min))) |
2354 (push file (sgml-dtd-dependencies sgml-dtd-info))) | 2420 (t ;; No file for entity |
2355 (t | 2421 (save-excursion |
2356 (push t (sgml-dtd-dependencies sgml-dtd-info)) | 2422 (let* ((pubid (sgml-extid-pubid extid)) |
2357 (save-excursion (sgml-entity-insert-text entity type)))))) | 2423 (sysid (sgml-extid-sysid extid))) |
2358 (t | 2424 (or (if sysid ; try the sysid hooks |
2359 (save-excursion (sgml-entity-insert-text entity type)))))) | 2425 (loop for fn in sgml-sysid-resolve-functions |
2426 thereis (funcall fn sysid))) | |
2427 (progn | |
2428 ;; Mark entity as not found | |
2429 (setcdr (cddr entity) t) ;*** | |
2430 (sgml-log-warning "External entity %s not found" | |
2431 (sgml-entity-name entity)) | |
2432 (when pubid | |
2433 (sgml-log-warning " Public identifier %s" pubid)) | |
2434 (when sysid | |
2435 (sgml-log-warning " System identfier %s" sysid)) | |
2436 nil)))))))) | |
2437 (t ;; internal entity | |
2438 (save-excursion | |
2439 (insert (sgml-entity-text entity))))))) | |
2360 | 2440 |
2361 (defun sgml-pop-entity () | 2441 (defun sgml-pop-entity () |
2362 (cond ((and (boundp 'sgml-previous-buffer) | 2442 (cond ((and (boundp 'sgml-previous-buffer) |
2363 (bufferp sgml-previous-buffer)) | 2443 (bufferp sgml-previous-buffer)) |
2364 (sgml-debug "Exit entity") | 2444 (sgml-debug "Exit entity") |
2409 (:constructor sgml-make-tree | 2489 (:constructor sgml-make-tree |
2410 (eltype stag-epos stag-len parent level | 2490 (eltype stag-epos stag-len parent level |
2411 excludes includes pstate net-enabled | 2491 excludes includes pstate net-enabled |
2412 conref &optional shortmap pshortmap asl))) | 2492 conref &optional shortmap pshortmap asl))) |
2413 eltype ; element object | 2493 eltype ; element object |
2414 ;;start ; start point in buffer | 2494 ;;start ; start point in buffer |
2415 ;;end ; end point in buffer | 2495 ;;end ; end point in buffer |
2416 stag-epos ; start-tag entity position | 2496 stag-epos ; start-tag entity position |
2417 etag-epos ; end-tag entity position | 2497 etag-epos ; end-tag entity position |
2418 stag-len ; length of start-tag | 2498 stag-len ; length of start-tag |
2419 etag-len ; length of end-tag | 2499 etag-len ; length of end-tag |
2431 pshortmap ; parents shortmap | 2511 pshortmap ; parents shortmap |
2432 asl ; attribute specification list | 2512 asl ; attribute specification list |
2433 ) | 2513 ) |
2434 | 2514 |
2435 | 2515 |
2436 ;;element-end (e): | |
2437 ;; If bpos-p (etag-epos (e)): | |
2438 ;; return etag-epos (e) + etag-len (e) | |
2439 ;; If etag-len (e) = 0: return promote (etag-epos (e)) | |
2440 ;; else: return latest (etag-epos (e)) | |
2441 (defun sgml-tree-end (tree) | 2516 (defun sgml-tree-end (tree) |
2442 "Buffer position after end of TREE" | 2517 "Buffer position after end of TREE." |
2443 (let ((epos (sgml-tree-etag-epos tree)) | 2518 (let ((epos (sgml-tree-etag-epos tree)) |
2444 (len (sgml-tree-etag-len tree))) | 2519 (len (sgml-tree-etag-len tree))) |
2445 (cond ((sgml-bpos-p epos) | 2520 (cond ((sgml-bpos-p epos) |
2446 (+ epos len)) | 2521 (+ epos len)) |
2447 ((zerop len) | 2522 ((zerop len) |
2448 (sgml-epos-promote epos)) | 2523 (sgml-epos-promote epos)) |
2449 (t | 2524 (t |
2450 (sgml-epos-latest epos))))) | 2525 (sgml-epos-after epos))))) |
2451 | 2526 |
2452 | 2527 |
2453 ;;;; (text) Element view of parse tree | 2528 ;;;; (text) Element view of parse tree |
2454 | 2529 |
2455 (defmacro sgml-alias-fields (orig dest &rest fields) | 2530 (defmacro sgml-alias-fields (orig dest &rest fields) |
2530 (cond ((sgml-bpos-p epos) | 2605 (cond ((sgml-bpos-p epos) |
2531 (+ epos len)) | 2606 (+ epos len)) |
2532 ((zerop len) | 2607 ((zerop len) |
2533 (sgml-epos-promote epos)) | 2608 (sgml-epos-promote epos)) |
2534 (t | 2609 (t |
2535 (sgml-epos-latest epos))))) | 2610 (sgml-epos-after epos))))) |
2536 | 2611 |
2537 (defun sgml-element-empty (element) | 2612 (defun sgml-element-empty (element) |
2538 "True if ELEMENT is empty." | 2613 "True if ELEMENT is empty." |
2539 (or (eq sgml-empty (sgml-element-model element)) | 2614 (or (eq sgml-empty (sgml-element-model element)) |
2540 (sgml-tree-conref element))) | 2615 (sgml-tree-conref element))) |
2565 (if (memq this-command '(backward-char previous-line backward-word)) | 2640 (if (memq this-command '(backward-char previous-line backward-word)) |
2566 (goto-char (or (previous-single-property-change (point) 'invisible) | 2641 (goto-char (or (previous-single-property-change (point) 'invisible) |
2567 (point-min))) | 2642 (point-min))) |
2568 (goto-char (or (next-single-property-change (point) 'invisible) | 2643 (goto-char (or (next-single-property-change (point) 'invisible) |
2569 (point-max))))) | 2644 (point-max))))) |
2570 (when (and (not (input-pending-p)) | 2645 (when (and (not executing-macro) |
2571 (or sgml-live-element-indicator | 2646 (or sgml-live-element-indicator |
2572 sgml-set-face)) | 2647 sgml-set-face) |
2573 (let ((deactivate-mark nil) | 2648 (not (null sgml-buffer-parse-state)) |
2574 (sgml-suppress-warning t) | 2649 (sit-for 0)) |
2575 (oldname sgml-current-element-name)) | 2650 (let ((deactivate-mark nil)) |
2576 (condition-case nil | 2651 (sgml-need-dtd) |
2577 (save-excursion | 2652 (let ((start |
2653 (save-excursion (sgml-find-start-point (point)) | |
2654 (sgml-pop-all-entities) | |
2655 (point))) | |
2656 (eol-pos | |
2657 (save-excursion (end-of-line 1) (point)))) | |
2658 (let ((quiet (< (- (point) start) 500))) | |
2659 ;;(message "Should parse %s to %s => %s" start (point) quiet) | |
2660 (when (if quiet | |
2661 t | |
2662 (setq sgml-current-element-name "?") | |
2663 (sit-for 1)) | |
2664 | |
2665 ;; Find current element | |
2578 (cond ((and (memq this-command sgml-users-of-last-element) | 2666 (cond ((and (memq this-command sgml-users-of-last-element) |
2579 sgml-last-element) | 2667 sgml-last-element) |
2580 (setq sgml-current-element-name | 2668 (setq sgml-current-element-name |
2581 (sgml-element-gi sgml-last-element))) | 2669 (sgml-element-gi sgml-last-element))) |
2582 | |
2583 (sgml-live-element-indicator | 2670 (sgml-live-element-indicator |
2584 (setq sgml-current-element-name "*error*") | |
2585 (save-excursion | 2671 (save-excursion |
2586 (sgml-parse-to (point) (function input-pending-p))) | 2672 (condition-case nil |
2587 (unless (input-pending-p) | 2673 (sgml-parse-to |
2588 (setq sgml-current-element-name | 2674 (point) (function input-pending-p) quiet) |
2589 (sgml-element-gi sgml-current-tree))))) | 2675 (error |
2590 (unless (input-pending-p) | 2676 (setq sgml-current-element-name "*error*"))) |
2591 (force-mode-line-update) | 2677 (unless (input-pending-p) |
2592 (when (and sgml-set-face | 2678 (setq sgml-current-element-name |
2593 (null | 2679 (sgml-element-gi sgml-current-tree)))))) |
2594 (sgml-tree-etag-epos | 2680 ;; Set face on current line |
2595 (sgml-pstate-top-tree sgml-buffer-parse-state)))) | 2681 (when (and sgml-set-face (not (input-pending-p))) |
2596 (sit-for 0) | 2682 (save-excursion |
2597 (sgml-parse-until-end-of nil nil | 2683 (condition-case nil |
2598 (function input-pending-p) | 2684 (sgml-parse-to |
2599 t)))) | 2685 eol-pos (function input-pending-p) quiet) |
2600 (error nil)))))) | 2686 (error nil))))))) |
2601 | 2687 ;; Set face in rest of buffer |
2688 (sgml-fontify-buffer 6) ;*** make option for delay | |
2689 )))) | |
2690 | |
2691 (defun sgml-fontify-buffer (delay) | |
2692 (and | |
2693 sgml-set-face | |
2694 (null (sgml-tree-etag-epos | |
2695 (sgml-pstate-top-tree sgml-buffer-parse-state))) | |
2696 (sit-for delay) | |
2697 (condition-case nil | |
2698 (save-excursion | |
2699 (message "Fontifying...") | |
2700 (sgml-parse-until-end-of nil nil | |
2701 (function input-pending-p) | |
2702 t) | |
2703 (message "Fontifying...done")) | |
2704 (error nil)))) | |
2602 | 2705 |
2603 (defun sgml-set-active-dtd-indicator (name) | 2706 (defun sgml-set-active-dtd-indicator (name) |
2604 (set (make-local-variable 'sgml-active-dtd-indicator) | 2707 (set (make-local-variable 'sgml-active-dtd-indicator) |
2605 (list (format " [%s" name) | 2708 (list (format " [%s" name) |
2606 '(sgml-live-element-indicator ("/" sgml-current-element-name)) | 2709 '(sgml-live-element-indicator ("/" sgml-current-element-name)) |
2612 (defstruct (sgml-pstate | 2715 (defstruct (sgml-pstate |
2613 (:constructor sgml-make-pstate (dtd top-tree))) | 2716 (:constructor sgml-make-pstate (dtd top-tree))) |
2614 dtd | 2717 dtd |
2615 top-tree) | 2718 top-tree) |
2616 | 2719 |
2617 (defsubst sgml-excludes () | 2720 ;(defsubst sgml-excludes () |
2618 (sgml-tree-excludes sgml-current-tree)) | 2721 ; (sgml-tree-excludes sgml-current-tree)) |
2619 | 2722 |
2620 (defsubst sgml-includes () | 2723 ;(defsubst sgml-includes () |
2621 (sgml-tree-includes sgml-current-tree)) | 2724 ; (sgml-tree-includes sgml-current-tree)) |
2622 | 2725 |
2623 (defsubst sgml-current-mixed-p () | 2726 (defsubst sgml-current-mixed-p () |
2624 (sgml-element-mixed sgml-current-tree)) | 2727 (sgml-element-mixed sgml-current-tree)) |
2625 | 2728 |
2626 (defun sgml-set-initial-state (dtd) | 2729 (defun sgml-set-initial-state (dtd) |
2627 "Set initial state of parsing" | 2730 "Set initial state of parsing" |
2628 (make-local-variable 'before-change-function) | 2731 (make-local-variable 'before-change-function) |
2629 (setq before-change-function 'sgml-note-change-at) | 2732 (setq before-change-function 'sgml-note-change-at) |
2630 (set (make-local-variable 'after-change-function) | 2733 (make-local-variable 'after-change-function) |
2631 'sgml-set-face-after-change) | 2734 (setq after-change-function 'sgml-set-face-after-change) |
2632 (sgml-set-active-dtd-indicator (sgml-dtd-doctype dtd)) | 2735 (sgml-set-active-dtd-indicator (sgml-dtd-doctype dtd)) |
2633 (let ((top-type ; Fake element type for the top | 2736 (let ((top-type ; Fake element type for the top |
2634 ; node of the parse tree | 2737 ; node of the parse tree |
2635 (sgml-make-eltype "#DOC") ; was "Document (no element)" | 2738 (sgml-make-eltype "#DOC") ; was "Document (no element)" |
2636 )) | 2739 )) |
2645 | 2748 |
2646 (defun sgml-set-parse-state (tree where) | 2749 (defun sgml-set-parse-state (tree where) |
2647 "Set parse state from TREE, either from start of TREE if WHERE is start | 2750 "Set parse state from TREE, either from start of TREE if WHERE is start |
2648 or from after TREE if WHERE is after." | 2751 or from after TREE if WHERE is after." |
2649 (setq sgml-current-tree tree | 2752 (setq sgml-current-tree tree |
2650 sgml-markup-tree tree) | 2753 sgml-markup-tree tree |
2754 sgml-rs-ignore-pos 0 ) | |
2651 (let ((empty | 2755 (let ((empty |
2652 (sgml-element-empty tree))) | 2756 (sgml-element-empty tree))) |
2653 (cond ((and (eq where 'start) | 2757 (cond ((and (eq where 'start) |
2654 (not empty)) | 2758 (not empty)) |
2655 (setq sgml-current-state (sgml-element-model sgml-current-tree) | 2759 (setq sgml-current-state (sgml-element-model sgml-current-tree) |
2731 eltype | 2835 eltype |
2732 (sgml-promoted-epos before-tag after-tag) ; stag-epos | 2836 (sgml-promoted-epos before-tag after-tag) ; stag-epos |
2733 (- after-tag before-tag) ; stag-len | 2837 (- after-tag before-tag) ; stag-len |
2734 sgml-current-tree ; parent | 2838 sgml-current-tree ; parent |
2735 (1+ (sgml-tree-level sgml-current-tree)) ; level | 2839 (1+ (sgml-tree-level sgml-current-tree)) ; level |
2736 (append (sgml-eltype-excludes eltype) (sgml-excludes)) | 2840 (append (sgml-eltype-excludes eltype) |
2737 (append (sgml-eltype-includes eltype) (sgml-includes)) | 2841 (sgml-tree-excludes sgml-current-tree)) |
2842 (append (sgml-eltype-includes eltype) | |
2843 (sgml-tree-includes sgml-current-tree)) | |
2738 sgml-current-state | 2844 sgml-current-state |
2739 (if (sgml-tree-net-enabled sgml-current-tree) 1) | 2845 (if (sgml-tree-net-enabled sgml-current-tree) 1) |
2740 conref | 2846 conref |
2741 newmap | 2847 newmap |
2742 sgml-current-shortmap | 2848 sgml-current-shortmap |
2750 ;; (setf (sgml-tree-next u) nt)) | 2856 ;; (setf (sgml-tree-next u) nt)) |
2751 ;; (t | 2857 ;; (t |
2752 ;; (setf (sgml-tree-content sgml-current-tree) nt)))) | 2858 ;; (setf (sgml-tree-content sgml-current-tree) nt)))) |
2753 ;; Install new node in tree | 2859 ;; Install new node in tree |
2754 (cond (sgml-previous-tree | 2860 (cond (sgml-previous-tree |
2861 (sgml-debug "Open element %s: after %s" | |
2862 eltype (sgml-tree-eltype sgml-previous-tree)) | |
2755 (setf (sgml-tree-next sgml-previous-tree) nt)) | 2863 (setf (sgml-tree-next sgml-previous-tree) nt)) |
2756 (t | 2864 (t |
2865 (sgml-debug "Open element %s: first in %s" | |
2866 eltype (sgml-tree-eltype sgml-current-tree)) | |
2757 (setf (sgml-tree-content sgml-current-tree) nt))) | 2867 (setf (sgml-tree-content sgml-current-tree) nt))) |
2758 ;; Prune tree | 2868 ;; Prune tree |
2759 ;; *** all the way up? tree-end = nil? | 2869 ;; *** all the way up? tree-end = nil? |
2760 (setf (sgml-tree-next sgml-current-tree) nil) | 2870 (setf (sgml-tree-next sgml-current-tree) nil) |
2761 ;; Set new state | 2871 ;; Set new state |
2784 (when (or (eq sgml-close-element-trap t) | 2894 (when (or (eq sgml-close-element-trap t) |
2785 (eq sgml-close-element-trap sgml-current-tree)) | 2895 (eq sgml-close-element-trap sgml-current-tree)) |
2786 (setq sgml-goal (point))) | 2896 (setq sgml-goal (point))) |
2787 (when sgml-throw-on-element-change | 2897 (when sgml-throw-on-element-change |
2788 (throw sgml-throw-on-element-change 'end)) | 2898 (throw sgml-throw-on-element-change 'end)) |
2899 (sgml-debug "Close element %s" (sgml-tree-eltype sgml-current-tree)) | |
2789 (setf (sgml-tree-etag-epos sgml-current-tree) | 2900 (setf (sgml-tree-etag-epos sgml-current-tree) |
2790 ;;(sgml-promoted-epos before-tag after-tag) | 2901 ;;(sgml-promoted-epos before-tag after-tag) |
2791 (sgml-epos before-tag)) | 2902 (sgml-epos before-tag)) |
2792 (setf (sgml-tree-etag-len sgml-current-tree) (- after-tag before-tag)) | 2903 (setf (sgml-tree-etag-len sgml-current-tree) (- after-tag before-tag)) |
2793 (run-hooks 'sgml-close-element-hook) | 2904 (run-hooks 'sgml-close-element-hook) |
2806 (sgml-tree-parent tree)) | 2917 (sgml-tree-parent tree)) |
2807 | 2918 |
2808 (defun sgml-note-change-at (at &optional end) | 2919 (defun sgml-note-change-at (at &optional end) |
2809 ;; Inform the cache that there have been some changes after AT | 2920 ;; Inform the cache that there have been some changes after AT |
2810 (when sgml-buffer-parse-state | 2921 (when sgml-buffer-parse-state |
2922 (sgml-debug "sgml-note-change-at %s" at) | |
2811 (let ((u (sgml-pstate-top-tree sgml-buffer-parse-state))) | 2923 (let ((u (sgml-pstate-top-tree sgml-buffer-parse-state))) |
2812 (when u | 2924 (when u |
2813 ;;(message "%d" at) | 2925 ;;(message "%d" at) |
2814 (while | 2926 (while |
2815 (cond | 2927 (cond |
2858 (while ; Until token accepted | 2970 (while ; Until token accepted |
2859 (cond | 2971 (cond |
2860 ;; Test if accepted in state | 2972 ;; Test if accepted in state |
2861 ((or (eq state sgml-any) | 2973 ((or (eq state sgml-any) |
2862 (and (sgml-model-group-p state) | 2974 (and (sgml-model-group-p state) |
2863 (not (memq token (sgml-excludes))) | 2975 (not (memq token (sgml-tree-excludes tree))) |
2864 (or (memq token (sgml-includes)) | 2976 (or (memq token (sgml-tree-includes tree)) |
2865 (sgml-get-move state token)))) | 2977 (sgml-get-move state token)))) |
2866 nil) | 2978 nil) |
2867 ;; Test if end tag implied | 2979 ;; Test if end tag implied |
2868 ((or (eq state sgml-empty) | 2980 ((or (eq state sgml-empty) |
2869 (and (sgml-final-p state) | 2981 (and (sgml-final-p state) |
2870 (not (eq tree sgml-top-tree)))) | 2982 (not (eq tree sgml-top-tree)))) |
2871 (unless (eq state sgml-empty) ; not realy implied | 2983 (unless (eq state sgml-empty) ; not realy implied |
2872 (push t imps)) | 2984 (push t imps)) |
2873 (setq state (sgml-tree-pstate tree) | 2985 (setq state (sgml-tree-pstate tree) |
3178 (nconc table (list (cons name map)))) | 3290 (nconc table (list (cons name map)))) |
3179 | 3291 |
3180 (defun sgml-lookup-shortref-map (table name) | 3292 (defun sgml-lookup-shortref-map (table name) |
3181 (cdr (assoc name (cdr table)))) | 3293 (cdr (assoc name (cdr table)))) |
3182 | 3294 |
3295 (defun sgml-lookup-shortref-name (table map) | |
3296 (car (rassq map (cdr table)))) | |
3297 | |
3183 (defun sgml-merge-shortmaps (tab1 tab2) | 3298 (defun sgml-merge-shortmaps (tab1 tab2) |
3184 "Merge tables of short reference maps TAB2 into TAB1, modifying TAB1." | 3299 "Merge tables of short reference maps TAB2 into TAB1, modifying TAB1." |
3185 (nconc tab1 (cdr tab2))) | 3300 (nconc tab1 (cdr tab2))) |
3186 | 3301 |
3187 ;;;; Parse markup declarations | 3302 ;;;; Parse markup declarations |
3222 (sgml-setup-doctype (sgml-check-name) | 3337 (sgml-setup-doctype (sgml-check-name) |
3223 (sgml-parse-external)) | 3338 (sgml-parse-external)) |
3224 (message "Parsing doctype...done")))) | 3339 (message "Parsing doctype...done")))) |
3225 (setq sgml-markup-type 'doctype)) | 3340 (setq sgml-markup-type 'doctype)) |
3226 | 3341 |
3342 (defun sgml-check-end-of-entity (type) | |
3343 (unless (eobp) | |
3344 (sgml-parse-error "Illegal character '%c' in %s" | |
3345 (following-char) | |
3346 type))) | |
3347 | |
3227 (defun sgml-setup-doctype (docname external) | 3348 (defun sgml-setup-doctype (docname external) |
3228 (let ((sgml-parsing-dtd t)) | 3349 (let ((sgml-parsing-dtd t)) |
3229 (setq sgml-no-elements 0) | 3350 (setq sgml-no-elements 0) |
3230 (setq sgml-dtd-info (sgml-make-dtd docname)) | 3351 (setq sgml-dtd-info (sgml-make-dtd docname)) |
3231 ;;(setq sgml-dtd-shortmaps nil) | 3352 ;;(setq sgml-dtd-shortmaps nil) |
3232 (sgml-skip-ps) | 3353 (sgml-skip-ps) |
3233 (cond | 3354 (cond |
3234 ((sgml-parse-delim "DSO") | 3355 ((sgml-parse-delim "DSO") |
3235 (sgml-check-dtd-subset) | 3356 (let ((original-buffer (current-buffer))) |
3236 (sgml-check-delim "DSC"))) | 3357 (sgml-check-dtd-subset) |
3358 (if (eq (current-buffer) original-buffer) | |
3359 (sgml-check-delim "DSC") | |
3360 (sgml-parse-error "Illegal character '%c' in doctype declaration" | |
3361 (following-char)))))) | |
3237 (cond (external | 3362 (cond (external |
3238 (sgml-push-to-entity (sgml-make-entity docname 'dtd external)) | 3363 (sgml-push-to-entity (sgml-make-entity docname 'dtd external)) |
3239 (unless (eobp) | 3364 (sgml-check-dtd-subset) |
3240 (sgml-check-dtd-subset) | 3365 (sgml-check-end-of-entity "DTD subset") |
3241 (unless (eobp) | |
3242 (sgml-parse-error "DTD subset ended"))) | |
3243 (sgml-pop-entity))) | 3366 (sgml-pop-entity))) |
3244 ;;; (loop for map in sgml-dtd-shortmaps do | 3367 ;;; (loop for map in sgml-dtd-shortmaps do |
3245 ;;; (sgml-add-shortref-map | 3368 ;;; (sgml-add-shortref-map |
3246 ;;; (sgml-dtd-shortmaps sgml-dtd-info) | 3369 ;;; (sgml-dtd-shortmaps sgml-dtd-info) |
3247 ;;; (car map) | 3370 ;;; (car map) |
3314 ;;(search-forward "[") | 3437 ;;(search-forward "[") |
3315 (sgml-skip-marked-section)) | 3438 (sgml-skip-marked-section)) |
3316 (t (forward-char 1))))) | 3439 (t (forward-char 1))))) |
3317 | 3440 |
3318 (defun sgml-do-usemap () | 3441 (defun sgml-do-usemap () |
3319 (let (mapname associated) | 3442 (let (mapname) |
3320 ;;(setq sgml-markup-type 'usemap) | 3443 ;;(setq sgml-markup-type 'usemap) |
3321 (unless (sgml-parse-rni "empty") | 3444 (unless (sgml-parse-rni "empty") |
3322 (setq mapname (sgml-check-name))) | 3445 (setq mapname (sgml-check-name))) |
3323 (sgml-skip-ps) | 3446 (sgml-skip-ps) |
3324 (cond | 3447 (cond |
3474 ;; trap is used the parser is usually called with the end of the | 3597 ;; trap is used the parser is usually called with the end of the |
3475 ;; buffer as the goal point. | 3598 ;; buffer as the goal point. |
3476 | 3599 |
3477 (defun sgml-need-dtd () | 3600 (defun sgml-need-dtd () |
3478 "Make sure that an eventual DTD is parsed or loaded." | 3601 "Make sure that an eventual DTD is parsed or loaded." |
3602 (sgml-pop-all-entities) | |
3479 (sgml-cleanup-entities) | 3603 (sgml-cleanup-entities) |
3480 (when (null sgml-buffer-parse-state) ; first parse in this buffer | 3604 (when (null sgml-buffer-parse-state) ; first parse in this buffer |
3481 ;;(sgml-set-initial-state) ; fall back DTD | 3605 ;;(sgml-set-initial-state) ; fall back DTD |
3482 (add-hook 'pre-command-hook 'sgml-reset-log) | 3606 (add-hook 'pre-command-hook 'sgml-reset-log) |
3483 (make-local-variable 'sgml-auto-fill-inhibit-function) | 3607 (make-local-variable 'sgml-auto-fill-inhibit-function) |
3484 (setq sgml-auto-fill-inhibit-function (function sgml-in-prolog-p)) | 3608 (setq sgml-auto-fill-inhibit-function (function sgml-in-prolog-p)) |
3485 (if sgml-default-dtd-file | 3609 (if sgml-default-dtd-file |
3486 (sgml-load-dtd sgml-default-dtd-file) | 3610 (sgml-load-dtd sgml-default-dtd-file) |
3487 (sgml-load-doctype))) | 3611 (sgml-load-doctype))) |
3612 (sgml-debug "Need dtd getting state from %s" (buffer-name)) | |
3488 (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state) | 3613 (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state) |
3489 sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state)) | 3614 sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state)) |
3490 (sgml-set-global)) | 3615 (sgml-set-global)) |
3491 | 3616 |
3492 | 3617 |
3513 | 3638 |
3514 (defun sgml-modify-dtd (modifier) | 3639 (defun sgml-modify-dtd (modifier) |
3515 (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state) | 3640 (setq sgml-dtd-info (sgml-pstate-dtd sgml-buffer-parse-state) |
3516 sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state)) | 3641 sgml-top-tree (sgml-pstate-top-tree sgml-buffer-parse-state)) |
3517 (sgml-set-global) | 3642 (sgml-set-global) |
3518 | 3643 ;;*** what is sgml-current-tree now? |
3519 (while (stringp (cadr modifier)) ; Loop thru the context elements | 3644 (while (stringp (cadr modifier)) ; Loop thru the context elements |
3520 (let ((et (sgml-lookup-eltype (car modifier)))) | 3645 (let ((et (sgml-lookup-eltype (car modifier)))) |
3521 (sgml-open-element et nil (point-min) (point-min)) | 3646 (sgml-open-element et nil (point-min) (point-min)) |
3522 (setq modifier (cdr modifier)))) | 3647 (setq modifier (cdr modifier)))) |
3523 | 3648 |
3539 do (setq sgml-current-state | 3664 do (setq sgml-current-state |
3540 (sgml-get-move sgml-current-state | 3665 (sgml-get-move sgml-current-state |
3541 (sgml-lookup-eltype seenel)))))) | 3666 (sgml-lookup-eltype seenel)))))) |
3542 | 3667 |
3543 (let ((top (sgml-pstate-top-tree sgml-buffer-parse-state))) | 3668 (let ((top (sgml-pstate-top-tree sgml-buffer-parse-state))) |
3544 (setf (sgml-tree-includes top) (sgml-includes)) | 3669 (setf (sgml-tree-includes top) (sgml-tree-includes sgml-current-tree)) |
3545 (setf (sgml-tree-excludes top) (sgml-excludes)) | 3670 (setf (sgml-tree-excludes top) (sgml-tree-excludes sgml-current-tree)) |
3546 (setf (sgml-tree-shortmap top) sgml-current-shortmap) | 3671 (setf (sgml-tree-shortmap top) sgml-current-shortmap) |
3547 (setf (sgml-eltype-model (sgml-tree-eltype top)) | 3672 (setf (sgml-eltype-model (sgml-tree-eltype top)) |
3548 sgml-current-state))) | 3673 sgml-current-state))) |
3549 | 3674 |
3550 | 3675 |
3551 (defun sgml-set-global () | 3676 (defun sgml-set-global () |
3552 (setq sgml-current-omittag sgml-omittag | 3677 (setq sgml-current-omittag sgml-omittag |
3553 sgml-current-shorttag sgml-shorttag | 3678 sgml-current-shorttag sgml-shorttag |
3554 sgml-current-localcat sgml-local-catalogs | 3679 sgml-current-localcat sgml-local-catalogs |
3555 sgml-current-local-ecat sgml-local-ecat-files)) | 3680 sgml-current-local-ecat sgml-local-ecat-files |
3681 sgml-current-top-buffer (current-buffer))) | |
3556 | 3682 |
3557 (defun sgml-parse-prolog () | 3683 (defun sgml-parse-prolog () |
3558 "Parse the document prolog to learn the DTD." | 3684 "Parse the document prolog to learn the DTD." |
3559 (interactive) | 3685 (interactive) |
3560 (sgml-clear-log) | 3686 (sgml-debug "Parse prolog in buffer %s" (buffer-name)) |
3687 (unless sgml-debug | |
3688 (sgml-clear-log)) | |
3561 (message "Parsing prolog...") | 3689 (message "Parsing prolog...") |
3562 (sgml-cleanup-entities) | 3690 (sgml-cleanup-entities) |
3563 (sgml-set-global) | 3691 (sgml-set-global) |
3564 (setq sgml-dtd-info nil) | 3692 (setq sgml-dtd-info nil) |
3565 (goto-char (point-min)) | 3693 (goto-char (point-min)) |
3576 (sgml-setup-doctype docname '(nil)))))) | 3704 (sgml-setup-doctype docname '(nil)))))) |
3577 (unless sgml-dtd-info | 3705 (unless sgml-dtd-info |
3578 (error "No document type defined by prolog")) | 3706 (error "No document type defined by prolog")) |
3579 (sgml-message "Parsing prolog...done")) | 3707 (sgml-message "Parsing prolog...done")) |
3580 | 3708 |
3709 | |
3581 (defun sgml-parse-until-end-of (sgml-close-element-trap &optional | 3710 (defun sgml-parse-until-end-of (sgml-close-element-trap &optional |
3582 cont extra-cond quiet) | 3711 cont extra-cond quiet) |
3583 "Parse until the SGML-CLOSE-ELEMENT-TRAP has ended, | 3712 "Parse until the SGML-CLOSE-ELEMENT-TRAP has ended, |
3584 or if it is t, any additional element has ended, | 3713 or if it is t, any additional element has ended, |
3585 or if nil, until end of buffer." | 3714 or if nil, until end of buffer." |
3598 "Parse until (at least) SGML-GOAL. | 3727 "Parse until (at least) SGML-GOAL. |
3599 Optional argument EXTRA-COND should be a function. This function is | 3728 Optional argument EXTRA-COND should be a function. This function is |
3600 called in the parser loop, and the loop is exited if the function returns t. | 3729 called in the parser loop, and the loop is exited if the function returns t. |
3601 If third argument QUIT is non-nil, no \"Parsing...\" message will be displayed." | 3730 If third argument QUIT is non-nil, no \"Parsing...\" message will be displayed." |
3602 (sgml-need-dtd) | 3731 (sgml-need-dtd) |
3732 | |
3733 (unless before-change-function | |
3734 (message "WARN: before-change-function has been lost, restoring (%s)" | |
3735 (current-buffer)) | |
3736 (setq before-change-function 'sgml-note-change-at) | |
3737 (setq after-change-function 'sgml-set-face-after-change) | |
3738 ) | |
3739 | |
3603 (sgml-find-start-point (min sgml-goal (point-max))) | 3740 (sgml-find-start-point (min sgml-goal (point-max))) |
3604 (assert sgml-current-tree) | 3741 (assert sgml-current-tree) |
3605 (let ((bigparse (and (not quiet) (> (- sgml-goal (point)) 10000)))) | 3742 (let ((bigparse (and (not quiet) (> (- sgml-goal (point)) 10000)))) |
3606 (when bigparse | 3743 (when bigparse |
3607 (sgml-message "Parsing...")) | 3744 (sgml-message "Parsing...")) |
3608 (sgml-with-parser-syntax | 3745 (sgml-with-parser-syntax |
3609 (sgml-parser-loop extra-cond)) | 3746 (sgml-parser-loop extra-cond)) |
3610 (when bigparse | 3747 (when bigparse |
3611 (sgml-message "")))) | 3748 (sgml-message "")))) |
3612 | 3749 |
3613 (defun sgml-parse-continue (sgml-goal) | 3750 (defun sgml-parse-continue (sgml-goal &optional extra-cond quiet) |
3614 "Parse until (at least) SGML-GOAL." | 3751 "Parse until (at least) SGML-GOAL." |
3615 (assert sgml-current-tree) | 3752 (assert sgml-current-tree) |
3616 (sgml-message "Parsing...") | 3753 (unless quiet |
3754 (sgml-message "Parsing...")) | |
3617 (sgml-with-parser-syntax | 3755 (sgml-with-parser-syntax |
3618 (sgml-parser-loop nil)) | 3756 (sgml-parser-loop extra-cond)) |
3619 (sgml-message "")) | 3757 (unless quiet |
3758 (sgml-message ""))) | |
3620 | 3759 |
3621 (defun sgml-reparse-buffer (shortref-fun) | 3760 (defun sgml-reparse-buffer (shortref-fun) |
3622 "Reparse the buffer and let SHORTREF-FUN take care of short references. | 3761 "Reparse the buffer and let SHORTREF-FUN take care of short references. |
3623 SHORTREF-FUN is called with the entity as argument and `sgml-markup-start' | 3762 SHORTREF-FUN is called with the entity as argument and `sgml-markup-start' |
3624 pointing to start of short ref and point pointing to the end." | 3763 pointing to start of short ref and point pointing to the end." |
3703 (eq (point) | 3842 (eq (point) |
3704 sgml-rs-ignore-pos))) | 3843 sgml-rs-ignore-pos))) |
3705 ;; Restore position, to consider the delim for S+ or data | 3844 ;; Restore position, to consider the delim for S+ or data |
3706 (progn (goto-char sgml-markup-start) | 3845 (progn (goto-char sgml-markup-start) |
3707 nil))) | 3846 nil))) |
3708 (setq sgml-rs-ignore-pos (point)) | 3847 (setq sgml-rs-ignore-pos sgml-markup-start) ; don't reconsider RS |
3709 (funcall sgml-shortref-handler tem)) | 3848 (funcall sgml-shortref-handler tem)) |
3710 ((and (not (sgml-current-mixed-p)) | 3849 ((and (not (sgml-current-mixed-p)) |
3711 (sgml-parse-s sgml-current-shortmap))) | 3850 (sgml-parse-s sgml-current-shortmap))) |
3712 ((or (sgml-parse-delim "ETAGO" gi) | 3851 ((or (sgml-parse-delim "ETAGO" gi) |
3713 (sgml-is-enabled-net)) | 3852 (sgml-is-enabled-net)) |
3729 (defun sgml-do-start-tag () | 3868 (defun sgml-do-start-tag () |
3730 ;; Assume point after STAGO | 3869 ;; Assume point after STAGO |
3731 (when sgml-throw-on-element-change | 3870 (when sgml-throw-on-element-change |
3732 (throw sgml-throw-on-element-change 'start)) | 3871 (throw sgml-throw-on-element-change 'start)) |
3733 (setq sgml-conref-flag nil) | 3872 (setq sgml-conref-flag nil) |
3734 (let (temp net-enabled et asl) | 3873 (let (net-enabled et asl) |
3735 (setq et (if (sgml-is-delim "TAGC") ; empty start-tag | 3874 (setq et (if (sgml-is-delim "TAGC") ; empty start-tag |
3736 (sgml-do-empty-start-tag) | 3875 (sgml-do-empty-start-tag) |
3737 (sgml-lookup-eltype (sgml-check-name)))) | 3876 (sgml-lookup-eltype (sgml-check-name)))) |
3738 (unless (sgml-parse-delim "TAGC") ; optimize common case | 3877 (unless (sgml-parse-delim "TAGC") ; optimize common case |
3739 (setq asl (sgml-parse-attribute-specification-list et)) | 3878 (setq asl (sgml-parse-attribute-specification-list et)) |
3837 sgml-markup-start sgml-markup-start))) | 3976 sgml-markup-start sgml-markup-start))) |
3838 (sgml-close-element sgml-markup-start (point))))) | 3977 (sgml-close-element sgml-markup-start (point))))) |
3839 | 3978 |
3840 (defun sgml-is-goal-after-start (goal tree) | 3979 (defun sgml-is-goal-after-start (goal tree) |
3841 (and tree | 3980 (and tree |
3842 ;;(not (zerop (sgml-tree-stag-len tree))) | 3981 (if (sgml-bpos-p (sgml-tree-stag-epos tree)) |
3843 (> goal (sgml-element-start tree)))) | 3982 (> goal (sgml-tree-stag-epos tree)) |
3983 (>= goal (sgml-epos-after (sgml-tree-stag-epos tree)))))) | |
3844 | 3984 |
3845 (defun sgml-find-start-point (goal) | 3985 (defun sgml-find-start-point (goal) |
3846 (let ((u sgml-top-tree)) | 3986 (let ((u sgml-top-tree)) |
3847 (while | 3987 (while |
3848 (cond | 3988 (cond |
4122 | 4262 |
4123 ;;;; Provide | 4263 ;;;; Provide |
4124 | 4264 |
4125 (provide 'psgml-parse) | 4265 (provide 'psgml-parse) |
4126 | 4266 |
4267 ;; Local variables: | |
4268 ;; byte-compile-warnings:(free-vars unresolved callargs redefine) | |
4269 ;; End: | |
4127 ;;; psgml-parse.el ends here | 4270 ;;; psgml-parse.el ends here |