View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   // MillScript: an Open Spice interpreter and batch website creation tool
3   // Copyright (C) 2001-2004 Open World Ltd
4   // Copyright (C) 2005 Kevin Rogers
5   //
6   // This file is part of MillScript.
7   //
8   // MillScript is free software; you can redistribute it and/or modify it under
9   // the terms of the GNU General Public License as published by the Free
10  // Software Foundation; either version 2 of the License, or (at your option)
11  // any later version.
12  //
13  // MillScript is distributed in the hope that it will be useful, but WITHOUT
14  // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  // more details.
17  //
18  // You should have received a copy of the GNU General Public License along with
19  // MillScript; if not, write to the Free Software Foundation, Inc., 59 Temple
20  // Place, Suite 330, Boston, MA  02111-1307  USA
21  ////////////////////////////////////////////////////////////////////////////////
22  package org.millscript.millscript.functions;
23  
24  import org.millscript.commons.util.IList;
25  import org.millscript.millscript.alert.Alerts;
26  import org.millscript.millscript.datatypes.XmlComment;
27  import org.millscript.millscript.tools.FormatPrint;
28  import org.millscript.millscript.vm.Machine;
29  
30  import java.io.PrintWriter;
31  import java.io.StringWriter;
32  
33  /**
34   * This class implements the MillScript <code>format</code> function.
35   */
36  public class FormatFunction extends Function {
37  
38      /**
39       * @see org.millscript.millscript.functions.Function#apply(org.millscript.millscript.vm.Machine, int)
40       */
41      @Override
42      public void apply( final Machine mc, final int nargs ) {
43  
44          final IList< Object > list = mc.popArgsList( nargs - 1, false );
45  
46          StringWriter sw = new StringWriter();
47          PrintWriter out = new PrintWriter( sw );
48  
49          // Get the control object.
50          // (it contains the %p, etc)
51          Object control = mc.popObject();
52  
53          // We can format a String or an XmlComment.
54          if ( control instanceof String ) {
55              // Pass the String straight through to FormatPrint.
56              FormatPrint.print( out, (String)control, list );
57              // Return the formatted String.
58              mc.pushObject( sw.toString() );
59          } else if ( control instanceof XmlComment ) {
60              // Pass the XML comment's contents to FormatPrint.
61              FormatPrint.print( out, ((XmlComment)control).getText(), list );
62              // Return a new formatted XmlComment.
63              mc.pushObject( new XmlComment( sw.toString() ) );
64          } else {
65              throw(
66                  Alerts.eval(
67                      "Cannot format object",
68                      "Only Strings and XML comments can be formatted"
69                  ).culprit( "object", control ).mishap()
70              );
71          }
72      }
73  
74  }