View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   // MillScript: an Open Spice interpreter and batch website creation tool
3   // Copyright (C) 2005 Kevin Rogers
4   //
5   // This file is part of MillScript.
6   //
7   // MillScript is free software; you can redistribute it and/or modify it under
8   // the terms of the GNU General Public License as published by the Free
9   // Software Foundation; either version 2 of the License, or (at your option)
10  // any later version.
11  //
12  // MillScript is distributed in the hope that it will be useful, but WITHOUT
13  // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  // more details.
16  //
17  // You should have received a copy of the GNU General Public License along with
18  // MillScript; if not, write to the Free Software Foundation, Inc., 59 Temple
19  // Place, Suite 330, Boston, MA  02111-1307  USA
20  ////////////////////////////////////////////////////////////////////////////////
21  package org.millscript.millscript.loaders;
22  
23  import org.millscript.commons.xml.api.Name;
24  import org.millscript.commons.xml.tokenizer.NoNamespacesName;
25  import org.millscript.millscript.alert.Alerts;
26  import org.millscript.millscript.expr.ConstantExpr;
27  import org.millscript.millscript.expr.IndexExpr;
28  import org.millscript.millscript.expr.NameExpr;
29  
30  /**
31   * This class compiles an arg element in a MillScript XHTML template. An arg
32   * element is called <code>arg</code> and has a single attribute called
33   * <code>n</code>.
34   */
35  public class ArgName implements SpecialTemplateName {
36  
37      /**
38       * This name is used to obtain the value of the n attribute of the arg
39       * element.
40       */
41      private static final Name ARG_NUMBER_ARG = new NoNamespacesName( "n" );
42  
43      /**
44       * The loader we will insert our expressions into.
45       */
46      private final BasicTemplateLoader basicTemplateLoader;
47  
48      /**
49       * Constructs a new arg element handler, to insert expressions for the
50       * current element into the specified loader.
51       *
52       * @param btl   the loader to insert expressions into
53       */
54      public ArgName( final BasicTemplateLoader btl ) {
55          this.basicTemplateLoader = btl;
56      }
57  
58      /**
59       * @see org.millscript.millscript.loaders.SpecialTemplateName#handle()
60       */
61      public void handle() {
62          final String val = this.basicTemplateLoader.tokenVisitor.startTagToken.getAttributes().get( ARG_NUMBER_ARG );
63          try {
64              final int n = Integer.parseInt( val );
65              if ( n <= 0 ) {
66                  throw new NumberFormatException();
67              } else {
68                  // Make the Expr for this XML element and push it into the parent
69                  // elements body.
70                  this.basicTemplateLoader.tokenVisitor.parentTokenVisitor.pushChildElement(
71                      IndexExpr.make(
72                          new NameExpr( "arg" ),
73                          new ConstantExpr( new Integer( n ) )
74                      )
75                  );
76              }
77          } catch ( NumberFormatException ex ) {
78              throw(
79                  Alerts.template(
80                      "Attribute 'n' is not a positive integer",
81                      "The 'n' attribute of the 'item' element must be a small int"
82                  ).culprit( "n", val ).mishap()
83              );
84          }
85      }
86  
87  }