
WebMacro 0.89.1:

-- bug in conditional code 

WebMacro 0.89:

-- added HelloWorld servlet
-- cleaned up some more error messages
-- integer and long support added to term
-- bug fixed: PropertyOperator was putting superclasses ahead of subs
-- null is now a legal value in more places, but cannot be used as arg
-- Conditions exist and support ! == != && and || operators
-- directives are loaded using Class.forName()
-- parse errors now report correct line number, and source file

WebMacro 0.85.2:

-- eliminated SException class, served no purpose here
-- config is more aggressive about where it loads the config 
   file from now: Config class loader, java.lang class loader,
   then finally local file
-- renamed tokenizer to parsetool to reflect its sophistication
-- reduced visibility of package-specific classes, eliminated 
   unnecessary isDefined() method from Macro interface
-- foreach now accepts a list directly as its argument as well
   as a variable
-- improved docs for WebContext
-- list now evaluates macros recursively, hopefully solving
   bug reported with param and ParsedString vs. Lists
-- fixed resource manager visibility
-- License is now directly GPL. WebMacro used to have an intermediate 
   license which added a clause granting copyright on contributed code,
   to allow sharing. That clause is now a condition of the mailing 
   list instead; the old way was incompatible with th GPL. In practice,
   things are exactly as they were; and this is simpler, too.
-- The #if directiuve evaluated its condition twice, which causes a
   problem if the condition has  side-effect. Fixed.
-- Fixed docs to note that lists are of type Object[]



WebMacro 0.85.1:

-- Added documentation to Script.html noting that all free standing
   Terms in WebMacro are Strings by default.
-- Moved semiotek sources into the webmacro package; created a package 
   for the broker, and moved Config from servlet to broker.
-- Fixed bug that caused iterator() methods to be ignored in
   property introspection
-- Made com.semiotek.util.java2 the first import statement, so that 
   people compiling with java2 can choose to use the JDK1.1 
   compatible classes by leaving the directory along, or use the JDK1.2
   versions by deleting it.
-- Fixed bug that caused an exception to be logged if there were multiple
   directories in TemplatePath 

WebMacro 0.85:

-- Changed TemplateDirectory to TemplatePath, which is a list of directories
   to search. The template name can be a path relative to any directory
   in the TemplatePath.
-- Made it easier to compile webmacro under jdk1.2 -- just erase the files
   in com/semiotek/util/java2 to eliminate conflicts between my pseudo
   java2 collections classes and the real ones. 
-- Made WMServlet.handle() equivalent to Reactor/Handler API by changing
   the return type to Template and allowing HandlerException to be thrown
-- Added constants true and false which can be used anywhere a Term is 
   expected; for example, in a #set directive, a list, method arguement, etc.
-- Fixed a bug that prevented property introspection from working when 
   the arguments to a method included a primative such as int, long, ...
-- Split getForm into String getForm() and String[] getFormList()
-- Fixed a bug in ResourceManager cache
-- Added License.html and LICENSE.dev (developer license) 
-- Wrote Servlet.html, etc., documents on design of servlets
-- TemplateProvider has config variable: TemplateExpireTime, which
   allows you to specify duration to cache templates. In particular,
   you can set it to 0, to allow immediate update of templates (at 
   the cost of reparsing them every time). This is useful for 
   development; set a non-zero time for production.

WebMacro 0.80.1:

  -- Fixed bug in config WRT error templates

WebMacro 0.80:

  -- Added Script.html and FAQ.html to the documentation
  -- Added comments, two ##'s at the start of a line make a comment
  -- IfDirective checks for null and Boolean.FALSE, or a macro leading 
     to one of those two (where undefined is considered null)
  -- #param directive added, parameters can be referenced as $$name, 
     they can also be accessed as Template.getParam(String)
  -- You can throw an exception out of Handler init if you need to
  -- WebContext is a subclass of Map rather than PropertyMap
  -- Context is no longer required to be a map in the engine, any 
     object can be used--it will be introspected directly.
  -- Method invocation added to PropertyOperator and therefore Variable
     resolution. Method can be used in place of standard properties 
     as in Foo.Bar.doSomething(Foo.getName(), Foo.Name) -- though it 
     will probably be slightly slower than regular property introspection.
  -- Macro.evaluate() now returns an Object rather than a string. This is
     so that in theory #set can set something to the underlying object 
     rather than the derived string.
  -- Created WMServlet as the generic superclass of Reactor, allowing 
     creation of different kinds of servlets and easier registration. 
  -- Added list initializer syntax

WebMacro 0.75:

  -- Examples now ship with CRLF line endings as a convenience for NT users
  -- Fixed bug with #script/#use directive not working
  -- Fixed bug with tabs not being treated as whitespaces
  -- Template class is now abstract, allowing you greater flexibility 
     in writing your own TemplateProvider--for example, you could generate
     templates on the fly, or read them from somewhere other than a File.
     The original File based behavior is now encoded in the default 
     FileTemplate class.
  -- com.sun.java.util package no longer needlessly imported
  -- fixed a variety of bugs reported by Tom May: patches posted to 
     the list--ResourceBroker and Template
  -- fixed a bug that caused PropertyOperator to throw a NullPtr exception
     under some circumstances if a variable was not found. Now it throws
     a PropertyException explaining why not.
  -- fixed a bug that caused #if followed by a directive to fail
     unless there was an #else present
  -- ':' character is no longer acceptable in a variable name, in fact
     no ASCII punctuation is
  -- FileTemplate reads are now buffered
  -- If Variable evaluates to a Macro, Variable.evaluate() will recursively
     call evaluate(), and Variable.write() will recursively call write(), 
     otherwise toString() is called.
