summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormakoto kuwata <kwa@kuwata-lab.com>2011-03-22 16:19:45 +0900
committermakoto kuwata <kwa@kuwata-lab.com>2011-03-22 16:19:45 +0900
commitb45ab4a8266db2f3d4e5db24a090403758202165 (patch)
treeb01efe4baf48d64a3b416f8c12ee0ab58246c262
parent2e1d6c3b3bbba8eb152c67e283e370ed1de13376 (diff)
downloaderubis-b45ab4a8266db2f3d4e5db24a090403758202165.tar.gz
[enhance] support C++
-rw-r--r--lib/erubis/engine/ecpp.rb113
-rw-r--r--lib/erubis/main.rb5
-rw-r--r--test/test-engines.rb31
3 files changed, 147 insertions, 2 deletions
diff --git a/lib/erubis/engine/ecpp.rb b/lib/erubis/engine/ecpp.rb
new file mode 100644
index 0000000..cb3b2c3
--- /dev/null
+++ b/lib/erubis/engine/ecpp.rb
@@ -0,0 +1,113 @@
+##
+## $Release:$
+## $Copyright$
+##
+
+require 'erubis/engine'
+require 'erubis/enhancer'
+
+
+module Erubis
+
+
+ module CppGenerator
+ include Generator
+
+ def self.supported_properties() # :nodoc:
+ return [
+ [:indent, '', "indent spaces (ex. ' ')"],
+ [:bufvar, '_buf', "buffer variable name"],
+ ]
+ end
+
+ def init_generator(properties={})
+ super
+ @escapefunc ||= "escape"
+ @indent = properties[:indent] || ''
+ @bufvar = properties[:bufvar] || '_buf'
+ end
+
+ def add_preamble(src)
+ src << "#line 1 \"#{self.filename}\"\n" if self.filename
+ end
+
+ def escape_text(text)
+ @@table_ ||= { "\r"=>"\\r", "\n"=>"\\n", "\t"=>"\\t", '"'=>'\\"', "\\"=>"\\\\" }
+ text.gsub!(/[\r\n\t"\\]/) { |m| @@table_[m] }
+ return text
+ end
+
+ def escaped_expr(code)
+ return "#{@escapefunc}(#{code.strip})"
+ end
+
+ def add_text(src, text)
+ return if text.empty?
+ src << (src.empty? || src[-1] == ?\n ? @indent : ' ')
+ src << "_buf << "
+ i = 0
+ text.each_line do |line|
+ src << "\n" << @indent << " " if i > 0
+ i += 1
+ src << '"' << escape_text(line) << '"'
+ end
+ src << ";" #<< (text[-1] == ?\n ? "\n" : "")
+ src << "\n" if text[-1] == ?\n
+ end
+
+ def add_stmt(src, code)
+ src << code
+ end
+
+ def add_expr_literal(src, code)
+ src << @indent if src.empty? || src[-1] == ?\n
+ src << " _buf << (" << code.strip << ");"
+ end
+
+ def add_expr_escaped(src, code)
+ src << @indent if src.empty? || src[-1] == ?\n
+ src << ' ' << escaped_expr(code) << ';'
+ end
+
+ def add_expr_debug(src, code)
+ code.strip!
+ src << @indent if src.empty? || src[-1] == ?\n
+ src << " std::cerr << \"*** debug: #{code.gsub(/(")/, '\\\&')}=\" << (#{code});"
+ end
+
+ def add_postamble(src)
+ # empty
+ end
+
+ end
+
+
+ ##
+ ## engine for C
+ ##
+ class Ecpp < Basic::Engine
+ include CppGenerator
+ end
+
+
+ class EscapedEcpp < Ecpp
+ include EscapeEnhancer
+ end
+
+
+ #class XmlEcpp < Ecpp
+ # include EscapeEnhancer
+ #end
+
+ class PI::Ecpp < PI::Engine
+ include CppGenerator
+
+ def init_converter(properties={})
+ @pi = 'cpp'
+ super(properties)
+ end
+
+ end
+
+
+end
diff --git a/lib/erubis/main.rb b/lib/erubis/main.rb
index a2552bd..dbbbecd 100644
--- a/lib/erubis/main.rb
+++ b/lib/erubis/main.rb
@@ -11,6 +11,7 @@ require 'erubis/engine/optimized'
require 'erubis/engine/eruby'
require 'erubis/engine/ephp'
require 'erubis/engine/ec'
+require 'erubis/engine/ecpp'
require 'erubis/engine/ejava'
require 'erubis/engine/escheme'
require 'erubis/engine/eperl'
@@ -231,7 +232,7 @@ module Erubis
buf << " -z : syntax checking"
buf << " -e : escape (equal to '--E Escape')"
buf << " -p pattern : embedded pattern (default '<% %>')"
- buf << " -l lang : convert but no execute (ruby/php/c/java/scheme/perl/js)"
+ buf << " -l lang : convert but no execute (ruby/php/c/cpp/java/scheme/perl/js)"
buf << " -E e1,e2,... : enhancer names (Escape, PercentLine, BiPattern, ...)"
buf << " -I path : library include path"
buf << " -K kanji : kanji code (euc/sjis/utf8) (default none)"
@@ -269,7 +270,7 @@ module Erubis
list << ['(common)', common_props]
list << ['(basic)', basic_props - common_props]
list << ['(pi)', pi_props - common_props]
- %w[ruby php c java scheme perl javascript].each do |lang|
+ %w[ruby php c cpp java scheme perl javascript].each do |lang|
klass = Erubis.const_get("E#{lang}")
list << [lang, collect_supported_properties(klass) - basic_props]
end
diff --git a/test/test-engines.rb b/test/test-engines.rb
index 98b763a..8f0705a 100644
--- a/test/test-engines.rb
+++ b/test/test-engines.rb
@@ -9,6 +9,7 @@ require 'erubis'
require 'erubis/engine/eruby'
require 'erubis/engine/ephp'
require 'erubis/engine/ec'
+require 'erubis/engine/ecpp'
require 'erubis/engine/ejava'
require 'erubis/engine/escheme'
require 'erubis/engine/eperl'
@@ -163,6 +164,36 @@ __END__
"</table>\n", stdout);
fprintf(stderr, "*** debug: i=" "%d", i); fputs("\n", stdout);
##
+- name: cpp1
+ lang: cpp
+ class: Ecpp
+ options: { :filename: foo.html, :indent: ' ' }
+ input: |4
+ <table>
+ <tbody>
+ <% for (i = 0; i < n; i++) { %>
+ <tr>
+ <td><%= i %></td>
+ <td><%== list[i] %></td>
+ </tr>
+ <% } %>
+ </tbody>
+ </table>
+ <%=== i %>
+ expected: |
+ #line 1 "foo.html"
+ _buf << "<table>\n"
+ " <tbody>\n";
+ for (i = 0; i < n; i++) {
+ _buf << " <tr>\n"
+ " <td>"; _buf << (i); _buf << "</td>\n"
+ " <td>"; escape(list[i]); _buf << "</td>\n"
+ " </tr>\n";
+ }
+ _buf << " </tbody>\n"
+ "</table>\n";
+ std::cerr << "*** debug: i=" << (i); _buf << "\n";
+##
- name: java1
lang: java
class: Ejava