Revision history for Perl extension Embedix::ECD. + means it still needs to be done - means it's done beyond 1.00 + allow for negative indentation? (probably not) + grammar capable of detecting unknown attributes 1.00 TARGET - be able to create an object tree from a file - be able to render an object tree - grammar capable of detecting imbalanced tags + freeze the API after having discussed it w/ others who care (but I'm the only one who seems to care) + documentation should be complete + the subclasses of Embedix::ECD should begin to take on individual characteristics (because they can't all be the same). It annoys me that they are all clones of eachother. Allowed attributes should vary among different node classes for one thing. - submit to CPAN -- when is my PAUSE id coming in? (on my bday of course!) + split the constructors that rely on the parser out into a factory class. (maybe) + make an Embedix::ECD::Node class that the other node classes inherit from. The parts of Embedix::ECD that are not factory methods will be moved there. Also make a node class called Embedix::ECD::Root. + Make a Parse::Yapp-based parser? Parse::Yapp let's me provide my own lexer, so it should be significantly faster than Parse::RecDescent, and it'll be easier to do magic to get around the weird things. + need to allow "<" inside rawtext to be compatible w/ the evil version. argh! In toXML(), be sure to turn "<" and ">" bounded within tags to the entities < and > This sucks. If I can't get around this bug, at least make the Parse::RecDescent parser die when it encounters it instead of failing silently. + portmap.ecd has a mystery attribute: BUILD_REQUIRES. I think it's the same as REQUIRES. + kbd.ecd has what appears to be tags inside a multi-line help section. + newFromXML()!!! expat is really fast and kicks the shit out of this Parse::RecDescent based parser on large ECDs. 0.09 - in the grammar, made it so that single-lined attributes have their whitespace trimmed on both the left and right sides. - added a license attribute and a get/set method for it, too. this is my first significant fork away from target wizard ECDs. - added license to the ecd_v1.dtd and the @default_order array in Embedix::ECD::Util and documented the change. - use Carp; - moved unindent_and_aggregate out of the grammar and into Embedix::ECD::Util. - using the production from chipmunk@perlmonks (w/ minor modifications, I can now have '<' inside rawtext! - make unindent_and_aggregate() remove comments - added hasChildren() - added delChild() - system/base/$arch/MAKEDEV.ecd spaces are allowed in node names so I adjusted for that - CONFLICTS attribute added. - applied yy}}poV:s/=item / /{{kV:s/\$ecd->\|()//g to the documentation - in the *_size attributes, it's able to evaluate mathematical expressions, and deal w/ pairs of numbers. The first number is the base size, and the second number is the give-or-take amount. make_evaluating_getter_method() makes it possible. 0.08 Sun Dec 31 23:50:20 MST 2000 - added POD for bin/ecd2xml - fixed a spacing bug and overzealous lc() bug in toXML() - enforced existence of name attribute to new constructor - changed getNodeType() to getNodeClass() to make the naming consistent with the schema used by Embedix::DB::Pg. - rename XMLWriter.pm to XMLv1.pm. There will hopefully be an XMLv2.pm in the near future w/ nicer semantics. There may even be an XMLv3.pm if I stick around long enough... or not... who knows? - fixed some bugs in bin/ecd2xml. This is the first time that my own documentation helped me find a bug. ecd2xml had still been using the obsoleted XMLWriter.pm, and I was wondering why my changes in XMLv1.pm weren't taking effect. I read my own man page for ecd2xml, and sure enough, I had documented that Embedix::ECD::XMLWriter was one of my requirements. hehe. 0.07 Wed Dec 6 23:11:29 MST 2000 - The grammar was simplified and also made capable of detecting imbalanced tags. This means that the parser will die when an error is detected so be sure to wrap calls to the constructors around an eval block. - wrote documentation regarding these new error messages. - added n() which is an alias for getChild(). I think they should have disallowed "-" from node names. - added Embedix::ECD::XMLWriter -- much work needs to be done. - write tests for rendering - newFromCons() and grammar changed such that nodes are returned as a pair in an arrayref. Everything still works the same. - added bin/ecd2xml - discovered Pod::Usage(3pm) -- perl module of the week! - added ecd_v1.dtd which is a straight port of the ECD format to XML - added function xml_from_cons() which takes an arrayref (NOT an Embedix::ECD object) and turns it into XML. It even preserves comments! - added getNodeType() method to Embedix::ECD - fleshed out toXML(). It now takes a "dtd" parameter which can be "yes", "embed", or "no". This determines how the document type declaration is mentioned in the XML. - "&" in CDATA gets turned into an & entity. - ecd_v1.dtd adjusted to have element order coincide w/ the way Embedix::ECD usually orders them. Otherwise, it's invalid. :( The dtd was also changed to allow the nesting of group, component, option, and autovar nodes. (I forgot about that). Everything should be well-formed now, and the stuff toXML() spits out should even be valid. The stuff xml_from_cons() spits out will probably not be valid, though -- I don't have control over the order of attributes when I get a cons. - this is the first version to be put into CPAN. Getting my PAUSE id today was the best birthday present I've ever gotten. 0.06 Mon Nov 20 08:33:24 MST 2000 - implemented mergeWith() - refactor subclasses of Embedix::ECD to minimize duplication of code - wrote more documentation about what an ECD actually is and reorganized some of the sections to (hopefully) make it easier to understand. - added getFormatOptions(@opt) method to further reduce duplication of code in the subclasses. 0.05 Wed Nov 15 00:56:39 MST 2000 - overloaded the "" operator like CGI::Cookie - create methods for accessing known attributes - added newFromCons() which takes a big arrayref and turns it into a bigger Embedix::ECD object. - added setAttribute($name, $value) and getAttribute($name) to make newFromCons() much easier to implement w/o violating abstraction or having to eval. - updated POD for methods such that each method is preceded by Embedix::ECD (if it is a class method) or $ecd (if it is an instance method). - added getDepth() to find one's depth in the tree. Unfortunately, overloading "" seemed to conflict with reference comparisons and really screwed things up, so I may end up disabling overloading. - re-enabled the overloaded "" operator. Instead of checking to see if $parent eq undef, I just do ref($parent) which seems to not make the "" kick in (which is a good thing). - the grammar now has a way to turn the attributes that are supposed to be aggregates into aggregates via __unindent_and_aggregate() - added module Embdix::ECD::Util and in it, indent() more utility functions will be added there as necessary. - overloading "" is pissing me off -- it kicks in when I least expect it. No more overloading for me. - subclasses need to implement their own toString() ...but it got messy - added %default and @attribute_order to Embedix::ECD::Util They're probably going to get moved somewhere else. - I decided that ALL attributes that get delimited by tags are aggregates. There is no longer a distinction between singular and aggregate attributes. - added accessor method for default_value (which was accidentally omitted). 0.04 Mon Nov 13 02:05:29 MST 2000 - made the parser collect consecutive comments into one big comment. Removed join_comments method, because of this. - removed debugging noise from the parser - wrote great quantities of POD - added Embedix/ECD/Autovar.pm - provided an intervening layer in the grammar so that one could get a nested arrayref form of the syntax tree instead of an object - API changes for accessing child nodes. AUTOLOAD will no longer be able to add children. addChild() will have to be used for that task. getChild() was added for those times it would be inconvenient to let AUTOLOAD return a child node. Finally children() was renamed to getChildren(). This was the result of my desire to let the methods for accessing attribute names be nouns. I also want all other methods to have a verb in them. Thus children() became getChildren(). - enhanced the basic constructor, new() 0.03 Fri Nov 10 12:16:27 MST 2000 - more additions to the grammar - added a stub for merge(). - added a stub for join_comments(). - added t/data/node.ecd which is an ECD file that only contains nodes. - this is the first time a grammar has been able to load an ECD file in its entirety into a simple perl data structure. 0.02 Tue Aug 29 16:38:47 MDT 2000 - implemented AUTOLOAD method - added a test for building object hierarchies - implemented new_from_file() constructor - preliminary (very wrong) ECD parser - added children() method for returning all children of a node. - switched to Java-styled method names for pre-defined methods. newFromFile() and newFromString() were changed. 0.01 Thu Aug 24 14:56:50 2000 - original version; created by h2xs 1.19