.=title:	Kwartz桼
.?author:	Makoto Kuwata <kwa(at)kuwata-lab.com>
.?lastupdate:	$Date: 2004/05/09 14:25:20 $
.?version:	$Revision: 0.16 $


Ϥ | preface*


ΥɥȤǤϡƥץ졼ȥƥKwartz{{(Kwartzγȯϡ{{<ʵ(IPA)|http://www.ipa.go.jp/>}}ˤʿ15ǯ{{<̤Ƨեȥ¤|http://www.ipa.go.jp/jinzai/esp/>}}λٱƤޤ)}}ˤĤޤ




ܼ			| toc*

.+toc:
   .<<< users-guide.ja.toc
.-toc:


		| changelog*

.: 2004-05-09
	.- "..." is also string literal, in addition to '...'.
	.- auto-detect "\n" or "\r\n".
	.- command line option "--delete_idattr" which delete id attribute from presentation data.
.: 2004-04-23
	.- new language ruby2 and php2
	.- updated about 'mkmethod'
.: 2004-04-04
	.- utility script 'mkmethod'
	.- tips to get result as string
	.- fixed 'import()' => 'include()' in PHP
.: 2004-04-01
	.- 'include' directive.
	.- 'load' directive and :load() statement.
	.- function E() and X()
.: 2004-03-21
	.- delete only <span> tag and leave <div> tag
.: 2004-03-20
	.- special macro BEGIN and END
	.- Ruby sanitizing
.: 2004-03-19
	.- new command option '--enable_eruby=true'
	.- new keyword 'empty'
	.- new action 'analyze'
	.- new directive notation 'id="foreach:item:list"'
.: 2004-03-13
	.- use id attribute instead of kd attribute.
	.- add description about new features
	   ({{,id="replace:{{/name/}}",}} and {{,:value({{/name/}}={{/expr/}}),}})
	.- add new samples (navilink, breadcrumbs, error messages, calendar)
.: 2004-03-08
	.- subsection 'Compare with null explicitly' added.
	.- some eratta fixed
.: 2004-02-27
	.- 'Notes' of directives and presentaion language updated
	.- description about sanitizing updated
.: 2004-02-24
	.- some eratta fixed
.: 2004-02-12
	.- public release
.#.: 2004-02-09 (Ver 0.4)
.#	.- ޤѹ
.#
.#.: 2003-11-19 (ver 0.3)
.#	.- ѹ
.#
.#.: 2003-11-09 (ver 0.2)
.#	.- ѹ
.#
.#.: 2003-10-11 (ver 0.1)
.#	.- 




KwartzˤĤ	| intro


KwartzȤϡ		| intro-whatis


Kwartz{{('Quartz'Ʊ褦ȯƤ)}}ȤRubyǼ줿ƥץ졼ȥƥǤ
Τ褦ħޤ


.%  ץ쥼ơǡȥץ쥼ơåȤʬΥǽ
	
	̾Υƥץ졼ȥƥǤϥƥץ졼ȤȥᥤץȤʬΥޤ
	KwartzǤϹˡƥץ졼Ȥץ쥼ơǡȥץ쥼ơåȤʬΥޤ
	ˤꡢץ쥼ơåHTML˺뤳Ȥ⡢ޤᥤץʶळȤ⤢ޤ
	
	
.%  ®ư
	
	KwartzǤϡƥץ졼ȡʥץ쥼ơǡȥץ쥼ơåˤѥץȤޤ
	򤢤餫ԤäƤᡢ¹ԻˤϽѥץƤӽФǤ褯ˤƹ®ưޤ
	ޤDOMĥ꡼Τ褦ڹ¤Ȥ鷺˺Ѥिᡢ¾Υƥץ졼ȥƥ®Ǥ
	.#Ūˤ̾CGIPHPƱư®٤ˤʤޤ
	.#{{(Ĥޤ¾Υƥץ졼ȥƥǤϡ̾CGIPHPư٤ʤäƤ櫓Ǥ)}}
	
	
.%  ʣΥץߥ󥰸б
	
	KwartzȼָѤ뤳Ȥˤꡢ͡ʥץߥ󥰸줫ѤǤ褦ˤʤäƤޤ
	ĤޤꡢҤȤĤHTMLƥץ졼Ȥ͡ʸ줫Ѥ뤳ȤǤΤǤ
	ޤѤѤȤƤ⡢ץ쥼ơؤϲѹɬפޤ
	ߤΤȤRubyPHPJSPeRubyERBVelocityбƤޤ
	
	
.%  HTMLƥץ졼ȤSGMLʤ
	
	KwartzǤϡHTMLƥץ졼Ȥˤޡ󥰡ʰդˤSGMLΥǹԤäƤޤ
	Τᡢ{{<Jakarta Velocity|http://jakarta.apache.org/velocity/>}} 
	{{<Template-Toolkit|http://www.template-toolkit.org/>}} 
	Τ褦HTMLƥץ졼ȤΥǥƤޤȤޤ
	
	
.%  ǤդΥƥȥեǻѲǽ
	
	KwartzǤϡKwartzѤ°ĤΤߤǧʳΥϤΥץ졼ƥȤȤߤʤޤ
	ޤXMLѡѤȼΥѡѤƤޤ
	Τᡢ{{<Enhydra XMLC|http://xmlc.enhydra.org/>}} 
	{{<amrita|http://www.brain-tokyo.jp/research/amrita/index.html>}} 
	Τ褦XMLHTMLǤѤǤʤȤȤϤʤǤդΥƥȥեǻѲǽǤ
	
	
.%  ư˥ǽ򥵥ݡ
	
	KwartzǤϡ˥ưŪ˹Ԥ褦ˤ뤳ȤǤޤ
	Ĥޤꡢ{{,CGI.escapeHTML(var),}}פ{{,htmlspecialchars($var),}}פȽɬפޤ
	ޤ˥ǽϥ/դ뤳ȤǤޤ
	ˡʬ򥵥˥/ʤ٤Ǥޤ




ñʥץ	| intro-example


Kwartzϡƥץ졼Ȥץ쥼ơǡȥץ쥼ơåȤʬƵҤޤ
ǤϤ򼨤ޤ


ޤץ쥼ơǡǤ
.* {{,#{var}#,}}פѿvarͤϤ뤳Ȥɽޤ
.* {{,id="xxx",}}פϤΥȤxxxȤ̾ǡܰפĤ뤳ȡĤޤоݤȤ뤳Ȥɽޤ

ץ쥼ơǡ(example.html)
.-------------------- example.html
<table>
  <tr {{*id="xxx"*}}>
    <td>{{*#{var}#*}}</td>
  </tr>
</table>
.--------------------


ϥץ쥼ơåǤ
ץ쥼ơåǤϡץ쥼ơǡˤĤܰפФԤޤ
.* {{,:elem(xxx),}}פϡxxxפȤ̾ܰĤ줿ȡElement, Ǥ{{,<tr>,}}{{,</tr>,}}ޤǡˤɽޤ
.* {{,@stag,}}פϳϥStart tag, Ǥ{{,<tr>,}}ˤɽޤ
.* {{,@cont,}}פơContent, Ǥ{{,<td>#{user}#</td>,}}ˤɽޤ
.* {{,@etag,}}פϽλEnd tag, Ǥ{{,</tr>,}}ˤɽޤ
.* {{,:foreach(var=list) ... :end,}}פϷ֤ɽޤ
    Ĥޤꡢϥ齪λޤǤ򷫤֤褦˥ȤѹƤ櫓Ǥ


ץ쥼ơå(example.plogic)
.-------------------- example.plogic
## ֤Ԥ褦˥Ȥʤ
:elem(xxx)		## element
  :foreach(var=list)
    @stag		## start tag
    @cont		## content
    @etag		## end tag
  :end
:end
.--------------------


KwartzϤ2ĤƸѤνѥץȤưޤ
򥳥ѥȤޤ
ѥ뤹ˤϥޥɥ饤ǼΤ褦ˤޤ
.====================
### for Ruby
$ kwartz -l ruby  -p example.plogic example.html > example.rb
or
$ kwartz -l ruby2 -p example.plogic example.html > example.rb2

### for PHP
$ kwartz -l php   -p example.plogic example.html > example.php
or
$ kwartz -l php2  -p example.plogic example.html > example.php2

### for JSP
$ kwartz -l jsp   -p example.plogic example.html > example.jsp

### for eRuby
$ kwartz -l eruby -p example.plogic example.html > example.rthml

### for ERB
$ kwartz -l erb   -p example.plogic example.html > example.erb

### for Velocity
$ kwartz -l velocity -p example.plogic example.html > example.vm
.====================


ʲϼư줿ѥץȤǤ

Ruby(example.rb):
	.--------------------
	.<<<:! ./kwartz -l ruby -p guide.d/example.plogic guide.d/example.html
	.--------------------
	
Ruby(example.rb2) -- ϤʸȤƼФ:
	.--------------------
	.<<<:! ./kwartz -l ruby2 -p guide.d/example.plogic guide.d/example.html
	.--------------------
	
PHP(example.php):
	
	.--------------------
	.<<<:! ./kwartz -l php -p guide.d/example.plogic guide.d/example.html
	.--------------------
	
PHP(example.php2) -- ϤʸȤƼФ:
	
	.--------------------
	.<<<:! ./kwartz -l php2 -p guide.d/example.plogic guide.d/example.html
	.--------------------
	
JSP{{(ޥɥ饤󥪥ץȤơ--charset={{/CHARSET/}}פĤȡJSPѽϥץȤǤϡ{{,<%@ page contentType="text/html; charset={{/CHARSET/}}" %>,}}פĤƤޤ)}}(example.jsp):
	.--------------------
	.<<<:! ./kwartz -l jsp -p guide.d/example.plogic guide.d/example.html
	.--------------------
	
eRuby(example.rhtml):
	.--------------------
	.<<<:! ./kwartz -l eruby -p guide.d/example.plogic guide.d/example.html
	.--------------------
	
ERB(example.erb):
	.--------------------
	.<<<:! ./kwartz -l erb -p guide.d/example.plogic guide.d/example.html
	.--------------------
	
Velocity(example.vm):
	.--------------------
	.<<<:! ./kwartz -l velocity -p guide.d/example.plogic guide.d/example.html
	.--------------------


ޤѥ˥ޥɥץ -s Ĥȡ˥줿ѥץȤޤVelocityˡ
.#ߤΤȤ˥бƤΤRubyPHPJSPeRubyERBǤ
˥ˤϡPHPǤ{{,htmlspecialchars(),}}RubyeRubyǤ{{,CGI.escapeHTML(),}}ERBǤ{{,html_escape(),}}JSPǤ{{,escapeXml="false",}}ʤ{{,<c:out/>,}}Ѥޤ


νѥץȤᥤץफƤӽФȡWebڡϤޤ
ƤӽФϡƥץߥ󥰸ˤäưۤʤޤ


ᥤץ(ruby)
	.--------------------
	require 'cgi'        # for sanitizing
	s = File.open('example.rb') { |f| f.read }
	s.untaint            # for CGI program
	eval s
	.--------------------
	
ᥤץ(ruby2)
	.--------------------
	require 'cgi'        # for sanitizing
	s = File.open('example.rb2') { |f| f.read }
	s.untaint            # for CGI program
	_s = ''
	eval s
	print _s
	.--------------------
	
ᥤץ(php)
	.--------------------
	<?php
	   include('example.php');
	 ?>
	.--------------------
	
ᥤץ(php2)
	.--------------------
	<?php
	   include('example.php2');
	   echo $_s;
	 ?>
	.--------------------
	
ᥤץ(jsp)
	.--------------------
	public void doGet(HttpServletRequest request,
	                  HttpServletResponse response)
	                  throws ServletException, IOException {
	   ...
	   RequestDispatcher dispatcher = 
	       request.getRequestDispatcher('example.jsp');
	   dispatcher.include(request, response);
	   // ޤ dispatcher.forward(request, response);
	}
	.--------------------
	
ᥤץ(eruby)
	.--------------------
	require 'eruby'
	require 'cgi'        # for sanitizing
	ERuby::import('example.rhtml')
	.--------------------
	
ᥤץ(erb)
	.--------------------
	require 'erb'
	include ERB::Util    # for sanitizing
	s = File.open('example.erb') { |f| f.read }
	s.untaint            # for CGI program
	erb = ERB.new(s, $SAFE, '%')
	erb.run(binding())   # or print erb.result(binding())
	.--------------------
	
ᥤץ(velocity)
	.--------------------
	Velocity.init();
	VelocityContext context = new VelocityContext();
	Template template = Velocity.getTemplate("example.vm");
	OutputStreamWriter writer = new OutputStreamWriter(System.out);
	template.merge(context, writer);
	writer.flush();
	.--------------------


ѥץƤӽФƼ¹Ԥȡ㤨мΤ褦Webڡޤ

.____________________
<table>
  <tr id="xxx">
    <td>apple</td>
  </tr>
  <tr id="xxx">
    <td>orange</td>
  </tr>
  <tr id="xxx">
    <td>banana</td>
  </tr>
</table>
.____________________



νϷ̤ߤȡ°{{,id="xxx",}}ĤäƤΤˤʤޤ
äϡ{{,id="mark:xxx",}}ȵҤ뤫ޥɥ饤󥪥ץ{{,--delete_idattr=true,}}ĤƤ
id°Ϥʤ褦ˤʤޤ




ޤKwartzǤϥץ쥼ơǡ˥ץ쥼ơåळȤǤޤ
ĤޤꡢξԤʬΥ뤳Ȥ⡢β뤳ȤǤ櫓Ǥ


βˤϡǥ쥯ƥ֤Ѥޤ
ǥ쥯ƥ֤Ȥϡץ쥼ơǡ˥ץ쥼ơåि̿Ǥ
KwartzǤϡid°ʤޤkd°ˤѤƥǥ쥯ƥ֤򵭽Ҥޤ


ϥץ쥼ơåץ쥼ơǡǤ
Υץ뤫ϡۤɤΤƱѥץबưޤ
.
.-------------------- example2.html
<table>
  <tr {{*id="foreach:var=list"*}}>
    <td {{*id="value:var"*}}>foo</td>
  </tr>
.#  <tr {{*id="dummy:d1"*}}>
.#    <td>bar</td>
.#  </tr>
</table>
.--------------------




ưܺ			| detail


ץ쥼ơǡ	| detail-pdata


KwartzϼΤ褦ʥץǡץ쥼ơǡȥץ쥼ơåȤʬΥƤޤ
.* ץ쥼ơǡΤԤսˡܰפĤ롣
.* ץ쥼ơåϡܰפФƽԤ


Ρץ쥼ơǡФơܰפĤ뤳Ȥޡ󥰤ȸƤǤޤ
KwartzǤϡޡ󥰤id°ʤޤkd°{{(̾'Kwartz Directive'ͳ褷ޤ°̾ϥޥɥ饤󥪥ץ --attr_name ȤäѹǤޤ)}}ˤѤơ{{,id={{/name/}},}}פΤ褦˵Ҥޤ


ޡ󥰤㡧
.--------------------
<table>
 <tr {{*id="list"*}}>
  <td>#{item}#</td>
 </tr>
</table>
.--------------------


KwartzǤϡޡ󥰤줿Ȥǧ졢ޡ󥰤ƤʤȤ̾Υץ졼ƥȤȤưޤ
Τᡢץ쥼ơǡHTMLXMLǤɬפϤʤɤʥƥȤǤⰷȤǤޤ
㤨мΤ褦ʡwell-formedǤʤեʤޤ


well-formedǤϤʤե㡧
.--------------------
<span id="test">
 aaa <bbb> ccc </ddd>
</span>
.--------------------




֥			| detail-intermed


Kwartzϡץ쥼ơǡ򤤤ä֥ɤѴޤ򥳥С(Convert)ȸƤǤޤ


ΤȤKwartzϥޡ󥰤줿ȤФΤ褦4ĤΥޥưޤ
.* ޥstag_{{/xxx/}}  ϥ(start tag)ɽޤ
.* ޥcont_{{/xxx/}}  (content)ɽޤĤޤꡢϥȽλǰϤޤ줿ϰϤɽޤ
.* ޥetag_{{/xxx/}}  λ(end tag)ɽޤ
.* ޥelem_{{/xxx/}}  (element)ɽޤȤϡϥơλʤޤ


㤨мΤ褦ʥץ쥼ơǡȤޤ
.--------------------
<table>
 <tr id="list">
  <td>#{item}#</td>
 </tr>
</table>
.--------------------

Υץ쥼ơǡϡKwartzˤäƼΤ褦֥ɤ˥СȤޤ
4ĤΥޥƤ뤳ȡޤѤƥץ쥼ơǡɽƤ뤳Ȥ狼ޤ

.--------------------
:macro(stag_list)          ## ϥΥޥ
  :print(" <tr id=\"list\">\n")
:end

:macro(cont_list)          ## ƤΥޥ
  :print("  <td>", item, "</td>\n")
:end

:macro(etag_list)          ## λΥޥ
  :print(" </tr>\n")
:end

:macro(elem_list)          ## ȤΥޥ
  :expand(stag_list)            ## ޥŸ
  :expand(cont_list)            ## ޥŸ
  :expand(etag_list)            ## ޥŸ
:end

:print("<table>\n")        ## ץ쥼ơǡ
:expand(elem_list)              ## ޥŸ
:print("</table>\n")
.--------------------


Ǥϥޡ󥰤Ȥơ{{,id="list",}}פѤΤǡid°ĤäޤޤˤʤäƤޤ
{{,id="mark:list",}}פȤ뤫ޥɥ饤󥪥ץ {{,--delete_idattr=true,}}Ĥȡ֥Ѵid°ޤ


ʤָϡPL(Presentation Language)פȤ̾ĤƤޤ



ץ쥼ơå		| detail-plogic


ץ쥼ơåϼΤ褦ˤƵҤޤ
.* ָǤPLǵҤ롣
.* ޥ񤭤ǵҤ롣


ץ쥼ơåǤ
ޥelem_list񤭤ϥ齪λޤǤ򷫤֤Ƥޤ
.--------------------
:macro(elem_list)
  :foreach(item=itemlist)    ## foreachʸˤ뷫֤
    :expand(stag_item)       ## start tag
    :expand(cont_item)       ## content
    :expand(etag_item)       ## end tag
  :end
:end
.--------------------


ʤΥץ쥼ơåϡΤ褦˽񤯤ȤǤޤ
Υץ쥼ơåϡKwartzѡˤäơΤΤƱ褦˰ޤ
.--------------------
:elem(list)                  ## :macro(elem_item) Ʊ
  :foreach(item=itemlist)
    @stag                    ## :expand(stag_item) Ʊ
    @cont                    ## :expand(cont_item) Ʊ
    @etag                    ## :eppand(etag_item) Ʊ
  :end
:end
.--------------------




ѥץ		| detail-outscript


Kwartzϡʥץ쥼ơǡ鼫ư֥ɤȡץ쥼ơåȤޡޥŸ뤳Ȥǡѥץޤ
ȥ󥹥졼(Translate)ȸƤǤޤ


ȥ󥹥졼Ȥ򼨤ޤ

.____________________
   
   :print("<table>\n")
   :expand(elem_list)
   :print("</table>\n")

      |
      | ޥŸ
      V

   :print("<table>\n")
   {{*:foreach(item=itemlist)*}}
     {{*:expand(stag_list)*}}
     {{*:expand(cont_list)*}}
     {{*:expand(etag_list)*}}
   {{*:end*}}
   :print("</table>\n")

      |
      | ޥŸ
      V

   :print("<table>\n")
   :foreach(item=itemlist)
     {{*:print(" <tr id=\"list\">\n")*}}
     {{*:print("  <td>", item, "</td>\n")*}}
     {{*:print(" </tr>\n")*}}
   :end
   :print("</table>\n")

      |
      | ѥץ
      V

   ### for Ruby
   print "<table>\n"
   for item in itemlist do
     print " <tr id=\"list\">\n"
     print "  <td>", item, "</td>\n"
     print " </tr>\n"
   end
   print "</table>\n"
 
   ### for PHP
   <table>
   <?php foreach($itemlist as $item) { ?>
    <tr id="list">
     <td><?php echo $item; ?></td>
    </tr>
   <?php } ?>
   </table>

   ### for JSP
   <table>
   <c:forEach var="item" items="${itemlist}">
    <tr id="list">
     <td><c:out value="${item}"/></td>
    </tr>
   </c:forEach>
   </table>

   ### for eRuby
   <table>
   <% for item in itemlist do
    %> <tr id="list">
     <td><%= item %></td>
    </tr>
   <% end
    %></table>

   ### for ERB
   <table>
   % for item in itemlist do
    <tr id="list">
     <td><%= item %></td>
    </tr>
   % end
   </table>

   ### for Velocity
   <table>
   #foreach ($item in $itemlist)
    <tr id="list">
     <td>${item}</td>
    </tr>
   #end
   </table>

.____________________


ޤǤСȤϥᥤץफ餳νѥץɤ߹ʤ¹ԤʤꤹСWebڡޤ


ʾ夬Kwartzưˤʤޤ



ѥץθƤӽФ			| detail-import


ᥤץफѥץƤӽФˡϡƥץ줴Ȥ˰ۤʤޤ
ܤ¾ʸʤɤ򻲾ȤƤ


.%  Rubyξ硧
	եɤ߹ߡevalƤ˥Ԥcgi.rbɤ߹Ǥ
	.--------------------
	require 'cgi'         # for sanitizing
	str = File.open('example.rb') { |f| f.read }
	str.untaint           # for CGI program
	eval str
	.--------------------
	ޤޥɥ饤 {{,-l ruby2,}} ȻꤷϼΤ褦ˤޤ
	.--------------------
	require 'cgi'         # for sanitizing
	str = File.open('example.rb') { |f| f.read }
	str.untaint           # for CGI program
	_s = ''
	eval str
	print _s
	.--------------------

.%  PHPξ硧
	include()ؿȤäƤ
	.--------------------
	<?php include('example.phtml'); ?>
	.--------------------
	ޤޥɥ饤 {{,-l php2,}} ȻꤷϼΤ褦ˤޤ
	.--------------------
	<?php include('example.phtml'); echo $_s; ?>
	.--------------------

.%  JSP(Servlet)ξ硧
	ServletJSPƤӽФϡRequestDispatcherѤƤ
	.--------------------
	RequestDispatcher dispatcher = 
	    request.getRequestDispatcher("example.jsp");
	dispatcher.forward(request, response);
	.--------------------

.%  eRubyξ硧
	ERuby::import()ɤ߹Ǥ˥Ԥcgi.rbɤ߹Ǥ
	.--------------------
	require 'eruby'
	require 'cgi'         # for sanitizing
	ERuby::import('example.rhtml')
	.--------------------

.%  ERBξ硧
	ERB֥Ȥrun()᥽åɤ¹ԤƤ
	ޤtrimѥ᡼Ȥ '%' ꤷƤ
	˥Ԥ{{,ERB::Util,}}importƤ
	.--------------------
	require 'erb'
	include ERB::Util     # for sanitizing
	str = File.open('example.erb') { |f| f.read }
	str.untaint
	erb = ERB.new(str, $SAFE, '%')
	erb.run(binding())   # or print erb.result(binding())
	.--------------------

.%  Velocityξ硧
	org.apache.velocity.context.Contextorg.apache.velocity.TemplateȤޤ
	ܤVelocityΥޥ˥奢
	.--------------------
	Velocity.init();
	VelocityContext context = new VelocityContext();
	Template template = Velocity.getTemplate("example.vm");
	OutputStreamWriter writer = new OutputStreamWriter(System.out);
	template.merge(context, writer);
	writer.flush();
	.--------------------




ץ쥼ơåα		| detail-appl


Ǽץ쥼ơåϡϥ齪λޤǤ򷫤֤ΤǤ
Ǥ¾Ҳ𤷤ޤ


.#.* ƤΤѿͤϤϡޥcont_{{/xxx/}}񤭤ΤäȤñǤ
.#   ˡȤȡ{{,#{var}#,}}פȤҤ򤱤뤳ȤǤޤ
.#	.--------------------
.#	:macro(cont_list)
.#	  :print(item)        ## Ȥ :print('foo')
.#	:end
.#	.--------------------

.* Ƥ򷫤֤ȤǤޤ<dl></dl>ǻȤΤ˸Ƥޤ
	.--------------------
	:macro(elem_list)
	  :expand(stag_list)
	  :foreach(item=itemlist)
	    :expand(cont_list)
	  :end
	  :expand(etag_list)
	:end
	.--------------------
	or
	.--------------------
	:elem(list)
	  @stag
	  :foreach(item=itemlist)
	    @cont
	  :end
	  @etag
	:end
	.--------------------

.* ƤΤˡѿ估ʤɤͤϤ뤳ȤǤޤ
	.--------------------
	:macro(elem_list)
	  :expand(stag_list)
	  :print(item['key'])
	  :expand(etag_list)
	:end
	.--------------------
	or
	.--------------------
	:elem(list)
	  @stag
	  :print(item['key'])
	  @etag
	:end
	.--------------------

.* ȤΤˡѿ估ʤɤͤϤ뤳ȤǤޤ
	.--------------------
	:macro(elem_list)
	  :print(item['key'])
	:end
	.--------------------
	or
	.--------------------
	:elem(list)
	  :print(item['key'])
	:end
	.--------------------

.* Τ̤Υޥ֤뤳ȤǤޤ
	.--------------------
	:macro(elem_list)
	  :expand(other_macro)
	:end
	:macro(other_macro)
	  :print('...')
	  :print('...')
	:end
	.--------------------
	or
	.--------------------
	:elem(list)
	  :expand(other_macro)
	:end
	:macro(other_macro)
	  :print('...')
	  :print('...')
	:end
	.--------------------

.* ƤĤϥȽλäȤǤޤ
   ΤˤϡϥȽλ򥳥ȥȤޤ
	.--------------------
	:macro(elem_list)
	  ## :expand(stag_list)
	  :expand(cont_list)
	  ## :expand(etag_list)
	:end
	.--------------------
	or
	.--------------------
	:elem(list)
	  ## @stag
	  @cont
	  ## @etag
	:end
	.--------------------

.* ΤäȤǤޤϡߡǡäȤǤ
	.--------------------
	:macro(elem_list)
	  ## :expand(stag_list)
	  ## :expand(cont_list)
	  ## :expand(etag_list)
	:end
	.--------------------
	or
	.--------------------
	:elem(item)
	  ## @stag
	  ## @cont
	  ## @etag
	:end
	.--------------------

.* ʣʥץ쥼ơåޤ뤳ȤǤޤ
	.--------------------
	:macro(elem_list)
	  :set(ctr = 0)
	  :foreach(item=itemlist)
	    :set(ctr += 1)
	    :set(color = ctr%2==0 ? 'red' : 'blue')
	    :expand(stag_item)
	    :expand(cont_item)
	    :expand(etag_item)
	  :end
	:end
	.--------------------
	or
	.--------------------
	:elem(list)
	  :set(ctr = 0)
	  :foreach(item=itemlist)
	    :set(ctr += 1)
	    :set(color = ctr%2==0 ? 'red' : 'blue')
	    @stag
	    @cont
	    @etag
	  :end
	:end
	.--------------------


ǽפʤΤϡ{{*ץ쥼ơåˤϥ̾°̾ڽФƤƤʤ*}}ȤǤ
ץ쥼ơǡΤۤǤɤʤ˥ѹȤƤ⡢ץ쥼ơåϤޤäѹɬפϤޤ


Ĥޤꡢץ쥼ơǡȥץ쥼ơåȤʬΥƤ櫓Ǥ




ޤȤ		| detail-conc


kwartsưǤ
̾νˡ*פĤƤΤϼưŪΡʳϳȯԤưǺΤǤ

.____________________
  Presentation Data           Presentation Logic
    (HTML)                    (intermediate language)
       |                            |
       | convert                    |
       |                            |
       V                            |
Intermediate Code*                  |
(intermediate language)             |
       |                            |
       |                            |
       +-------------+--------------+
                     | translate
                     |
                     V              call/import
              Output Program*    <============ Main Program
           (Ruby/PHP/JSP/eRuby)             (Ruby/PHP/JSP/eRuby)
                     |
                     | output
                     |
                     V
                 Web Page*
                  (HTML)
.____________________


ȯԤưǺΡ
.* ץ쥼ơǡHTMLե
.* ץ쥼ơå
.* ᥤץ


ưΡ
.* ֥
.* ѥץ
.* Webڡ


Ѹ졧
.[С(Convert)]
	ƥץ졼ȥե֥ɤѴ뤳ȡ
.[ȥ󥹥졼(Translate)]
	֥ɤȥץ쥼ơåȤޡƽѥץѴ뤳ȡ
.[ѥ(Compile)]
	СȤƥȥ󥹥졼Ȥ뤳ȡ
	Ĥޤץ쥼ơǡȥץ쥼ơåѥե뤳ȡ




ǥ쥯ƥ	| directive


ǥ쥯ƥ֤Ȥϡ	| directive-whatis


KwartzǤϡץ쥼ơǡ˥ץ쥼ơåळȤǤޤ
Τ֥̿ǥ쥯ƥ(Directive)פȤޤ


ǥ쥯ƥ֤Ȥϡץ쥼ơǡ̿Ǥꡢץ쥼ơåɽޤ
ޤǸƤޡ󥰡{{,id="{{/name/}}",}}פ{{,id="mark:{{/name/}}",}}פ⡢ǥ쥯ƥ֤ΤҤȤĤǤ
¾ˡ֤ʬΤΥǥ쥯ƥ֤ѰդƤޤ


KwartzǤϡǥ쥯ƥ֤id°ޤkd°Ѥޤ
̾id°Ѥޤid°¾ӤǻѤˤkd°ѤޤޤξƱ˻Ѥ뤳ȤǤޤ
id°kd°λȤʬˤĤƤϡ{{<id°kd°ˤĤ|#directive-idkd>}}פ


KwartzǤϤäץ쥼ơǡȥץ쥼ơåȤʬΥ뤳ȤǤΤˡʤξԤβ褦ʵǽѰդƤΤǤ礦


ϡȯԤιߤ˱Ƥɤ٤褦ˤ뤿ᡢĤޤ䤹Ǥ
KwartzϡȯԤˤɤ餫򲡤Ĥ褦ʤȤϤޤ
ʬΥۤ˾ޤΤǤʬΥФ褤βۤߤǤаβФ褤ΤǤ


ޤξԤβȡ¾Υƥץ졼ȤȺ̲ǤʤȻפ뤫⤷ޤ
βƤʤKwartz¾Υƥץ졼Ȥ٤ƼΤ褦ޤ
.* HTMLǥޤ{{<Jakarta Velocity|http://jakarta.apache.org/velocity/>}}{{<Template-Toolkit|http://www.template-toolkit.org/>}}٤ƤߤƤˡ
.* ʣʥץߥ󥰤ɬפޤDOMץߥ󥰤ɬפ{{<Enhydra XMLC|http://xmlc.objectweb.org/>}}٤ƤߤƤˡ
.* ¹Իưڤƹ®Ǥ{{<amrita|http://www.brain-tokyo.jp/research/amrita/index_ja.html>}}٤ƤߤƤˡ
.* XMLHTMLǤʤɤΤ褦ʥƥȷǤѤǤޤ{{<XMLC|http://xmlc.objectweb.org/>}}{{<amrita|http://www.brain-tokyo.jp/research/amrita/index_ja.html>}}٤ƸƤˡ
.* ƼΥץߥ󥰸ǻѤǤޤʤΤ褦ʥƥץ졼ȥƥ¾ˤޤ󡪡ˡ




ޡ	| directive-mark


{{,id="{{/name/}}",}}פޤϡ{{,id="mark:{{/name/}}",}}פȤ뤳Ȥǡޡ󥰤Ԥޤ
ޡ󥰤ȤϡȤФƤ̾ܰĤ뤳ȤǤ
ޡ󥰤줿Ȥϡ֥ɤˤƥޥɽޤ



ץ쥼ơǡ
.-------------------- directive-mark.html
<li {{*id="item"*}}>foo</li>
.--------------------

֥ɡ
.____________________
.<<<:! kwartz -a convert guide.d/directive-mark.html
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-mark.html
.____________________



{{,id="{{/name/}}",}}פȡ{{,id="mark:{{/name/}}",}}פȤΰ㤤ϡ֥ɤ˥СȤȤԤǤid°ĤΤФԤϼȤǤ



ץ쥼ơǡ
.-------------------- directive-mark2.html
<li {{*id="mark:item"*}}>foo</li>
.--------------------

֥ɡ
.____________________
.<<<:! kwartz -a convert guide.d/directive-mark2.html
.____________________



ͤν | directive-output

{{,#{{{/expression/}}}#,}}פϡͤϤ륳ޥɤǤ
Rubyʤprint {{/expression/}}פˡPHPʤ<?php echo {{/expression/}}; ?>פޤ

ץ쥼ơǡ
.-------------------- directive-output.html
Hello {{*#{user}#*}}!
.--------------------

֥ɡ
.____________________
:print("Hello ", {{*user*}}, "!\n")
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-output.html
.____________________


ѥˡޥɥץ{{,-s,}}ʤޤ{{,--escape=true,}}ˤꤷϡ򥵥˥ƽϤޤ
ΤȤʸͤϥ˥줺Τߤ˥뤳ȤդƤ

ѥץʥޥɥץ{{,-s,}}Ĥˡ
.____________________
.<<<:! ruby output.rb -s guide.d/directive-output.html
.____________________



ޥɥץ̵ͭ˴ؤ餺˥򤹤/ʤꤹˤϡؿE()X()Ѥޤ
{{,E({{/expr/}}),}}ϼexpr򥵥˥{{,X({{/expr/}}),}}ϥ˥ޤ

ץ쥼ơǡ
.-------------------- directive-output2.html
With sanitizing:    {{*#{E(expr)}#*}}!
Without sanitizing: {{*#{X(expr)}#*}}!
.--------------------

֥ɡ
.____________________
:print("With sanitizing:    ", {{*E(expr)*}}, "\n")
:print("Without sanitizing: ", {{*X(expr)*}}, "\n")
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-output2.html
.____________________



ͤν2 | directive-value

{{,id="value:{{/expression/}}",}}פȤ뤳ȤǡƤΤ˼ͤϤޤ
ߡǡѤǤ뤿ᡢ{{,#{{{/expression/}}}#,}}פ٤HTMLǥ󤬤ޤ

ץ쥼ơǡ
.-------------------- directive-value.html
<li {{*id="value:hash['name']"*}}>foo</li>
.--------------------

֥ɡ
.____________________
:print("<li>", {{*hash['name']*}}, "</li>\n")
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-value.html
.____________________


ޤ{{,id="Value:{{/expr/}},}}פǥ˥뤳Ȥ򡢡{{,id="VALUE:{{/expr/}},}}פǥ˥ʤȤǤޤ
Ϥ줾{{,id="value:E({{/expr/}}),}}פ{{,id="value:X({{/expr/}}),}}פƱǤ




°ͤ | directive-attr

{{,id="attr:{{/name/}}={{/value/}}",}}סʤޤϡ{{,id="attr:{{/name/}}:{{/value/}}",}}סˤȤ뤳Ȥǡ°ͤǤޤ
Ѥȡ{{,#{...}#,}}פȤ鷺°ͤǤޤߡ°ͤǤޤ

Ǥϡ°class˥ߡ° "odd" ꤷƤޤºݤˤѿ klass ͤѤ褦ˤƤޤ

ץ쥼ơǡ
.-------------------- directive-attr.html
<tr class="odd" {{*id="attr:class=klass"*}}>
  <td>foo</td>
</tr>
.--------------------

֥ɡ
.____________________
:print("<tr class=\"", {{*klass*}}, "\">\n")
:print("  <td>foo</td>\n")
:print("</tr>\n")
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-attr.html
.____________________


ޤ{{,id="Attr:{{/name/}}={{/value/}},}}פǥ˥뤳Ȥ򡢡{{,id="ATTR:{{/name/}}={{/value/}},}}פǥ˥ʤȤǤޤ
Ϥ줾{{,id="attr:{{/name/}}=E({{/value/}}),}}פ{{,id="attr:{{/name/}}=X({{/value/}}),}}פƱǤ


ʤ{{,;,}}פǶڤ뤳Ȥˤꡢ{{,attr:{{/name/}}={{/value/}},}}פʣꤷ¾Υƥץ졼ȥޥɤȰꤷǤޤ

ץ쥼ơǡ
.-------------------- directive-attr2.html
<font id="if:message{{*;attr:class=klass;attr:bgcolor=color*}}">
 #{message}#
</font>
.--------------------

֥ɡ
.____________________
:if(message)
  :print("<font class=\"", {{*klass*}}, "\" bgcolor=\"", {{*color*}}, "\">\n")
  :print(" ", message, "\n")
  :print("</font>\n")
:end
.____________________

.#ѥץࡧ
.#.____________________
.#.<<<:! ruby output.rb guide.d/directive-attr2.html
.#.____________________



ͤ	| directive-set

{{,id="set:{{/var/}}={{/value/}},}}סʤޤϡ{{,id="set:{{/var/}}:{{/value/}},}}סˤϡѿ{{/var/}}{{/value/}}ꤷޤ
{{,=,}}פǤʤ{{,+=,}}ס{{,-=,}}ס{{,*=,}}ס{{,/=,}}ס{{,.+=,}}פѤǤޤ
ʡ{{,.+=,}}פʸϢɽޤˡ

ץ쥼ơǡ
.-------------------- directive-set.html
<dt {{*id="set:var=value"*}}>foo</dt>
<dd {{*id="set:count+=1"*}}>123</dd>
.#<tr class="#{klass}#" {{*id="set:klass=ctr%2==0?'even':'odd'"*}}>
.#  <td>foo</td>
.#</tr>
.--------------------

֥ɡ
.____________________
{{*:set(var=value)*}}
:print("<dt>")
:print("foo")
:print("</dt>\n")
{{*:set(count+=1)*}}
:print("<dd>")
:print("123")
:print("</dd>\n")
.#{{*:set(klass=ctr%2==0?'even':'odd')*}}
.#:print("<tr class=\"", klass, "\">\n")
.#:print("  <td>foo</td>\n")
.#:print("</tr>\n")
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-set.html
.____________________



ʬ | directive-if

{{,id="if:{{/expression/}}",}}פȤ뤳ȤǡʬԤޤelseelse ifɽǤޤ
elseelse ifȤϡץ쥼ơḁ̊եѰդƤ

ץ쥼ơǡ
.-------------------- directive-if.html
<font color="red" {{*id="if:flag_error"*}}>
 Error!!
</font>
.--------------------

֥ɡ
.____________________
{{*:if(flag_error)*}}
  :print("<font color=\"red\">\n")
  :print(" Error!!\n")
  :print("</font>\n")
{{*:end*}}
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-if.html
.____________________



֤(foreach) | directive-foreach

{{,id="foreach:{{/var/}}={{/list/}}",}}סʤޤϡ{{,id="foreach:{{/var/}}:{{/list/}}",}}סˤȤ뤳Ȥǡꥹ{{,{{/list/}},}}ǤҤȤĤѿ{{,{{/var/}},}}ʤ顢֤Ԥޤ
.#֤ΤϳϥơλǤ

ץ쥼ơǡ
.-------------------- directive-foreach.html
<tr {{*id="foreach:user=user_list"*}}>
  <td>#{user}#</td>
</tr>
.--------------------

֥ɡ
.____________________
{{*:foreach(user = user_list)*}}
  :print("<tr>\n")
  :print("  <td>", user, "</td>\n")
  :print("</tr>\n")
{{*:end*}}
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-foreach.html
.____________________



֤(list) 	| directive-list

{{,id="list:{{/var/}}={{/list/}}",}}סʤޤϡ{{,id="list:{{/var/}}:{{/list/}}",}}סˤȤ뤳Ȥǡꥹ{{,{{/list/}},}}ǤҤȤĤѿ{{,{{/var/}},}}ʤ鷫֤Ԥޤ
{{,id="foreach:{{/var/}}={{/list/}}",}}פȤ褯ƤޤϥȽλޤ᤺Ƥ֤ۤʤޤ

ץ쥼ơǡ
.-------------------- directive-list.html
<tr {{*id="list:user=user_list"*}}>
  <td>#{user}#</td>
</tr>
.--------------------

֥ɡ
.____________________
:print("<tr>\n")
{{*:foreach(user = user_list)*}}
  :print("  <td>", user, "</td>\n")
{{*:end*}}
:print("</tr>\n")
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-list.html
.____________________



󥿤Ĥ֤(Foreach,List) | directive-foreach2


{{,id="Foreach:{{/var/}}={{/list/}}",}}פޤϡ{{,id="List:{{/var/}}={{/list/}}",}}פȤȡ󥿤䤷ʤ鷫֤Ԥޤ
󥿤1Ϥޤꡢѿ̾{{,{{/var/}}_ctr,}}Ǥ


ץ쥼ơǡ
.-------------------- directive-foreach2.html
<tr {{*id="Foreach:item=item_list"*}}>
  <td id="value:item_ctr">1</td>
  <td id="value:item">foo</td>
</tr>
.--------------------

֥ɡ
.____________________
{{*:set(item_ctr = 0)*}}
{{*:foreach(item = item_list)*}}
  {{*:set(item_ctr += 1)*}}
  :print("<tr>\n")
  :print("  <td>", item_ctr, "</td>\n")
  :print("  <td>", item, "</td>\n")
  :print("</tr>\n")
{{*:end*}}
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-foreach2.html
.____________________




ȥĤ֤(FOREACH,LIST)	| directive-foreach3


{{,id="FOREACH:{{/var/}}={{/list/}}",}}פޤϡ{{,id="LIST:{{/var/}}={{/list/}}",}}פȤȡȥĤη֤ԤȤǤޤ
ȥϡ֤󤫶󤫤ˤäơͤؤޤ
ȥѿ̾{{,{{/var/}}_tgl,}}Ǥ
ȥͤϥǥեȤǡ{{,'odd',}}פȡ{{,'even',}}פȤޤޥɥץ --odd_value  --even_value ǻǤޤ


ץ쥼ơǡ
.-------------------- directive-foreach3.html
<table>
  <tbody {{*id="LIST:item=item_list"*}}>
    <tr class="#{item_tgl}#">
      <td id="value:item">foo</td>
    </tr>
  </tbody>
</table>
.--------------------

֥ɡ
.____________________
:print("<table>\n")
:print("  <tbody>\n")
{{*:set(item_ctr = 0)*}}
{{*:foreach(item = item_list)*}}
  {{*:set(item_ctr += 1)*}}
  {{*:set(item_tgl = item_ctr % 2 == 0 ? 'even' : 'odd')*}}
  :print("    <tr class=\"", item_tgl, "\">\n")
  :print("      <td>", item, "</td>\n")
  :print("    </tr>\n")
{{*:end*}}
:print("  </tbody>\n")
:print("</table>\n")
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb guide.d/directive-foreach3.html
.____________________




֤(while) | directive-while


{{,id="while:{{/expression/}}",}}פȤ뤳Ȥǡ֤ԤȤǤޤ
ʤKwartzǤϡʸϼ(expression)ǤϤޤ󤬡whileξＰ˸¤äƤϼȤʸ񤯤ȤǤޤ


ޤJSTLVelocityǤϡwhileѴ褦Ȥȥ顼ˤʤޤ
ϡwhilteб륫ॿVelocityǥ쥯ƥ֤ʤǤ


ץ쥼ơǡ
.-------------------- directive-while.html
<tr {{*id="while:row=sth.fetch"*}}>
  <td>#{row[0]}#</td>
</tr>
.--------------------

֥ɡ
.____________________
{{*:while(row=sth.fetch)*}}
  :print("<tr>\n")
  :print("  <td>", row[0], "</td>\n")
  :print("</tr>\n")
{{*:end*}}
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb -l ruby,php,eruby,erb guide.d/directive-while.html
.____________________



ߡǡ | directive-dummy

{{,id="dummy:{{/name/}}",}}פȤ뤳ȤǡΥΡɤߡǡȤߤʤɤФޤ
{{,{{/name/}},}}ˤϡʣʤ褦Ŭʸ{{(ʸΤˤϡä˰̣Ϥޤ)}}Ƥ
{{/name/}}ϡҤȤĤXMLʸƱid°ͤȤʤ褦ˤ뤿ΤΤǤ
ʣʤ褦ŬʸƤ

ץ쥼ơǡ
.--------------------
<tr {{*id="dummy:d1"*}}>
  <td>bar</td>
</tr>
<tr {{*id="dummy:d2"*}}>
  <td>baz</td>
</tr>
.--------------------

֥ɡ
.____________________
                          ## Ϥʤ
.____________________

ѥץࡧ
.____________________
                          ## Ϥʤ
.____________________




Ȥִ 		| directive-replace


{{,id="replace:{{/name/}}",}}פȤ뤳ȤǡΥȤ̤ΥȤ֤뤳ȤǤޤ

ץ쥼ơǡ
.-------------------- directive-replace.html
<html>
  <body>
    <!-- ʥӥ -->
    <span {{*id="breadclumbs"*}}>
      <a href="/">Home</a>
      &gt; <a href="/ruby">Ruby</a>
      &gt; <a href="/ruby/kwartz">Kwartz</a>
    </span>

   ....

    <span {{*id="replace:breadclumbs"*}}>
      Home &gt; Ruby &gt; Kwartz
    </span>
  </body>
</html
.--------------------

֥ɡ
.____________________
.<<<:! ruby output.rb -a convert guide.d/directive-replace.html
.____________________



ץ쥼ơǡեɤ߹	| directive-include


{{,id="include:'{{/filename/}}'",}}פ¾Υץ쥼ơǡեHTMLեˤɤ߹ळȤǤޤ
̾{{,<span/>,}}Ѥơ{{,<span id="include:'{{/filename/}}'"/>,}}פΤ褦ˤޤKwartzǤϡǥ쥯ƥ֤ޤޤʤ{{,<span>,}}ϼưŪ˺ޤˡ


ץ쥼ơǡ(tab.html)
.-------------------- tab.html
<span style="border-width:1 1 0 1; border-style:solid; padding:1 5 1 5">
  <a href="#{tab['url']}#" id="value:tab['name']" style="text-decoration:none">TabName</a>
</span>
.--------------------

ץ쥼ơǡ(tab-main.html)
.-------------------- tab-main.html
<div id="foreach:tab:tablist">
  <span {{*id="include:'tab.html'"*}}/>
</div>
.--------------------

֥ɡ
.____________________
.<<<:! kwartz -a convert --include_path=guide.d guide.d/tab-main.html
.____________________


{{,include,}}ǥ쥯ƥ֤ɤ߹եϡ̥ǥ쥯ȥ֤ȤǤޤ
ե뤬֤Ƥǥ쥯ȥϡޥɥ饤󥪥ץ {{,--include_path={{/dir1/}},{{/dir2/}},...,}} ǻǤޤ

.====================
$ kwartz --include_path=dir1,dir2 tab-main.html
.====================




ץ쥼ơåեɤ߹	| directive-load


{{,id="load:'{{/filename/}}'",}}פ¾Υץ쥼ơåեɤ߹ळȤǤޤ
̾{{,<span/>,}}Ѥơ{{,<span id="load:'{{/filename/}}'"/>,}}פΤ褦ˤޤKwartzǤϡǥ쥯ƥ֤ޤޤʤ{{,<span>,}}ϼưŪ˺ޤˡ


̾֤ɤΥץ쥼ơåեѤ뤫פϥޥɥץ{{,-p,}}ޤ{{,-P,}}ǻꤷޤ
{{,load,}}ǥ쥯ƥ֤Ѥȡץ쥼ơǡǻꤹ뤳ȤǤޤ
ޤ{{,load,}}ǥ쥯ƥ֤ȥޥɥץȤƱ˻Ѥ뤳ȤǤޤ

{{,load,}}ǥ쥯ƥ֤ϥץ쥼ơǡեκǸ˽񤤤Ƥ
ʤȡɤ߹ץ쥼ơåץ쥼ơǡեˤäƾ񤭤뤳Ȥޤ


ץ쥼ơå(load-lib.plogic)
.-------------------- load-lib.plogic
:elem(item)
  :foreach(item=itemlist)
    @stag
    @cont
    @etag
  :end
:end

:macro(BEGIN)
  :print("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n")
  :print("<html lang=\"ja\">\n")
  :print(" <body bgcolor=\"#FFFFFF\">\n")
:end

:macro(END)
  :print(" </body>\n")
  :print("<html>\n")
:end
.--------------------

ץ쥼ơǡ(load-main.html)
.-------------------- load-main.html
<ul id="mark:itemlist">
  <li id="value:item">foobar</li>
</ul>
<span {{*id="load:'load-lib.plogic'"*}}/>
.--------------------

֥ɡ
.____________________
.<<<:! kwartz -a convert --load_path=guide.d guide.d/load-main.html
.____________________

ѥץࡧ
.____________________
.<<<:! ruby output.rb --load_path=guide.d guide.d/load-main.html
.____________________


{{,load,}}ǥ쥯ƥ֤ɤ߹եϡ̥ǥ쥯ȥ֤ȤǤޤ
ե뤬֤Ƥǥ쥯ȥϡޥɥ饤󥪥ץ {{,--load_path={{/dir1/}},{{/dir2/}},...,}} ǻǤޤ

.====================
$ kwartz --load_path=dir1,dir2 load-main.html
.====================





id°kd°ˤĤ	| directive-idkd


KwartzǤϡǥ쥯ƥ֤򵭽ҤΤid°kd°ѤǤޤ
ǤϡξԤλȤʬˤĤޤ


.* id°kd°⡢ǽȤƤƱǤޤid°Ƥޤ٤kd°˽񤤤Ƥưޤ


.* ҤȤĤΥid°kd°ξ򵭽Ҥ硢kd°Τۤͥ褵ޤ
   㤨С{{,id="name" kd="foreach:item=list",}}פȤ硢kd°ΤۤͭȤʤޤ


.* kd°˵Ҥǥ쥯ƥ֤{{,attr,}}Τߤξϡid°Υǥ쥯ƥ֤ͭȤʤޤ
   㤨С{{,id="name" kd="attr:href=url",}}פȤ硢ΥȤ̾{{,name,}}Ȥäƥޡ󥰤ޤ


.* HTMLλͤǤϡid°ͤ˴ޤ뤳ȤΤǤ뵭ϥС{{,_,}}ˡ{{,:,}}ˡԥꥪɡ{{,.,}}ˡϥե{{,-,}}ˤΤߤǤ
   Τᡢ{{,id="foreach:item=list",}}  {{,id="attr:name=value",}} ȤҤHTMLλͤߤޤΤǡ{{,id="foreach:item:list",}}  {{,id="attr:name:value",}} Ƚ񤯤ۤ褤Ǥ礦
   .#Τᡢ{{,id="foreach:item=list",}}  {{,id="value:item['user']",}} ȤҤϡHTMLλͤߤޤ󡣤դ


.* kd°ϡHTMLλͤˤϤʤȼ°Ǥ
   ΤᡢΤޤޤǤ{{<W3C Markup Vaidation Service|http://validator.w3.org>}}Τ褦HTMLڥġǥ顼Ȥʤޤ
   ǡkd°{{<W3C Markup Vaidation Service|http://validator.w3.org>}}CGI/PHPץȤѰդޤ
   ץȤKwartzΥ֤˴ޤޤƤޤ
   ޤ{{<|<http://www.kuwata-ab.com/webtech/kwartz/validator.php>}}Ǥ¹ԤǤޤ


.* kd°̾ϡޥɥ饤󥪥ץ {{,--attr_name={{/xxx/}},}} ѹ뤳ȤǤޤ
   㤨kd°Τstyle°Ȥϡ --attr_name=style ȤƤ




ջ	| directive-notes


ǥ쥯ƥ֤ѤݤջǤ


.* ҤȤĤid°ޤkd°ˤϤҤȤĤΥǥ쥯ƥ֤ҤǤޤ
   㤨С{{,id="set:var=100;value:var",}}פΤ褦ʵҤϥ顼ˤʤޤ
	.--------------------
	## NG
	<span id="set:var=100;value:var">???</span>
	.--------------------


.* attrǥ쥯ƥ֤¾Υǥ쥯ƥ֤Ȥä˵ҤǤޤ
   ޤʣ{{,attr,}}ǥ쥯ƥ֤ꤹ뤳ȤǤޤ
.#   äơ{{,id="foreach:var=list;attr:class=var.class;attr:href=var.href",}}פΤ褦ʵҤǽǤ
	.--------------------
	## OK
	<foo id="foreach:var=list;attr:class=var.class;attr:href=var.href">
	....
	</foo>
	.--------------------


.* ˥ǥ쥯ƥ֤ޤ᤿硢λϾάǤޤ
   ޤ{{,<foo .../>,}}Τ褦ʶǥϻѤǤޤ
	.--------------------
	## NG
	<ul>
	  <li id="value:item">foo
	</ul>
	## OK
	<a id="attr:name=refname"/>
	.--------------------


.* ǥ쥯ƥ֤ޤޤʤ褦<span></span>ϡޤ
   㤨С{{,Hello <span id="value:name">World</span>!,}}פȤץ쥼ơǡϡ<span></span>ơ{{,:print('Hello ', name, '!'),}}פȤ֥ɤѴޤ
	.--------------------
	## ץ쥼ơǡ
	Hello <span id="value:name">World</span>!
	## ֥
	:print("Hello ")
	:print(name)
	:print("!\n")
	.--------------------


.* ǥ쥯ƥ֤ޤॿǤϡۤ°ɬ{{,{{/attr/}}="{{/value/}}",}}פηǵҤ°̾°ͤάʤ褦ˤƤ
   HTML/XMLʳǤKwartzѤǤ褦ˤ뤿ΰտޤͤǤꡢХǤϤޤ
	.--------------------
	## NG
	<input type="checkbox" id="foreach:item=list" checked/>
	## OK
	<input type="checkbox" id="foreach:item=list" checked="checked"/>
	
	## NG
	<option id="attr:value=item.value" #{item.selected ? 'selected' : ''}#/>
	## OK
	<option value="#{item.value}#" #{item.selected ? 'selected' : ''}#>
	.--------------------


.* ǥ쥯ƥǤϡ{{,>,}}פȤʤ褦ˤƤ
   㤨С{{,<span id="while:i>0">,}}פȤϡ{{,<span id="while:0<i">,}}פȵҤƤ.^
   ϡKwartzǤϥץ쥼ơǡλϤɽˤѥޥåǹԤäƤ뤿Ǥ
   Τᡢ{{,<span id="while:i>0">,}}פϡ{{,<span id="while:i>,}}פȡ{{,0">,}}פȤʬƲᤵƤޤΤǡޤСȤǤޤդƤ
	.--------------------
	<span id="while:i>0"> ... </span>         ## NG
	<span id="while:0<i"> ... </span>         ## OK
	.--------------------


.* {{,id="set:var=flag?v1:v2",}}פ{{,id="value:flag?v1:v2",}}פʸˡ顼ˤʤޤ
   ϡ{{,:v2,}}פ{{,:print,}}פ{{,:if,}}פΤ褦ʸγϤȤߤʤ뤫Ǥ
   Τᡢ{{,:v2,}}פ򥫥åǰϤफ{{,:,}}פȡ{{,v2,}}פδ֤˶򤤤褦ˤƤ
	.--------------------
	<span id="set:var=flag?v1:v2"/>          ## NG
	<span id="set:var=flag?v1:(v2)"/>        ## OK
	<span id="set:var=flag?v1: v2"/>         ## OK
	.--------------------




ץ쥼ơѸPL | pl


KwartzѤƤָPL(Presentation Language)Ȥޤ
PLϡ2ĤӤǻѤޤ
.* ץ쥼ơǡ鼫ư֥ɤɽ
.* ץ쥼ơå򵭽Ҥ뤿


ĤޤꡢKwartzǤϥץ쥼ơǡץ쥼ơåPLɽ櫓Ǥ


ξϤǤϡPLνˤĤޤ



	| pl-comment

{{,#,}}פԤޤǤϥȤˤʤޤ
ϡ{{,#*,}}פ{{,#@,}}פʤɤ̰ǽޤ
ΤᡢǤХȤϡ{{,##,}}פˤƤ

.--------------------
## ϥ
.--------------------



ʸ | pl-string


ʸϡ{{,"...",}}פޤϡ{{,'...',}}פɽޤ
Ԥˤϲ(Line Feed)\nפ(Carriage Returen)\rפȥ(Tab)\tפޤ뤳ȤǤޤ

.--------------------
'foo bar'		## ʸ
"foo bar\n"		## Ԥޤʸ
.--------------------



͡null | pl-boolean


 {{,true,}}{{,false,}}{{,null,}} Ȥޤ

.--------------------
:set(flag = obj == null? true : false)
.--------------------


{{,true,}}{{,false,}}{{,null,}}ϳƸˤƼΤ褦Ѵޤ

.+--------------------
Ѵ	., true		., false	., null
.--------------------
Ruby,eRuby,ERB	., true		., false	., nil
PHP		., TRUE		., FALSE	., NULL
JSP(JSTL)	., true		., false	., null
Velocity	., true		., false	., -
.+--------------------
	{{,true,}}{{,false,}}{{,null,}}Ѵ


ʤVelocityǤnull䤽ह륭ɤޤ
ΤᡢnullޤPLץVelocityѴȥ顼ˤʤޤ
nullȤӤԤϡnullȤʤѴޤ


PLץࡧ
.-------------------- pl-boolean.plogic
:set(flag = obj == null? true : false)

:if (expr != null)
  :print("expr is not null.\n")
:else
  :print("epxr is null.\n")
:end
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate -l velocity guide.d/pl-boolean.plogic
.____________________



ѿ		| pl-variable


ѿJavaRubyƱ褦ˡե٥åȤȿȡ{{,_,}}פϢ³ΤǤ
Ƭʸϥե٥åȤޤϡ{{,_,}}פǤʤƤϤޤ


ޤѿˤϷʤѿ⤹ɬפޤ{{(顢ѿ˷ΤѿɬפʸKwartzбΤϺǤ)}}



黻	| pl-op


黻ҤˤϼΤΤѤǤޤŪˤϡʸѤȿѤȤǱ黻ҤʬƤϤޤ{{(PerlΤ褦ʸѤȿѤȤǱ黻ҤۤʤФƤϡKwartzбΤϺǤ)}}

.+--------------------
  ӱ黻	., {{,==  != < <= > >=,}}
  黻    ., {{,&& || !,}}
  ѱ黻    ., {{,+ - * / %,}}
  ʸϢ  ., {{,.+,}}
  黻    ., {{,?:,}}
.+--------------------


黻ҡ3黻ҡˤϡRubyPHPǤϻѤǤޤJSPʸ̩ˤJSTLμˤVelocityǤϻѤǤޤ
Τᡢ黻Ҥޤ༰ϡJSPVelocityǤifʸʤ䤽<c:choose>ˤѴޤ

PLץࡧ
.-------------------- pl-condop.plogic
:set(color = ctr%2==0 ? '#CCCCFF' : '#FFCCCC')
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-condop.plogic
.____________________



 | pl-print


Ϥϡ{{,:print(...),}}פɽޤˤǤդμ񤯤ȤǤޤ

PLץࡧ
.-------------------- pl-print.plogic
:print('foo', bar, "baz\n")   ## ʸѿ
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-print.plogic
.____________________


ư˥ǽѤϡRubyPHPeRubyERBǤϼΤ褦ʽϤˤʤޤ
.____________________
.<<<:! ruby output.rb -a translate -s -l ruby,php,eruby,erb guide.d/pl-print.plogic
.### PHP
.#foo<?php echo htmlspecialchars($bar); ?>baz
.#
.### eRuby
.#foo<%= CGI.escapeHTML(bar) %>baz
.#
.### ERB
.#foo<%= ERB::Util.h(bar) %>baz
.____________________


.#ޤư˥ǽѤƤ⡢黻Ҥ֤ͤʸޤϿǤϡ˥ޤ
.#
.#PLץࡧ
.#.-------------------- pl-print2.plogic
.### ˥
.#:print("<option ", condition ? var1 : var2, ">\n")
.### ˥ʤɬפʤ
.#:print("<option ", condition ? 'selected' : '', ">\n")
.#.--------------------
.#
.#ѥץȡ
.#.____________________
.#.<<<:! ruby output.rb -a translate -s -l ruby,php,eruby,erb guide.d/pl-print2.plogic
.#.____________________



 | pl-set


ϡ{{,:set({{/var/}}={{/value/}}),}}פǤ
{{,(,}}פ{{,=,}}פ˶Ƥ⹽ޤ


ޤ{{,+=,}}ס{{,-=,}}ס{{,*=,}}ס{{,/=,}}ס{{,%=,}}ס{{,.+=,}}פѤǤޤ
ǸΡ{{,.+=,}}פʸϢɽޤ


PLץࡧ
.-------------------- pl-set.plogic
:set(name = 'Foo')      ## ѿʸ'Foo'
:set(count += 1)        ## ѿͤ1䤹
:set(str .+= '.txt')    ## ʸɲ
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-set.plogic
.____________________



󡢥ϥå	| pl-array


ϡ{{,arr[expr],}}פηǻȤǤޤ
ϥåƱǻȤǤޤ{{(ȥϥåȤƱ黻ҤѤƤ뤿ᡢPerlΤ褦˰ۤʤ黻ҤɬפȤץߥ󥰸ؤѴϺǤ)}}


PLץࡧ
.-------------------- pl-array.plogic
:set(list[n] = 10)         ## nܤǤ
:print(list[i], "\n")      ## iܤǤ
:set(hash['key'] = 'foo')  ## ϥåǤ
:print(hash['key'])        ## ϥåǤ
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-array.plogic
.____________________


.#ϥåϡhash{'key'}פޤϡhash[:key]פѤǤޤԤʸ˵ޤळȤǤΤФԤǤϥȤƱѿȡ{{,_,}}פѤǤޤ󡣤RubyǤϸԤSymbol򥭡ȤƻȤޤ


ϥåϡ{{,hash[:key],}}פȤǤ⻲ȤǤޤ
ΤȤ{{,key,}}פϱѿȡ{{,_,}}פΤߤʤʸǤɬפޤ


{{,hash[:key],}}פϡƥץ˱ƼΤ褦Ѵޤ
.+--------------------
   åȸ	., Ѵ
.---------------------
   Ruby, eRuby, ERB	., {{,hash[:key],}}
   PHP			., {{,$hash['key'],}}
   JSP			., {{,hash['key'],}}
   Velocity		., {{,hash.key,}}
.+--------------------


PLץࡧ
.-------------------- pl-hash.plogic
:set(hash[:key] = 'foo')
:print(hash[:key])
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-hash.plogic
.____________________



ץѥƥ | pl-property


֥ȤΥץѥƥϡ{{,{{/object/}}.{{/property/}},}}פηǻȤޤ
ץѥƥϥ᥽åɸƤӽФǤϤʤΤǡȤ뤳ȤϤǤޤ


ޤPLǤϥ֥Ȥץѥƥ򻲾Ȥ뤳ȤϤǤƤ⡢֥Ȥʬꥯ饹ꤹ뤳ȤϤǤޤ
PLγǡʤĤޤᥤץǡ˹Ԥ뤳Ȥˤʤޤ


PLץࡧ
.-------------------- pl-property.plogic
:print(user.name)
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-property.plogic
.____________________



֤	| pl-foreach


֤ϡ{{,:foreach({{/var/}}={{/list/}}) ... :end,}}פɽޤ
foreachʸǤꡢ{{,{{/list/}},}}ǤҤȤĤҤȤ{{,{{/var/}},}}ʤ鷫֤Ԥޤ


PLץࡧ
.-------------------- pl-foreach.plogic
:foreach(item = list)      ## listǤitemʤ
  :print(item, "\n")       ## ֤Ϥ
:end
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-foreach.plogic
.____________________


ޤwhileʸѤǤޤ
JSTLˤwhileʸ륫ॿʤᡢJSPѴ褦Ȥȥ顼ˤʤޤ
ޤVelocitywhileʸVelocityǥ쥯ƥ֤ʤᡢѴ˥顼Ȥʤޤ


PLץࡧ
.-------------------- pl-while.plogic
:set(i = 0)
:while(i < length)
  :print(list[i])
  :set(i += 1)
:end
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate -l ruby,php,eruby,erb guide.d/pl-while.plogic
.____________________


ʤJavaCΤ褦forʸѰդƤޤ󡣤դ



ʬ | pl-if


ʬϡ{{,:if({{/condition/}}) ... :elsif({{/condition/}}) ... :else ... :end,}}פɽޤ

PLץࡧ
.-------------------- pl-if.plogic
:if(ctr % 2 == 0)         ## ʤ
  :set(klass='even')      ## ʸ'even'
:else                     ## ʤ
  :set(klass='odd')       ## ʸ'odd'
:end
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-if.plogic
.____________________



ޥ 	| pl-macro


PLǤϡޥ뤳ȤǤޤ
ޥϡ{{,:macro({{/macro_name/}}) ... :end,}}פ{{,:expand({{/macro_name/}}),}}פޤϡ{{,@{{/macro_name/}},}}פŸޤ


Ǥϡ<li>#{item}#</li>פ򳫻ϥơλ3Ĥʬ䤷ޥȤƤޤ


.-------------------- pl-macro.plogic
## 3ĤΥޥ
:macro(stag_item)
  :print("<li>")
:end

:macro(cont_item)
  :print(item)
:end

:macro(etag_item)
  :print("</li>")
:end

## <li>#{item}#</li>פƱ̤ˤʤ
:expand(stag_item)
:expand(cont_item)
:expand(etag_item)
.--------------------


ޥǥޥŸȤȤǤޤ

.-------------------- pl-macro2.plogic
## ޥ
:macro(stag_item)
  :print("<li>")
:end

:macro(cont_item)
  :print(item)
:end

:macro(etag_item)
  :print("</li>")
:end

:macro(elem_item)    ## ޥŸޤޥ
  :expand(stag_item)
  :expand(cont_item)
  :expand(etag_item)
:end

## ޥŸ졢<li>#{item}#</li>פƱ̤ˤʤ
:expand(elem_item)
.--------------------

.#ޤޥŸδάɽȤơ{{,@{{/macro_name/}},}}פѤǤޤ
.#ϡ{{,:expand({{/macro_name/}},}}פƱǤ


ޤѤΥޥñ˽񤱤빽ʸѰդƤޤ
ιʸϥѤΥޥǤѤǤޤ
.-------------------- pl-macro3.plogic
## ѤΥޥ
:elem(item)
  @stag
  @cont
  @etag
:end

## ϼƱ
:macro(elem_item)
  :expand(stag_item)
  :expand(cont_item)
  :expand(etag_item)
:end
.--------------------


{{,@stag,}}, {{,@cont,}}, {{,@etag,}}  {{,:elem() .. :end,}} ǤΤ߻ѲǽǤ
{{,:macro() .. :end,}} ǤϻѤǤޤ
.-------------------- pl-macro4.plogic
## NG
:macro(elem_item)	## :elem(item) ȤʤФʤʤ
  @stag
  @cont
  @etag
:end
.--------------------


⤦ҤȤġȤƤ򼰤֤ͤ뤿ѹʸѰդƤޤ
ϡǥ쥯ƥ֤Ǥ {{,id="value:{{/expr/}}",}} 뵡ǽǤ
.--------------------
## ȤƤ򼰤֤ͤ
:value(item = expr)

## ϼƱ
:macro(cont_item)
  :print(expr)
:end
.--------------------


ʤȤ褦ʥޥǤޤ



ޥBEGNEND		| pl-begend


BEGINפȡENDפ̤ʥޥǤ
ΥޥȡѥץȤκǽȺǸǤդΥɤɲäǤޤ


ץ쥼ơǡ
.-------------------- pl-begend.html
  Hello <span id="value:user">World</span>!
.--------------------


PLץࡧ
.-------------------- pl-begend.plogic
:macro(BEGIN)
  :print("<html>\n")
  :print(" <body>\n")
:end
:macro(END)
  :print(" </body>\n")
  :print("</html>\n")
:end
.--------------------


ѥץȡ
.____________________
.<<<:! ruby output.rb -l ruby,php -p guide.d/pl-begend.plogic guide.d/pl-begend.html
.____________________




ؿ		| pl-func

PLǤϡʲδؿѤ뤳ȤǤޤ
.: E({{/expr/}})
	 {{/expr/}} 򥵥˥ޤ˥ϥޥɥ饤󥪥ץλ˴ؤ餺Ԥޤ
.: X({{/expr/}})
	 expr 򥵥˥ޤ󡣤Ĥޤꥳޥɥ饤󥪥ץǥ˥褦ꤵƤƤ⡢X({{/expr/}})ǻꤵ줿ϥ˥ޤ

ߤΤȤʳδؿ桼ͳ뤳ȤϤǤޤ




empty		| pl-empty

ͤnullޤ϶ʸ󤫤ɤĴ٤뤿ͽ{{,empty,}}פѰդƤޤ
{{,empty,}}פϡ{{,==,}}פޤϡ{{,!=,}}פαդˤΤ֤ȤǤդnullʸʤ鿿򡢤ʳʤ鵶֤ޤ

PLץࡧ
.-------------------- pl-empty.plogic
:if (str1 == empty)
  :print("str1 is empty.\n")
:elsif(str2 != empty)
  :print("str2 is not empty.\n")
:end
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate guide.d/pl-empty.plogic
.____________________



ץ쥼ơåեɤ߹	| pl-load


{{,:load('{{/filename/}}'),}}פ¾Υץ쥼ơåեɤ߹ߤޤ
ޤޥɥ饤󥪥ץ {{,--load_path={{/dir1/}},{{/dir2/}},...,}} ǡɤ߹ե뤬ǥ쥯ȥǤޤ


PLץࡧ
.-------------------- pl-load.plogic
:load('file.plogic')
.--------------------

ʤɤ߹ळȤǤΤϥץ쥼ơåեǤ
ץ쥼ơǡեϥץɤ߹ळȤǤޤ




åȸΥץॳ | pl-rawcode


åȸΥץॳɤľܵҤ뤳ȤǤޤ
Τˤϡ{{,::: {{/raw code/}},}}פȤޤ
{{,:::,}}פμʸԤޤǤΤޤ޽Ϥޤ


ϡPHPΥɤľܵҤǤ


PLץࡧ
.-------------------- pl-rawcode.plogic
::: <?php foreach($hash as $key => $value) { ?>
:print("key=", key, " value=", value, "\n")
::: <?php } ?>
.--------------------

ѥץȡ
.____________________
.<<<:! ruby output.rb -a translate -l php guide.d/pl-rawcode.plogic
.# <?php foreach($hash as $key => $value) { ?>
.#key=<?php echo $key; ?> value=<?php echo $value; ?>
.# <% } %>
.____________________


.#åȸΥץॳɤľܵҤϡǤ¾θǤϻѤǤʤʤޤ
.#Ǥ⹽ʤˤΤ߻ѤƤ

ޥɥ饤󥪥ץ {{,--enable_eruby=true,}} Ѥ뤳Ȥǡץ쥼ơåʣθळȤǤޤ
ܤϡ{{<ץ쥼ơåeRubyɤ򵭽Ҥ|#tips-eruby>}}פ




.#ѿΥ 	| pl-scope
.#
.#
.#PLǤϡѿΥספȤǰϤޤ㤨С֤ޥͭѿפǤޤ
.#.#ѿϤ٤ƥХȤưޤޥϴؿǤϤʤΤǡޥǥѿǤޤ
.#
.#
.#Ǥϡޥelem_itemꤷѿitemޥcont_itemǻѤƤޤ
.#
.#.-------------------- pl-scope.plogic
.#:macro(stag_item)
.#  :print("<li id=\"item\">")
.#:end
.#
.#:macro(cont_item)
.#  :print(item)                # ѿitem
.#:end
.#
.#:macro(etag_item)
.#  :print("</li>")
.#:end
.#
.#:macro(elem_item)
.#  :foreach(item = item_list)  # ѿitem
.#    :expand(stag_item)
.#    :expand(cont_item)
.#    :expand(etag_item)
.#  :end
.#:end
.#
.#
.## item_list 'foo''bar'... äƤȤ
.## <li>foo</li><li>bar</li>... Ϥ
.#:expand(elem_item)
.#.--------------------
.#



Хѿȥѿ	 | pl-global-local


KwartzǤϡᥤץफѥץϤѿ򥰥Хѿƥץ졼ȤǻѤѿѿȸƤǤޤ


㤨мΤ褦ʥץ쥼ơǡȥץ쥼ơåͤޤ


ץ쥼ơǡ(analyze.html)
.-------------------- analyze.html
<html>
  <body>
    <table>
      <caption id="value:{{*title*}}">Sample</caption>
      <tr id="item_list" bgcolor="#{{{*color*}}}#">
        <td id="value:{{*item_ctr*}}">1</td>
	<td id="value:{{*item*}}">Foo</td>
      </tr>
    </table>
  </body>
</html>
.--------------------


ץ쥼ơå(analyze.plogic)
.-------------------- analyze.plogic
:elem(item_list)
  :set({{*item_ctr*}} = 0)
  :foreach({{*item*}} = {{*item_list*}})
    :set({{*item_ctr*}} += 1)
    :set({{*color*}} = {{*item_ctr*}}%2 == 0 ? '#FFCCCC' : '#CCCCFF')
    @stag
    @cont
    @etag
  :end
:end
.--------------------


ĤѿǤƤޤϼΤ褦ʬǤޤ
.[ Хѿ ]
	 ѿ {{,title,}}  {{,item_list,}} ϡᥤץफƥץ졼ȤϤѿǤꡢᥤץͤꤹɬפޤ
	KwartzǤϤ򥰥ХѿȸƤǤޤ
.[ ѿ ]
	ѿ {{,item,}}  {{,item_ctr,}}  {{,color,}} ϥƥץ졼ȤǻѤѿǤꡢᥤץꤹɬפϤޤ
	KwartzǤϤѿȸƤǤޤ


kwartzޥɤ˥ץ {{,-a analyze,}} ĤƵưȡƥץ졼ȤʬϤƥХѿȥѿ𤷤Ƥޤ
.--------------------
$ kwartz -p analyze.plogic -a analyze analyze.html
global variables: {{*title*}} {{*item_list*}}
local variables:  {{*color*}} {{*item*}} {{*item_ctr*}}
.--------------------


ΤȤKwartzϼΤ褦ʥ롼ǥХѿȥѿȤȽ̤Ƥޤ
.* ѿƸ줿Ȥˡ
    .- ʸκդ˸줿ѿϥѿ
    .- foreachʸΥ롼ѿȤƸ줿ѿϥѿ
    .- ʳϥХѿ


ޤХѿꡢХѿ롼ѿȤƤȡʬϻ˷ٹФޤ
ʤʤ顢ƥץ졼ȥƥϥᥤץꤵ줿ǡɽΤߤԤ٤Ǥꡢѹ٤ǤϤʤ顢ĤޤꥰХѿѹ٤ǤϤʤǤѹƤ褤ΤϥѿΤߤΤϤǤˡ
ΤۤƤʤѿȤƤʬϻ˷ٹ𤬽Фޤ


ƥץ졼ȡʥץ쥼ơǡȥץ쥼ơåˤʣˤʤȡᥤץꤷʤФʤʤѿɤ줫狼Ť餯ʤ뤳Ȥޤ
Τ褦ʤȤϡʬϵǽѤƤѿ̾Υץߥ⸫Ĥ䤹ʤޤ




ջ	| pl-notes


.#.* ʸϡ{{,'...',}}פɽޤ{{,"...",}}פϻȤޤΤդƤ
.#	.--------------------
.#	:set(str = "foo")		## NG
.#	:set(str = 'foo')		## OK
.#	.--------------------


.* {{,:print(condition?v1:v2),}}פ{{,:set(var=flag?v1:v2),}}פʸˡ顼ˤʤޤ
   ϡ{{,:v2,}}פ{{,:print,}}פ{{,:if,}}פΤ褦ʸγϤȤߤʤ뤫Ǥ
   Τᡢ{{,:v2,}}פ򥫥åǰϤफ{{,:,}}פȡ{{,v2,}}פδ֤˶򤤤褦ˤƤ
	.--------------------
	:set(var=flag?v1:v2)            ## NG
	:set(var=flag?v1:(v2))          ## OK
	:set(var=flag?v1: v2)           ## OK
	.--------------------


.* ޥޥŸҤˤʤäƤȡѥ̵¥롼פˤʤäƤޤޤ
   Ҥˤʤ褦դƤ
	.--------------------
	:macro(elem_foo)
	  :expand(stag_foo)
	  :expand(elem_foo)		## ҤˤʤäƤ
	  :expand(etag_foo)
	:end
	
	:expand(elem_foo)		## ̵¥롼
	.--------------------



̤ʤޤϸƤˤεǽ  | pl-infuture

ʲεǽϼƤޤ󤬡ˤƼ뤫⤷ޤ

.* break, continue
.* 桼ؿ
.* ᥽åɸƤӽФ
.* Ĥޥ
.* ϥåκ



Ū | practice


KwartzѤŪ򼨤ޤ


ԤȴԤȤطʿѤơ֥ | practice-table1

ԤȴԤȤǥơ֥طʿѤ륵ץǤ
٤ʤ顢ץ쥼ơḁ̊եȤѰդʤƤ⡢ǥ쥯ƥ֤ǺѤޤΤǤ礦

ץ쥼ơǡ(table1.html)
.-------------------- table1.html
<table border="0">
  <tbody {{*id="Foreach:user=user_list"*}}>
    <tr bgcolor="#CCCCFF"
        {{*id="attr:bgcolor=color;set:color=user_ctr%2==0?'#FFCCCC':'#CCCCFF'"*}}>
      <td {{*id="value:user[:name]"*}}>foo</td>
      <td {{*id="value:user[:email]"*}}>foo@foo.com</td>
    </tr>
    <tr {{*id="dummy:d1"*}}>
      <td>bar</td>
      <td>bar@bar.net</td>
    </tr>
    <tr {{*id="dummy:d2"*}}>
      <td>baz</td>
      <td>baz@baz.org</td>
    </tr>
  </tbody>
</table>
.--------------------

֥ɡ
.____________________
.<<<:! kwartz -a convert guide.d/table1.html
.____________________

ѥ롧
.====================
$ kwartz -l ruby     table1.html > table1.rb
$ kwartz -l ruby2    table1.html > table1.rb2
$ kwartz -l php      table1.html > table1.php
$ kwartz -l jsp      table1.html > table1.jsp
$ kwartz -l eruby    table1.html > table1.rhtml
$ kwartz -l erb      table1.html > table1.erb
$ kwartz -l velocity table1.html > table1.vm
.====================


.#ѥץࡧ
.#.____________________
.#.<<<:! ruby output.rb guide.d/table1.html
.#.____________________



ѥ뤹ȡΤ褦ʽѥץबޤ

Ruby:
.____________________
.<<<:! kwartz -l ruby guide.d/table1.html
.____________________

Ruby2:
.____________________
.<<<:! kwartz -l ruby2 guide.d/table1.html
.____________________

PHP:
.____________________
.<<<:! kwartz -l php guide.d/table1.html
.____________________

JSP:
.____________________
.<<<:! kwartz -l jsp guide.d/table1.html
.____________________

eRuby:
.____________________
.<<<:! kwartz -l eruby guide.d/table1.html
.____________________

ERB:
.____________________
.<<<:! kwartz -l erb guide.d/table1.html
.____________________

Velocity:
.____________________
.<<<:! kwartz -l velocity guide.d/table1.html
.____________________




.#ԤȴԤȤطʿѤơ֥(2) | practice-table2
.#
.#
.#ۤɤϡޡ󥰤ǹԤȤǤޤ
.#
.#
.#ץ쥼ơǡϼΤ褦ˤʤޤ
.#
.#
.#ץ쥼ơǡ(table2.html)
.#.-------------------- table2.html
.#<table border="0">
.#  <tbody {{*id="mark:user_list"*}}>
.#    <tr bgcolor="#CCCCFF" {{*id="mark:odd"*}}>
.#      <td {{*id="mark:user_name"*}}>foo</td>
.#      <td {{*id="mark:user_mail"*}}>foo@foo.com</td>
.#    </tr>
.#    <tr bgcolor="#FFCCCC" {{*id="mark:even"*}}>
.#      <td {{*id="mark:user_name"*}}>bar</td>
.#      <td {{*id="mark:user_mail"*}}>bar@foo.com</td>
.#    </tr>
.#    <tr {{*id="mark:dummy"*}}>
.#      <td>baz</td>
.#      <td>baz@baz.org</td>
.#    </tr>
.#  </tbody>
.#</table>
.#.--------------------
.#
.#
.#ơΤ褦ʥץ쥼ơåѰդޤ
.#ݥȤϼΤȤǤ
.#.* {{,mark:odd,}}פĤȤԤ򡢡{{,mark:even,}}פΥȤԤɽޤ
.#.* ֤Ԥʤ顢ԡԤΥȤΥޥŸޤ
.#   ΤȤߡѤΥȤϽϤʤ褦ˤƤޤ
.#.* 桼̾Υȡ{{,mark:user_name,}}ˤ񤭤ơѿ{{,user['name'],}}ͤϤޤ
.#   Ʊͤˡ᡼륢ɥ쥹Υȡ{{,mark:user_mail,}}ˤ񤭤ơѿ{{,user['mail'],}}ͤϤޤ
.#.* ԤȶԤǤϡطʿϰäƤɽǡƱʤΤǡǡѤΥȤˤƱޡ󥰤ȤäƤޤ
.#
.#
.#ץ쥼ơå(table2.plogic)
.#.-------------------- table2.plogic
.### ֤Ԥ
.#:elem(user_list)
.#  @stag
.#  :set(user_ctr = 0)
.#  :foreach(user = user_list)
.#    :set(user_ctr += 1)
.#    :if(user_ctr % 2 == 0)
.#      @elem_even             ## Ԥ
.#    :else
.#      @elem_odd              ## Ԥ
.#    :end
.#  :end
.#  @etag
.#:end
.#
.### ѿ user[:name]  user[:mail] ͤϤ褦ѹ
.#:elem(user_name)
.#  @stag
.#  :print(user[:name])        ## @cont Τ user[:name]
.#  @etag
.#:end
.#
.#:elem(user_mail)
.#  @stag
.#  :print(user[:mail])        ## @cont Τ user[:mail]
.#  @etag
.#:end
.#.--------------------
.#
.#
.#ѥ롧
.#.====================
.#$ kwartz -p table2.plogic -l ruby     table2.html > table2.rb
.#$ kwartz -p table2.plogic -l php      table2.html > table2.php
.#$ kwartz -p table2.plogic -l jsp      table2.html > table2.jsp
.#$ kwartz -p table2.plogic -l eruby    table2.html > table2.rhtml
.#$ kwartz -p table2.plogic -l erb      table2.html > table2.erb
.#$ kwartz -p table2.plogic -l velocity table2.html > table2.vm
.#.====================
.#
.#
.#.#ѥץࡧ
.#.#.____________________
.#.#.<<<:! ruby output.rb guide.d/table2.html
.#.#.____________________
.#
.#
.#ѥ뤹ȡΤ褦ʽѥץबޤ
.#
.#Ruby:
.#.____________________
.#.<<<:! kwartz -p guide.d/table2.plogic -l ruby guide.d/table2.html
.#.____________________
.#
.#PHP:
.#.____________________
.#.<<<:! kwartz -p guide.d/table2.plogic -l php guide.d/table2.html
.#.____________________
.#
.#JSP:
.#.____________________
.#.<<<:! kwartz -p guide.d/table2.plogic -l jsp guide.d/table2.html
.#.____________________
.#
.#eRuby:
.#.____________________
.#.<<<:! kwartz -p guide.d/table2.plogic -l eruby guide.d/table2.html
.#.____________________
.#
.#ERB:
.#.____________________
.#.<<<:! kwartz -p guide.d/table2.plogic -l erb guide.d/table2.html
.#.____________________
.#
.#Velocity:
.#.____________________
.#.<<<:! kwartz -p guide.d/table2.plogic -l velocity guide.d/table2.html
.#.____________________
.#
.#



ּפפɽʥӥ	| practice-navilink


ϢHTMLեɽȤϡּ˿ʤפפȤ󥯤Ĥ뤳Ȥ¿Ǥ
Υ󥯤򡢼Τ褦ˤǺޤ
.* ᥤץ¦ǡΥڡΥڡɽ󥯤URLѿnext_urlprev_urlꤷޤ
   ⤷ΥڡΥڡʤϡѿˤnullꤷޤ
.* ƥץ졼¦ǡѿnext_urlprev_urlȤ˥<a></a>Ȥäƥ󥯤ɽޤ
   ѿnullξϥɽޤ
.* 󥯤ϡʸϤƬȺǸξ֤ޤ


ץ쥼ơǡ(navilink.html)
.-------------------- navilink.html
<html>
  <body>
    <span {{*id="mark:navilink"*}}>
      <a {{*id="mark:prev"*}} href="{{*#{prev_url}#*}}">
        &lt; Previous page
      </a>
      &nbsp;
      <a {{*id="mark:next"*}} href="{{*#{next_url}#*}}">
        Next page &gt;
      </a>
    </span>

    ......
    ......
    ......

    <span {{*id="mark:navilink2"*}}>
      &lt; Previous page  &nbsp;  Next page &gt;
    </span>

  </body>
</html>
.--------------------


ץ쥼ơå(navilink.plogic)
.-------------------- navilink.plogic
## URLnullΤȤϡϥȽλɽʤ
:elem(next)
  :if(next_url != null)
    @stag
    @cont
    @etag
  :else
    @cont
  :end
:end
:elem(prev)
  :if(prev_url != null)
    @stag
    @cont
    @etag
  :else
    @cont
  :end
:end

## navilink2򥨥navilink֤
:elem(navilink2)
  @elem_navilink
:end
.--------------------


ʤ 'navilink2' 򥨥 'navilink' ֤ˤϡǥ쥯ƥ֡{{,kd="replace:navilink",}}פȤäƤ褤Ǥ



ѥ롧
.====================
$ kwartz -p navilink.plogic -l ruby  navilink.html > navilink.rb
$ kwartz -p navilink.plogic -l ruby2 navilink.html > navilink.rb2
$ kwartz -p navilink.plogic -l php   navilink.html > navilink.php
$ kwartz -p navilink.plogic -l jsp   navilink.html > navilink.jsp
$ kwartz -p navilink.plogic -l eruby navilink.html > navilink.rhtml
$ kwartz -p navilink.plogic -l erb   navilink.html > navilink.erb
$ kwartz -p navilink.plogic -l velocity navilink.html > navilink.vm
.====================


.#ѥץࡧ
.#.____________________
.#.<<<:! ruby output.rb -p guide.d/navilink.plogic guide.d/navilink.html
.#.____________________


ѥ뤹ȡΤ褦ʽѥץबޤ

Ruby:
.____________________
.<<<:! ruby output.rb -l ruby --no_langheader -p guide.d/navilink.plogic guide.d/navilink.html
.____________________

Ruby2:
.____________________
.<<<:! ruby output.rb -l ruby2 --no_langheader -p guide.d/navilink.plogic guide.d/navilink.html
.____________________

PHP:
.____________________
.<<<:! ruby output.rb -l php --no_langheader -p guide.d/navilink.plogic guide.d/navilink.html
.____________________

JSP:
.____________________
.<<<:! kwartz -l jsp -p guide.d/navilink.plogic guide.d/navilink.html
.____________________

eRuby:
.____________________
.<<<:! ruby output.rb -l eruby --no_langheader -p guide.d/navilink.plogic guide.d/navilink.html
.____________________

ERB:
.____________________
.<<<:! ruby output.rb -l erb --no_langheader -p guide.d/navilink.plogic guide.d/navilink.html
.____________________

Velocity:
.____________________
.<<<:! ruby output.rb -l velocity --no_langheader -p guide.d/navilink.plogic guide.d/navilink.html
.____________________




Breadcrumbs		| practice-breadcrumbs

WebڡˤϤ褯Home > Ruby > KwartzפΤ褦ʥ󥯤ĤƤޤ
BreadcrumbsפޤϡTrailפȤǤ


򡢼Τ褦ˤǺޤ
.* ᥤץǡȥȥѥϥå˳Ǽ˳Ǽ롣
.* ƥץ졼¦ǡ֤ˡ{{,&gt;,}}פϤߤʤɽ롣



ᥤץࡧ
.-------------------- breadcrumbs.main
## Ruby
breadcrumbs = []
breadcrumbs << { :title => 'Home',   :path => '/' }
breadcrumbs << { :title => 'Ruby',   :path => '/ruby/' }
breadcrumbs << { :title => 'Kwartz', :path => '/ruby/kwartz/' }

## PHP
$breadcrumbs = array('title' => 'Home',   'path' => '/');
$breadcrumbs = array('title' => 'Ruby',   'path' => '/ruby/');
$breadcrumbs = array('title' => 'Kwartz', 'path' => '/ruby/kwartz/');

## Java
List breadcrumbs = new ArrayList();
Map  hash = new HashMap();
hash.put('title', 'Home');
hash.put('path',  '/');
breadcrumbs.add(hash);
hash = new HashMap();
hash.put('title', 'Ruby')
hash.put('path', '/ruby/')
breadcrumbs.add(hash);
hash = new HashMap();
hash.put('title', 'Kwartz')
hash.put('path', '/ruby/kwartz/')
breadcrumbs.add(hash);
.--------------------


ץ쥼ơǡ
.-------------------- breadcrumbs.html
<span {{*id="mark:breadcrumbs"*}}>
  <a {{*id="mark:item"*}} href="{{*#{item_path}#*}}">
    <span {{*id="value:item_title"*}}>Home</span>
  </a>
  <span {{*id="mark:arrow"*}}> &gt; </span>
</span>
.--------------------


ץ쥼ơå
.-------------------- breadcrumbs.plogic
:elem(breadcrumbs)
  :set(item_ctr = 0)
  :foreach(item = breadcrumbs)
    :set(item_ctr += 1)
    :if(item_ctr > 1)       ## ֤2ܰʹߤǤ
      @elem_arrow           ## &lt; ɽ
    :end
    @elem_item              ## <a></a>ɽ롣
  :end
:end

:elem(item)
  :set(item_path  = item[:path])   ## ϥå夫ѥ̾
  :set(item_title = item[:title])  ## ȥФ
  :if(item_path!=null)
    @stag
    @cont
    @etag
  :else                     ## ѥ̾nullʤ
    @cont                   ## <a></a>ɽʤ
  :end
:end
.--------------------


ѥ롧
.====================
$ kwartz -p breadcrumbs.plogic -l ruby  breadcrumbs.html > breadcrumbs.rb
$ kwartz -p breadcrumbs.plogic -l ruby2 breadcrumbs.html > breadcrumbs.rb2
$ kwartz -p breadcrumbs.plogic -l php   breadcrumbs.html > breadcrumbs.php
$ kwartz -p breadcrumbs.plogic -l jsp   breadcrumbs.html > breadcrumbs.jsp
$ kwartz -p breadcrumbs.plogic -l eruby breadcrumbs.html > breadcrumbs.rhtml
$ kwartz -p breadcrumbs.plogic -l erb   breadcrumbs.html > breadcrumbs.erb
$ kwartz -p breadcrumbs.plogic -l velocity breadcrumbs.html > breadcrumbs.vm
.====================


.#ѥץࡧ
.#.____________________
.#.<<<:! ruby output.rb -p guide.d/breadcrumbs.plogic guide.d/breadcrumbs.html
.#.____________________


ѥ뤹ȡΤ褦ʽѥץबޤ

Ruby:
.____________________
.<<<:! kwartz -l ruby -p guide.d/breadcrumbs.plogic guide.d/breadcrumbs.html
.____________________

Ruby2:
.____________________
.<<<:! kwartz -l ruby2 -p guide.d/breadcrumbs.plogic guide.d/breadcrumbs.html
.____________________

PHP:
.____________________
.<<<:! kwartz -l php -p guide.d/breadcrumbs.plogic guide.d/breadcrumbs.html
.____________________

JSP:
.____________________
.<<<:! kwartz -l jsp -p guide.d/breadcrumbs.plogic guide.d/breadcrumbs.html
.____________________

eRuby:
.____________________
.<<<:! kwartz -l eruby -p guide.d/breadcrumbs.plogic guide.d/breadcrumbs.html
.____________________

ERB:
.____________________
.<<<:! kwartz -l erb -p guide.d/breadcrumbs.plogic guide.d/breadcrumbs.html
.____________________

Velocity:
.____________________
.<<<:! kwartz -l velocity -p guide.d/breadcrumbs.plogic guide.d/breadcrumbs.html
.____________________




顼åɽ


Ｐˤäɽڤؤ򼨤ޤ
Ǥϡѿerror_reportͤnullɤɽڤؤ뤳Ȥˤޤ


ץ쥼ơǡ
.--------------------
<span {{*id="error_report"*}}>
  <span {{*id="noerror"*}}>顼Ϥޤ</span>
  <font {{*id="error"*}} color="red">顼ȯޤ</font>
</span>
.--------------------


ץ쥼ơå
.--------------------
:elem(error_report)
  @stag
  :if(error_report == null)
     @elem_noerror	## ֥顼Ϥޤפ
  :else
     @elem_error	## ֥顼ȯޤפ
  :end
  @etag
:end
.--------------------


ץ쥼ơåǤϡȤơ{{,@cont,}}ˤѤ¾Υȡ{{,@elem_noerror,}}{{,@elem_error,}}ˤľܻѤƤޤ
ΤǤΤǡФƤȤ褤Ǥ礦


ޤ顼åʣꡢ줬˳ǼƤϼΤ褦ˤޤ


ץ쥼ơǡ
.-------------------- error_list.html
<font {{*id="error_list"*}} color="red">
  <span {{*id="value:error"*}}>̾ϤƤޤ</span><br>
</font>
.--------------------


ץ쥼ơå
.-------------------- error_list.plogic
:elem(error_list)
  :if(error_list != null)
    @stag
    :foreach(error = error_list)
      @cont
    :end
    @cont
  :end
:end
.--------------------


ʤ֥ץ쥼ơȥӥͥåʬΥפȤ餤ȡ顼åᥤץꤹ٤ǤϤޤ󡣤ʤʤ顢顼ȯȤˡ֤ɤʥ顼åɽ뤫פȤΤϥץ쥼ơءʤĤޤƥץ졼ȡˤô٤Ǥ

δ餤ȡ顼åϼΤ褦ˤ뤳Ȥ˾ޤǤ
.* ᥤץǥϥåѰդ顼ɤ򥭡ˤƥ顼åǼ롣
.* ƥץ졼¦Ǥϡ顼ɤȤ˾ʬԤäƥ顼åɽ롣
   ΤȤᥤץѰդ줿顼åɽƤ褤ƥץ졼¦̤ΥåɽƤ褤


ץ쥼ơǡ
.--------------------
<font {{*id="if:errors!=null"*}} color="red">
  <!-- ᥤץꤵ줿顼å򤽤Τޤɽ -->
  <span {{*id="if:errors['age']!=null"*}}>#{errors['age']}#<br><span>
  <span {{*id="if:errors['tel']!=null"*}}>#{errors['tel']}#<br><span>
  <!-- ̤Υ顼åɽ -->
  <span {{*id="if:errors['name']!=null"*}}>̾ϤƤޤ<br></span>
  <span {{*id="if:errors['mail']!=null"*}}>᡼륢ɥ쥹ϤƤޤ<br></span>
</font>
.--------------------


ۤˡ顼ḁ̊եȤѰդ¹Իɤ߹Ȥˡ⤢ޤ
ˡ򤪻Ȥ




ե | practice-form1

̤̾ϿեƤߤޤ

ϼΤ褦ʥե뤬ޤ
ΤѥץȤKwartzˤäƼưŪ˺ޤ
.[ register.cgi ]
	CGIᥤץ(Ruby)
.[ register.html ]
	ϿڡΥƥץ졼ȡ
.[ register.rhtml ]
	Ͽڡνѥץ(eRuby)
.[ finish.html ]
	λڡΥƥץ졼ȡ
.[ finish.rhtml ]
	λڡνѥץ(eRuby)


եɽCGIϡΤ褦ˤǺޤ
.* ѥ᡼ʤǸƤӽФȤϡϿڡ򤽤Τޤɽ롣
.* ѥ᡼ǸƤӽФ줿Ȥϡ
    .- ϤСǡϿλڡɽ롣
    .- ϤʤС顼åȶϿڡ⤦ɽ롣
       ΤȤϤ줿ǡ⤽Τޤɽ롣


ϥѥ륪ץ '-s' Ĥơ˥ǽͭˤƤߤޤ
ޤåȸȤerubyѤƤߤޤ


ϿڡΥƥץ졼(register.html)
.-------------------- register.html
<html>
 <body>
  <form action="/cgi-bin/register.cgi" method="POST">

   <span {{*id="if:error_list==null"*}}>
    <font color="#FF0000" {{*id="foreach:error=error_list"*}}>
     <span {{*id="value:error"*}}>̾ϤƤޤ</span><br>
    </font>
   </span>

   <table border="0" cellspacing="1" cellpadding="5">

    <tr>
     <td>̾</td>
     <td>
      <input type="text" name="name" size="20"
             {{*id="attr:value=param[:name]"*}}>
     </td>
    </tr>

    <tr>
     <td>̡</td>
     <td>
.#      <span {{*id="set:chk_m=param[:gender]=='M'?'checked':''"*}}/>
.#      <span {{*id="set:chk_w=param[:gender]=='W'?'checked':''"*}}/>
      <input type="radio" name="gender" value="M"
.#             {{*#{chk_m}#*}}>
             {{*#{X(param[:gender]=='M'?'checked':'')}#*}}>
.#      <input type="radio" name="gender" value="M" {{*#{chk_m}#*}}>
      &nbsp;
      <input type="radio" name="gender" value="W"
.#             {{*#{chk_w}#*}}>
             {{*#{X(param[:gender]=='W'?'checked':'')}#*}}>
.#      <input type="radio" name="gender" value="W" {{*#{chk_w}#*}}>
     </td>
    </tr>

    <tr>
     <td colspan="2" align="right">
      <input type="submit" value="Ͽ롡">
      <input type="reset"  value="ä">
     </td>
    </tr>

   </table>
  </form>
 </body>
</html>
.--------------------


Ͽڡνѥץ(register.rhtml)
.____________________
.<<<:! kwartz -l eruby -s guide.d/register.html
.____________________


λڡΥƥץ졼(finish.html)
.-------------------- finish.html
<html>
 <body>
  ʲƤϿޤ<br>
  ̾
   <span {{*id="value:param[:name]"*}}>Foo</span><br>
  ̡
   <span {{*id="if:param[:gender]=='M'"*}}></span>
   <span {{*id="if:param[:gender]=='W'"*}}></span>
 </body>
</html>
.--------------------

λڡνѥڡ(finish.rhtml)
.____________________
.<<<:! kwartz -l eruby -s guide.d/finish.html
.____________________

ᥤץ(register.cgi)
.-------------------- register.cgi
#!/usr/bin/ruby

## CGI֥Ȥϥåparam
require 'cgi'
cgi = CGI.new
param = {}
cgi.param.each do |key, value|
  param[key.intern] = value[0]
end
param.default = ''

## Submitܥ򲡤줿ν
.#flag_error = false
error_list = nil
if !param.empty? then
  ## ϥå
  error_list = []
  if param[:name] == '' then
    error_list << '桼̾ϤƤޤ'
  end
  case param[:gender]
  when 'M', 'W'
    # OK
  else
    error_list << '̤򤵤Ƥޤ'
  end
  .#flag_error = true if !error_list.empty?

  ## Ϥдλڡ(finish.rhtml)
  ## ǤʤФ⤦Ʊڡ(register.rhtml)
  .#if !flag_error then
  if error_list.empty? then
    error_list = nil
    filename = 'finish.rhtml'
    ... ǡϿ ...
  else
    filename = 'register.rhtml'
  end

.#  ## ˥
.#  param.each_value do |value|
.#    value.gsub!(/&/, '&amp;')
.#    value.gsub!(/>/, '&gt;')
.#    value.gsub!(/</, '&lt;')
.#    value.gsub!(/"/, '&quot;')
.#    value.gsub!(/'/, '&#39\;')
.#  end
end

## ڡ
require 'eruby'
ERuby::import(filename)
.--------------------



		| practice-calendar

ɽ륵ץ̤ơݡͥȻظˤ볫ȯˡ򼨤ޤ
ޤǽŪɽ̤{{<|calendar-main.html>}}Τ褦ˤʤޤ


ϡʤʣʥץ쥼ơåɬפȤʤޤ
Τᡢץ쥼ơåʬΥ̤Ǥ褯ΤҤȤĤǤ


ϡץ쥼ơǡȥץ쥼ơå2ĤѰդޤ
ޤᥤץPHPǽ񤤤Ƥߤޤ
.: calendar.html, calendar.plogic
	ҤȷʬΥɽ뤿Υץ쥼ơǡȥץ쥼ơå
.: calendar-page.html, calendar-page.plogic
	ɽWebڡɽץ쥼ơǡȥץ쥼ơå
.: calendar-page.php
	ᥤץࡣ



ץ쥼ơǡ(calendar.html)
.-------------------- calendar.html
     <table cellpadding="2" summary="">
       <caption>
	 <i {{*id="value:month"*}}>Jan</i>&nbsp;<i {{*id="value:year"*}}>20XX</i>
       </caption>
       <thead>
	 <tr bgcolor="#CCCCCC">
	   <th><span class="holiday">S</span></th>
	   <th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th>
	 </tr>
       </thead>
       <tbody>
	 <tr {{*id="mark:week"*}}>
	   <td><span {{*id="mark:day"*}} class="holiday">&nbsp;</span></td>
	   <td {{*id="dummy:d1"*}}>&nbsp;</td>
	   <td {{*id="dummy:d2"*}}>1</td>
	   <td {{*id="dummy:d3"*}}>2</td>
	   <td {{*id="dummy:d4"*}}>3</td>
	   <td {{*id="dummy:d5"*}}>4</td>
	   <td {{*id="dummy:d6"*}}>5</td>
	 </tr>
	 <tr {{*id="dummy:w1"*}}>
	   <td><span class="holiday">6</span></td>
	   <td>7</td><td>8</td><td>9</td>
	   <td>10</td><td>11</td><td>12</td>
	 </tr>
	 <tr {{*id="dummy:w2"*}}>
	   <td><span class="holiday">13</span></td>
	   <td>14</td><td>15</td><td>16</td>
	   <td>17</td><td>18</td><td>19</td>
	 </tr>
	 <tr {{*id="dummy:w3"*}}>
	   <td><span class="holiday">20</span></td>
	   <td>21</td><td>22</td><td>23</td>
	   <td>24</td><td>25</td><td>26</td>
	 </tr>
	 <tr {{*id="dummy:w4"*}}>
	   <td><span class="holiday">27</span></td>
	   <td>28</td><td>29</td><td>30</td>
	   <td>31</td><td>&nbsp;</td><td>&nbsp;</td>
	 </tr>
       </tbody>
     </table>
     &nbsp;
.--------------------


ץ쥼ơåcalendar.plogicˡ
.-------------------- calendar.plogic
:elem(week)

  :set(day = '&nbsp')
  :set(wday = 1)
  :while(wday < first_weekday)
    :if(wday == 1)
      @stag
    :end
    @cont
    :set(wday += 1)
  :end

  :set(day = 0)
  :set(wday -= 1)
  :while(day < num_days)
    :set(day += 1)
    :set(wday = wday % 7 + 1)
    :if(wday == 1)
      @stag
    :end
    @cont
    :if(wday == 7)
      @etag
    :end
  :end

  :if(wday != 7)
    :set(day = '&nbsp;')
    :while(wday != 6)
      @cont
      :set(wday += 1)
    :end
    @etag
  :end

:end

:elem(day)
  :if(wday == 1)
    @stag
    :print(day)
    @etag
  :else
    :print(day)
  :end
:end
.--------------------


ץ쥼ơǡcalendar-page.htmlˡ
.-------------------- calendar-page.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <style type="text/css">
      <!--
	.holiday   {color:#FF0000;}
	-->
    </style>
  </head>
  <body>
    
    <table border="0" summary="">
      <tr {{*id="mark:calendar_list"*}}>
	<td {{*id="mark:calendar"*}} valign="top">
	  .... calendar here ...
	</td>
      </tr>
    </table>
    
  </body>
</html>
.--------------------


ץ쥼ơåcalendar-page.plogicˡ
.-------------------- calendar-page.plogic
:elem(calendar_list)
  :set(calendar_ctr = 0)
  :foreach(calendar = calendar_list)
    :set(calendar_ctr += 1)
    :if(calendar_ctr % colnum == 1)
      @stag
    :end
    @cont
    :if(calendar_ctr % colnum == 0)
      @etag
    :end
  :end
  :if(calendar_ctr % colnum != 0)
    :set(calendar = '')
    :while(calendar_ctr % colnum != 0)
      @cont
      :set(calendar_ctr += 1)
    :end
    @etag
  :end
:end

:elem(calendar)
   @stag
   :print(calendar)
   @etag
:end
.--------------------



ᥤץ(calendar-main.php)
.-------------------- calendar-main.php
<?php
	// year, month, number of days, 1st weekday
	// (or use date() function)
	$month_data[] = array(2004, 'Jan', 31, 'Thu');
	$month_data[] = array(2004, 'Feb', 29, 'Sat');
	$month_data[] = array(2004, 'Mar', 31, 'Tue');
	$month_data[] = array(2004, 'Apr', 30, 'Thu');
	$month_data[] = array(2004, 'May', 31, 'Sat');
	$month_data[] = array(2004, 'Jun', 30, 'Tue');
	#$month_data[] = array(2004, 'Jul', 31, 'Thu');
	#$month_data[] = array(2004, 'Aug', 31, 'Sun');
	#$month_data[] = array(2004, 'Sep', 30, 'Wed');
	#$month_data[] = array(2004, 'Oct', 31, 'Fri');
	#$month_data[] = array(2004, 'Nov', 30, 'Mon');
	#$month_data[] = array(2004, 'Dec', 31, 'Wed');

	$weekday2num = array( 'Sun'=>1, 'Mon'=>2, 'Tue'=>3, 'Wed'=>4,
			      'Thu'=>5, 'Fri'=>6, 'Sat'=>7,);


	// output buffering start
	ob_start();

	// main loop
	$colnum = 4;
	foreach($month_data as $data) {
		$year	       = $data[0];
		$month         = $data[1];
		$num_days      = $data[2];
		$first_weekday = $weekday2num[$data[3]];

		// include 'calendar.inc' content as string
		include('calendar.php');
		$str = ob_get_contents();
		ob_clean();

		// append content string into $calendar_list[]
		$calendar_list[]  = $str;
	}

	// output buffering stop
	ob_end_clean();

	// include main page, with $calendar_list[]
	include('calendar-page.php');
 ?>
.--------------------


ѥȼ¹ԡ
.====================
$ kwartz -l php -p calendar.plogic calendar.html > calendar.php
$ kwartz -l php -p calendar-page.plogic calendar-page.html > calendar-page.php
$ php -q calendar-main.php > calendar-main.html
.====================



Tips		| tips


Ϸ̤ʸȤƼФ	| tips-outstring


ϥץȤμ¹Է̤ʸȤƼФˡޤоݤRubyPHPǤ


Rubyξϡruby2ޤERBѤޤ
.--------------------
## ruby2
s = File.open('file.erb') { |f| f.read() }   # or File.read('file.erb') in 1.8
s.untaint
_s = ''
eval s
str = _s			  # get output as string

## ERB
s = File.open('file.erb') { |f| f.read() }   # or File.read('file.erb') in 1.8
require 'erb'
s.untaint
erb = ERB.new(s, $SAFE, '%')
str = erb.result(binding())       # get output as string
.--------------------


PHPξϡphp2ꤹ뤫ϤǽϥХåե󥰴ؿob_start(), ob_get_contents(), ob_end_clean()ˤѤޤ
.--------------------
// php2
<?php
	include('file.php');
	$str = $_s;
?>

// use output buffering functions
<?php
	ob_start();                 // start output buffering
	include('file.php');
	$str = ob_get_contents();   // get result as string
	ob_end_clean();             // stop output buffering
?>
.--------------------




ॹפӤƼưѥԤ		| tips-autocompile


ץ쥼ơեѥץȥեΥॹפ¹ԻӤơưѥԤȤǤޤ
ܤȡξΤȤ˥ѥԤޤ
.* ϥץȥե뤬ʤ
.* ץ쥼ơǡեΤۤ
.* ץ쥼ơåե뤬ꡢĤΤۤ


KwartzμRubyǤԤƤʤᡢưѥ뵡ǽȤΤϥᥤץबRubyǽ񤫤ƤΤߤǤ


ưѥԤˤϡ{{,Kwartz::compile(),}}Ѥޤ
ᥤץϡ㤨мΤ褦ˤʤޤ
.--------------------
pdata  = 'sample.html'		# ץ쥼ơǡ
script = 'sample.rhtml'		# ѥץȥե
plogic = 'sample.plogic'	# ץ쥼ơå
lang   = 'eruby'		# åȸ

{{*require 'kwartz'*}}
{{*Kwartz::compile(pdata, script, plogic, lang)*}}

requre 'eruby'
ERuby::import(script)
.--------------------



checked, selected, disabled	| tips-checked


HTML/XHTMLΤεǽȤơchecked="checked"פselected="selected"פdisabled="disabled"פñ˽Ϥ뵡ǽɲäޤ


.% {{,#{@CHECK({{/condition/}})}#,}} or {{,#{@C({{/condition/}})}#,}}
	郎trueʤ{{,checked="checked",}}פϤޤ
.% {{,#{@SELECT({{/condition/}})}#,}} or {{,#{@S({{/condition/}})}#,}}
	郎trueʤ{{,selected="selected",}}פϤޤ
.% {{,#{@DISABLE({{/condition/}})}#,}} or {{,#{@D({{/condition/}})}#,}}
	郎trueʤ{{,disabled="disabled",}}פϤޤ


㤨СΤ褦ʥץ쥼ơǡȤޤ
.-------------------- 
<input type="radio" name="gender" value="M"
       {{*#{gender=='M' ? 'checked="checked"' : ''}#*}}>Man
<option name="lang" value="ruby"
       {{*#{lang=='ruby' ? 'selected="selected"' : ''}#*}}>Ruby
<input type="radio" name="os" value="win"
       {{*#{os=='mac' ? 'disabled="disabled"' : ''}#*}}>Windows
.--------------------


ϼΤ褦ˤʷ˵Ҥ뤳ȤǤޤ
.-------------------- tips-checked.html
<input type="radio" name="gender" value="M"
       {{*#{@C(gender=='M')}#*}}>Man
<option name="lang" value="ruby"
       {{*#{@S(lang=='ruby')}#*}}>Ruby
<input type="radio" name="os" value="win"
       {{*#{@D(os=='mac')}#*}}>Windows
.--------------------


ơΤ褦֥ɤ˥СȤޤ
.____________________
.<<<:! kwartz -a convert guide.d/tips-checked.html
.____________________


ʤεǽϼ¸Ǥ衢ѹǽޤλ




ץ쥼ơåeRubyɤ򵭽Ҥ	| tips-eruby

ޥɥ饤󥪥ץ {{,--enable_eruby=true,}} ꤹȡץ쥼ơåeRubyΥɤ򵭽ҤǤޤ
eRubyɤǤϡ{{,%,}}׵ˡѤǤޤѴ̾ѿ{{,__lang__,}}ǻȤǤޤ


ץ쥼ơå
.-------------------- tips-eruby.plogic
:set(message = 'a sample message')
:set(number  = 20)
% if __lang__ == 'php'
::: <?php $str = sprintf('(%03d) %s', $number, $message); ?>
% elsif __lang__ == 'ruby'
::: s = '(%03d) %s' % [number, message]
% elsif __lang__ == 'erb'
:::% str = '(%03d) %s' % [number, message]
% elsif __lang__ == 'eruby'
::: <<% %>% str = '(%03d) %s' % [number, message] %<% %>>
% else
:set(s = '(' .+ number .+ ') ' .+ message)
% end
:print(s, "\n")
.--------------------


ϥץȡ
.--------------------
.<<<:! ruby output.rb -a translate --enable_eruby=true guide.d/tips-eruby.plogic
.--------------------


eRubyɤˤERBɬפǤ
Ruby 1.8ʹߤˤɸERB°ޤ1.6ξERB򥤥󥹥ȡ뤷Ƥ





ĶѿKWARTZ_OPTIONS			| tips-envvar


ĶѿKWARTZ_OPTIONSפˡkwartzޥɥ饤󥪥ץꤹ뤳ȤǤޤ


㤨СѴθȤERBѤޤɬ˥ԤΤǤСĶѿ򼡤Τ褦ꤷޤ
.====================
$ export KWARTZ_OPTIONS='-l erb -s'    # sh, bash
$ setenv KWARTZ_OPTIONS '-l erb -s'    # csh, tcsh
.====================


ޤĶѿꤷץ⡢ºݤ˥ޥɥ饤ǻꤵ줿ץΤۤͥ褵ޤ
㤨оΤ褦ԤäƤƤ⡢ޥɥ饤 {{,-l eruby,}} ȻꤵСѴθȤERBǤʤeRubyѤޤ


ʤĶѿΥѡϡString#split(' ')ǹԤäƤǤ
ΤᡢޤʣʥץꤷƤ⤦ޤᤵޤ




ƥץ졼ȤRuby/PHPΥ᥽åɤإѥ뤹	| tips-mkmethod


°mkmethodץȤѤ뤳Ȥǡѥ뤷ƥץ졼ȤRubyޤPHPΥ᥽åɤȤ뤳ȤǤޤ

mkmethodλȤϼ̤Ǥ
.====================
bash$ mkmethod -h
Usage: mkmethod [-svh] [-p file] [-l lang] [-M module] [-m method] file.html
  -p file            : presentation logic file
  -l lang            : ruby/ruby2/eruby/erb/php/php2 (default 'ruby2')
  -M module/class    : module/class name (default none)
  -m method          : method name (default 'expand_' + file)
  -A arg1,arg2,...   : method arguments (default nil)
  -s                 : sanitizing (equals to '--escape=true')
  -h, --help         : print help and exit
  -v                 : print version and exit
  --optname=value    : options for kwartz
.====================


ޥɥ饤󥪥ץȤ '-l ruby'  '-l eruby'  '-l php' ꤷɸϤ˽Ϥ᥽åɤȤơޤ '-l ruby2'  '-l erb'  '-l php2' ꤷʸ֤᥽åɤȤޤǥեȤruby2Ǥ

.====================
bash$ mkmethod -p hoge.plogic hoge.html
  def expand_hoge(_args)
    user = _args[:user]
    list = _args[:list]
    _s = ''
    _s << "Hello " << (user).to_s << "!\n"
    _s << "<ul>\n"
    for item in list do
      _s << "  <li>" << (item).to_s << "</li>\n"
    end
    _s << "</ul>\n"
    return _s
  end

bash$ mkmethod -l php2 -p hoge.plogic hoge.html
<?php
        function expand_hoge(&$_args) {
                $user = &$_args['user'];
                $list = &$_args['list'];
                ob_start();
?>
Hello <?php echo $user; ?>!
<ul>
<?php foreach ($list as $item) { ?>
  <li><?php echo $item; ?></li>
<?php } ?>
</ul>
<?php
                $_s = ob_get_contents();
                ob_end_clean();
                return $_s;
        } // function end
?>
.====================

ޤޥɥ饤󥪥ץ '-M' ꤹȡRubyǤϥ⥸塼뤬PHPǤϥ饹ޤ

.====================
bash$ mkmethod -p hoge.plogic -M Hoge hoge.html
module Hoge
  def self.expand_hoge(_args)
    user = _args[:user]
    list = _args[:list]
    _s = ''
    _s << "Hello " << (user).to_s << "!\n"
    _s << "<ul>\n"
    for item in list do
      _s << "  <li>" << (item).to_s << "</li>\n"
    end
    _s << "</ul>\n"
    return _s
  end
end

bash$ mkmethod -l php2 -p hoge.plogic -M Hoge hoge.html
<?php
class Hoge {
        function expand_hoge(&$_args) {
                $user = &$_args['user'];
                $list = &$_args['list'];
                ob_start();
?>
Hello <?php echo $user; ?>!
<ul>
<?php foreach ($list as $item) { ?>
  <li><?php echo $item; ?></li>
<?php } ?>
</ul>
<?php
                $_s = ob_get_contents();
                ob_end_clean();
                return $_s;
        } // function end
} // class end
?>
.====================


mkmethodǤϡKwartzAnalyzeǽȤäƥƥץ졼ȤΥХѿưŪĴ٤ޤ
ޤޥɥ饤󥪥ץ -A Ѥȡ᥽åɤΰǤޤ

.====================
bash$ mkmethod -p hoge.plogic -M Hoge -A 'user,list' hoge.html
module Hoge
  def self.expand_hoge(_args)
    user = _args[:user]
    list = _args[:list]
    return self._expand_hoge(user, list)
  end
  def self._expand_hoge(user, list)
    _s = ''
    _s << "Hello " << (user).to_s << "!\n"
    _s << "<ul>\n"
    for item in list do
      _s << "  <li>" << (item).to_s << "</li>\n"
    end
    _s << "</ul>\n"
    return _s
  end
end

bash$ mkmethod -l php2 -p hoge.plogic -M Hoge -A 'user,list' hoge.html
<?php
class Hoge {
        function expand_hoge(&$_args) {
                $user = &$_args['user'];
                $list = &$_args['list'];
                return Hoge::_expand_hoge($user, $list);
        } // function end
        function _expand_hoge(&$user, &$list) {
                ob_start();
?>
Hello <?php echo $user; ?>!
<ul>
<?php foreach ($list as $item) { ?>
  <li><?php echo $item; ?></li>
<?php } ?>
</ul>
<?php
                $_s = ob_get_contents();
                ob_end_clean();
                return $_s;
        } // function end
} // class end
?>
.====================


Τۤ˥Ԥ -s  --escape=true Ǥޤ




W3C Markup ValidationӥѤ	| tips-validator

{{<W3C|http://www.w3.org>}}ǤϡHTMLե뤬ɤå륵ӥ󶡤Ƥޤ{{<http://validator.w3.org>}}ˡ
KwartzѤHTMLեʥץ쥼ơǡեˤ򤳤Υӥǥåȡʤkd°Τǥ顼ˤʤޤ


ǡHTMLե뤫kd°Ƥ顢ΥӥPHP/CGIץȤѰդޤ
KwartzΥ֤ validator.{php,cgi} ȤץȤޤΤǡŬWebФǼ¹ԤƤ
ޤKwartzۡڡǤ{{<ȤǤޤ|http://www.kuwata-lab.com/webtech/kwartz/validator.php>}}




ͽƱѿ̾Ѥʤ 	 | tips-keywords


RubyJSPΤ褦ˡѿˡ$פΤ褦̤ʵȤʤǤϡѿ̾ͽƱˤʤʤ褦ˤƤ
ޤͽǤϤʤƤ⡢¼ŪͽΤ褦ʤΡѤѿȤ߹ߴؿʤɡˤ⤢ޤΤǡȤ⤫֤ʤ褦ѿ̾ˤۤ褤Ǥ礦


Ʊ̾ѿѤȡ̯ʥ顼ǺޤޤΤդƤ


㤨СRubyͽϼ̤Ǥʡ{{<֥Ȼظץȸ Ruby ե󥹥ޥ˥奢|http://www.ruby-lang.org/ja/man-1.6/index.cgi?cmd=view;name=%BB%FA%B6%E7%B9%BD%C2%A4#a.cd.bd.cc.f3.b8.ec>}}٤ȴˡ

.____________________
    BEGIN    class    ensure   nil      self     when
    END      def      false    not      super    while
    alias    defined? for      or       then     yield
    and      do       if       redo     true
    begin    else     in       rescue   undef
    break    elsif    module   retry    unless
    case     end      next     return   until
.____________________
	Rubyͽ


.#Javaͽϼ̤Ǥʡ{{<The Java Language Specification|http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#229308>}}٤ȴ衣ޤtruefalsenullɲäƤˡ
.#
.#.____________________
.#    abstract    default    if            private      this        true
.#    boolean     do         implements    protected    throw       false
.#    break       double     import        public       throws      null
.#    byte        else       instanceof    return       transient
.#    case        extends    int           short        try
.#    catch       final      interface     static       void
.#    char        finally    long          strictfp     volatile
.#    class       float      native        super        while
.#    const       for        new           switch
.#    continue    goto       package       synchronized
.#.____________________
.#	JavaͽtruefalsenullɲäƤ


JSPʤJSTLExpression Languageˤˤͽѿ̾ϼ̤Ǥ
.#ʡ{{<JavaServer Pages(TM) Standard Tag Library Specification 1.1|http://java.sun.com/webapps/download/Redirect/124418770/584747937728280705350560724608606933322893863359466947722807729328077247062841085902786058473206-4640/jstl-1_1-mr-spec.pdf>}}٤ȴˡ
ʡ{{<JavaServer Pages(TM) Standard Tag Library Specification (Final Release)|http://jcp.org/aboutJava/communityprocess/final/jsr052/>}}٤ȴˡ

.____________________
    and		or	not
    eq		ne	lt	le	gt	ge
    div		mod
    true	false		null
    empty
    page	pageScope	request		requestScope
    session	sessionScope	application	applicationScope
    header	headerValues	param		paramValues
    cookie
.____________________
	JSPJSTLˤͽѿΰ


ʤPHPǤѿ̾ˡ$פĤΤǡΤ褦Ϥޤ
㤨иߤPHPǳȯƤ뤱ɾJavaˤ뤫⤷ʤȤϡϤѿͽƱ̾Ĥʤ褦ˤƤ



HTTPꥯȥѥ᡼ɽѿ̾paramˤ		| tips-param


JSTLμ(Expression Language)ǤϡHTTPꥯȥѥ᡼ѿparamɽƤꡢ¾̾ˤ뤳ȤǤޤ
ˤʤäơ¾θRubyPHPˤȤǤѥ᡼paramȤѿɽȡƥץ졼ȤΥݡӥƥ夷ޤ


㤨мΤ褦ʥեǥǡϤȤޤ
.--------------------
<form action="/cgi/form.cgi" method="post">
  桼̾ <input type="text" name="user"><br>
  ǯ     <input type="text" name="age"><br>
  <input type="submit">
</form>
.--------------------


ơɽ뤿˼Τ褦ʥץ쥼ơǡȤޤ
.--------------------
Ϥγǧ
 桼̾<span id="value:param['user']">Foobar</span><br>
 ǯ    <span id="value:param['age']">99</span><br>
.--------------------


Υץ쥼ơǡɤθǤѤǤ褦ˤˤϡѥ᡼ɽѿ{{,param,}}Ȥ̾줹ɬפޤ


㤨RubyǤϼΤ褦ˤޤ
.--------------------
require 'cgi'
cgi = CGI.new
param = {}
cgi.params.each do |key,value|
  param[key] = value.first
end
....
s = File.open('form.rb') { |f| f.read }
s.untaint
eval s
## ޤ ERuby::import('form.rhtml') ʤ
.--------------------


PHPǤϡȤˤѤΤǤ礦
.--------------------
<?php
     $param = &$_REQUEST;
     ....
     include('form.php');
 ?>
.--------------------

Ʊͤͳǡåɽѿ̾cookieåɽѿ̾session줹Τ褤Ǥ礦


JSPǤϥѥ᡼ͤꤹ뤳ȤǤޤ{{(HttpServletRequestgetParameter()ϤäƤsetParameter()ϤʤȤͳǤ)}}
㤨PHPǤϡ{{,$_POST['user'] = trim($_POST['user']);,}}פΤ褦˥ѥ᡼ѹǤޤJSPǤϤ줬ǤʤΤǤ
줬ϡѥ᡼HashMapʤɤ˳ǼʤparamǤϤʤ̤̾㤨param{{*s*}}ʤɡˤĤƤ


.--------------------
// Servlet
public void doPost(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
   
   // HTTPꥯȥѥ᡼ȤHashMap˳Ǽ
   String[] names = { 'name', 'age' };
   for (int i = 0; i < names.length; i++) {
      String key   = names[i];
      String value = (String)request.getParameter(key);
      if (value != null) {
         value = value.trim();            // ζ
         params.put(key, value); 
      }
   }
   
   // HashMap֥ȤparamsȤ̾ǻѤ롣
   // JSPJSTLǤparamȤ鷺paramsѤ
   request.setAttribute("params", params);
   
   // JSPƤӽФ
   String filename = "form.jsp";
   String url = filename;
   request.getRequestDispatcher(url).forward(request, response);
}
.--------------------



Ｐˤ					| tips-logical


ifʸ3黻ҤˤＰβϡƸˤä礭ФĤޤ
ΤᡢＰǤϤʤ٤񤯤褦ˤƤ


㤨мΤ褦ʥץ쥼ơǡͤޤ

.--------------------
<font id="if:error" color="red">
  顼ȯޤ#{error}#
</font>
.--------------------


ξ硢ѿerrorͤˤäƳƸ줴Ȥ˾Ｐβ᤬ۤʤޤ
äJSTLExpression LanguageϡtrueʳϤ٤ƵפȤפڤäˤΤ褦Ǥ


.+--------------------
ѿerror		., Ruby		., PHP		., JSP(JSTL)	., Velocity
.--------------------
ʸ({{,'',}})	., 		., 		., 		., 
ǤϤʤʸ	., 		., 		., 		., 
0			., 		., 		., 		., 
0ʳ		., 		., 		., 		., 
true			., 		., 		., 		., 
false			., 		., 		., 		., 
null			., 		., 		., 		., 
.+--------------------
	ƸˤＰβ


Τ褦ʰ㤤뤿ᡢƥץ졼Ȥΰܿˤifʸ3黻ҤξＰˤ񤯤褦ˤƤ
㤨С{{,:if(error),}}פǤϤʤ{{,:if(error!=null),}}פ{{,:if(error!=''),}}פȽ񤤤Ƥ
ޤ{{,:if(!error),}}פǤϤʤ{{,:if(error==null),}}פ{{,:if(error==''),}}פȽ񤤤Ƥ


ޤʸ󤬶ɤĴ٤ˤϡͽemptyѤƤ
emptyˤĤƤϡ{{<empty|pl-empty>}}פ



Ͽ			| appendix*

Ͽ1Kwartzޥ | appendix-command*

ƥץ졼Ȥѥץإѥ뤹ˤϡKwartzޥɤѤޤ

ΤޤѸΤ餤򤷤Ƥޤ

.[ С(Convert) ]
	ץ쥼ơǡ֥ɤѴ뤳ȤǤ

.[ ȥ󥹥졼(Translate) ]
	֥ɤѥץѴ뤳ȤǤ
	ˤϡץ쥼ơåޡ뤳Ȥޤߤޤ

.[ ѥ(Compile) ]
	ץ쥼ơǡȥץ쥼ơå顢ѥץ뤳ȤǤ
	ĤޤꡢѥȤϥСȤȥȥ󥹥졼ȤξԤȤǤ


ѥ롿Сȡȥ󥹥졼ȤԤˤϡKwartzץȤѤޤ


Ȥ
.% {{,kwartz [options...] [-p {{/plogic-file/}}] file.html > file.output,}}
	եҤȤĤĻꤷƽޤʥΡޥ⡼ɡˡ

.% {{,kwartz -O {{/outfile-suffix/}} [-P {{/plogic-suffix/}}] [options...] *.html,}}
	ʣΥեޤȤƽޤʥХå⡼ɡˡ
	ϥեγĥҤ -O ǡץ쥼ơåեγĥҤ -P ǻꤷޤ


ץϼ̤Ǥ
.[-h, --help]
	إפɽ

.[-v]
	Сɽ

.[-a {{/action/}}]
	¹Ԥ'convert', 'translate', 'compile', 'analyze' Τɤ줫ǥեȤ'compile'

.[-l {{/lang/}}]
	åȸꡣǤΤ
	ruby, ruby2, php, php2, jsp, eruby, erb, erbscan, velocity.

.[-s]
	˥Ԥ{{,--escape=true,}}ƱVelocityϥ˥Ǥʤ

.[-p {{/plogic-file/}}]
	ץ쥼ơåΥե̾{{,,,}}פǶڤ뤳ȤǡʣΥե̾Ǥ롣

.[-O {{/outfile-suffix/}}]
	ѥץȤγĥҡꤹȥХå⡼ɤˤʤꡢɸϤǤϤʤեľܽϤ롣

.[-P {{/plogic-suffix/}}]
	ץ쥼ơåեγĥҡХå⡼ɤǻѤ롣

.[-T]
	ॹפӤѥץȤΤۤв¹ԤʤХå⡼ɤǻѤ롣

.[-S]
	åνϤޤ롣Хå⡼ɤǻѤ롣

.[--attr_name={{/name/}}]
	ǥ쥯ƥ֤ǻѤ°̾ǥեȤ 'kd'

.[--charset={{/charset/}}]
	ʸɡJSPˤ '{{,<%@ page contentType="text/html; charset={{/charset/}} "%>,}}' Ϥ롣

.[--delete_idattr={{/true/}}|{{/false/}}]
	ץ쥼ơǡ {{,id="name",}} 

.[--enable_eruby={{/true/}}|{{/false/}}]
	ץ쥼ơåeRuby(ERB)εҤ%׵ˡѤǤ롣
	ѿ {{,__lang__,}} ǥåȸ줬ȤǤ롣ERB󥹥ȡ뤵Ƥ뤳Ȥɬס

.[--escape={{/true/}}|{{/false/}}]
	򥵥˥ƽϤ롣

.[--even_value={{/value/}}]
	ΤȤ͡ǥեȤϡ{{,'even',}}סǥ쥯ƥFOREACHLISTǻȤ롣

.[--footer={{/string/}}]
	եåʸ

.[--header={{/string/}}]
	إåʸ
	JSPǤϥǥեȤ '{{,<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>,}}'
	ꤵ롣
	ϤʤȤ {{,--header='',}} Ȥ롣

.[--include_path={{/dir1/}},{{/dir2/}}],...
	{{,include,}}ǥ쥯ƥ֤ɤ߹եʥץ쥼ơǡեˤΥǥ쥯ȥꤹ롣

.[--load_path={{/dir1/}},{{/dir2/}}],...
	{{,load,}}ǥ쥯ƥ֤{{,:load(),}}ʸɤ߹եʥץ쥼ơåեˤΥǥ쥯ȥꤹ롣

.[--odd_value={{/value/}}]
	ΤȤ͡ǥեȤϡ{{,'odd',}}סǥ쥯ƥFOREACHLISTǻȤ롣





ȤǤ

.#.: file1.html ==> file1.rb
.*	ץ쥼ơǡ(file1.html)򥳥ѥ뤷ơѥץ(file1.rb)Ѵ롣
	åȸRuby
	.====================
	$ kwartz -l ruby file1.html > file1.rb
	or
	$ kwartz -l ruby -O .rb file1.html
	.====================
	

.#.: file1.html + file1.plogic ==> file1.php
.*	ץ쥼ơǡ(file1.html)ȥץ쥼ơå(file1.plogic)顢ѥץ(file1.php)롣
	åȸPHP
	.====================
	$ kwartz -l php -p file1.plogic file1.html > file1.php
	or
	$ kwartz -l php -p file1.plogic -O .php file1.html
	or
	$ kwartz -l php -O .php -P .plogic file1.html
	.====================
	

.#.: *.html + *.plogic ==> *.jsp
.*	줾Υץ쥼ơǡȥץ쥼ơǡ顢ѤJSPե(*.jsp)ʥХå⡼ɡˡ
	ΤȤʸɤȤEUC-JPꤹ롣
	.====================
	$ kwartz -l jsp -O .jsp -P .plogic --charset=EUC-JP *.html
	.====================
	

.#.: *.html ==> intermediate code
.*	ץ쥼ơǡ֥ɤ˥СȤ롣
	.====================
	$ kwartz -a convert file1.html | more
	.====================
	



Ͽ2PL(Presentation Language)BNF		| appendix-bnf*

(undocumented)


.#@EOF


.-------------------- calendar.sh
#!/bin/sh -x
kwartz -l php -p calendar.plogic calendar.html > calendar.php
kwartz -l php -p calendar-page.plogic calendar-page.html > calendar-page.php
php -q calendar-main.php > calendar-main.html
.--------------------
