[Gd-chatter] r10777 - trunk/libraries/xml-parser

turbo24prg at gwydiondylan.org turbo24prg at gwydiondylan.org
Sun Jun 4 10:23:41 CEST 2006


Author: turbo24prg
Date: Sun Jun  4 10:23:39 2006
New Revision: 10777

Added:
   trunk/libraries/xml-parser/stream-parser.dylan   (contents, props changed)
Modified:
   trunk/libraries/xml-parser/library.dylan
   trunk/libraries/xml-parser/simple-xml.dylan
   trunk/libraries/xml-parser/xml-parser.lid
Log:
Bug: 7306
* stream-parser draft


Modified: trunk/libraries/xml-parser/library.dylan
==============================================================================
--- trunk/libraries/xml-parser/library.dylan	(original)
+++ trunk/libraries/xml-parser/library.dylan	Sun Jun  4 10:23:39 2006
@@ -9,6 +9,7 @@
   use system, import: { file-system };
 
   export xml-parser,
+    xml-stream-parser,
     simple-xml,
     %productions,
     printing;
@@ -20,7 +21,7 @@
   create <document>, <element>, <node-mixin>, <attribute>, <xml>, <processing-instruction>,
     <entity-reference>, <add-parents>, <char-reference>, <comment>, <tag>,
     <char-string>, <dtd>, <internal-entity>, <external-entity>,
-    text, text-setter, name, name-setter, name-with-proper-capitalization,
+    text, text-setter, unfiltered-text, name, name-setter, name-with-proper-capitalization,
     root, char;
 
   create entity-value, attributes, attributes-setter, *dtd-paths*,
@@ -139,4 +140,16 @@
     real-name,
     start-tag;
     
-end module printing;
+end module simple-xml;
+
+define module xml-stream-parser
+  use common-dylan;
+  use common-extensions;
+  use streams;
+  use xml-parser;
+  use %productions;
+
+  export <xml-stream-parser>,
+    stream, stream-setter, parse;
+    
+end module xml-stream-parser;

Modified: trunk/libraries/xml-parser/simple-xml.dylan
==============================================================================
--- trunk/libraries/xml-parser/simple-xml.dylan	(original)
+++ trunk/libraries/xml-parser/simple-xml.dylan	Sun Jun  4 10:23:39 2006
@@ -221,11 +221,13 @@
           end, element.node-children);
 end method elements;
 
-define open generic add-element (element :: <element>, node :: <element>);
-define method add-element (element :: <element>, node :: <element>) 
+define open generic add-element (element :: <element>, node :: <xml>);
+define method add-element (element :: <element>, node :: <xml>) 
  => (res :: <element>);
   element.node-children := add(element.node-children, node);
-  node.element-parent := element;
+  if (object-class(node) = <element>)
+    node.element-parent := element;
+  end if;
   element;
 end method add-element;
 

Added: trunk/libraries/xml-parser/stream-parser.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/xml-parser/stream-parser.dylan	Sun Jun  4 10:23:39 2006
@@ -0,0 +1,93 @@
+module: xml-stream-parser
+synopsis: 
+author: 
+copyright:
+
+define class <xml-stream-parser> (<object>)
+  slot stream :: <stream>,
+    required-init-keyword: stream:;
+  slot opened-elements :: <deque> = make(<deque>);
+  slot text-buffer :: <string> = "";
+  slot tag-buffer :: <string> = "";
+  slot parsing-tag? :: <boolean> = #f;
+  slot parsing-root? :: <boolean> = #f;
+end class <xml-stream-parser>;
+
+define method parse (parser :: <xml-stream-parser>)
+  while (~ stream-at-end?(parser.stream))
+    let received = read-element(parser.stream);
+
+    dispatch(parser, received, parser.parsing-tag?, parser.parsing-root?);
+  end while;
+end method parse;
+
+define generic dispatch (parser :: <xml-stream-parser>, char :: <character>, in-tag? :: <boolean>, in-root? :: <boolean>) => ();
+
+define method dispatch (parser :: <xml-stream-parser>, char == '<', in-tag? == #f, in-root? :: <boolean>) => ();
+  parser.parsing-tag? := #t;
+  parser.tag-buffer := add!(parser.tag-buffer, char);
+end method;
+
+define method dispatch (parser :: <xml-stream-parser>, char == '<', in-tag? == #f, in-root? == #t) => ();
+///!!! signal (text)
+///??? even if only whitespaces?
+  parser.text-buffer := "";
+  next-method();
+end method;
+
+define method dispatch (parser :: <xml-stream-parser>, char :: <character>, in-tag? == #f, in-root? == #f) => ();
+  if (~ whitespace?(char))
+//!!! error (chars outside root element)
+  end if;
+end method;
+
+define method dispatch (parser :: <xml-stream-parser>, char :: <character>, in-tag? == #f, in-root? == #t) => ();
+  parser.text-buffer := add!(parser.text-buffer, char);
+end method;
+ 
+define method dispatch (parser :: <xml-stream-parser>, char :: <character>, in-tag? == #t, in-root? :: <boolean>) => ();
+  if (~ whitespace?(char))
+    parser.tag-buffer := add!(parser.tag-buffer, char);
+  end if;
+end method;
+
+define method dispatch (parser :: <xml-stream-parser>, char == '>', in-tag? == #t, in-root? :: <boolean>) => ();
+  next-method();
+
+  block (skip-next)
+    let (index, start-tag, attributes, opened-element?) = scan-start-tag(parser.tag-buffer);
+    if (start-tag)
+      if (opened-element?) push-last(parser.opened-elements, start-tag) end if;
+//!!! call handle-start-tag (start-tag, attributes, opened-element?)
+      skip-next();
+    end if;
+    
+    let (index, end-tag) = scan-end-tag(parser.tag-buffer);
+    if (end-tag)
+      if (as(<symbol>, end-tag) ~= last(parser.opened-elements))
+//!!! error (tag mismatch)
+      else
+        pop-last(parser.opened-elements);
+//!!! call handle-end-tag (end-tag)
+      end if;
+      skip-next();
+    end if;
+
+    let (index, processing-instruction) = scan-xml-decl(parser.tag-buffer);
+    if (processing-instruction)
+//!!! call handle-processing-instruction (processing-instruction)
+      skip-next();
+    end if;
+  end block;
+  parser.tag-buffer := "";
+  parser.parsing-tag? := #f;
+end method;
+
+define method whitespace? (char :: <character>) 
+ => (res :: <boolean>);
+  instance?(char, one-of('\n', '\t', '\r'))
+end method whitespace?;
+
+define method handle-tag-start (parser :: <xml-stream-parser>, name :: <symbol>, attributes :: <sequence>)
+  
+end method handle-tag-start;

Modified: trunk/libraries/xml-parser/xml-parser.lid
==============================================================================
--- trunk/libraries/xml-parser/xml-parser.lid	(original)
+++ trunk/libraries/xml-parser/xml-parser.lid	Sun Jun  4 10:23:39 2006
@@ -7,3 +7,4 @@
 	collect
 	productions
 	simple-xml
+  stream-parser



More information about the chatter mailing list