help-source-highlight
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-source-highlight] Embedding inputlang as information


From: Masatake YAMATO
Subject: [Help-source-highlight] Embedding inputlang as information
Date: Thu, 03 Mar 2011 04:49:52 +0900 (JST)

Hi,

I'd like you to review my patch. 
The patch embeds input lang used in highlighting into the output xhtml
file.

Background
-----------
I'm developing web based source code viewer using source highlight.

With javascript I'd like to provide some interactive commands working
on the generated html file. The behavior of commands will be changed
according to the ``input lang'' of the original source code.

e.g.:

JUMP command works on

     #include <bar.h> 

in C,

     import foo.bar.Class;

in Java, and

     import foo.bar.Class

in python...


If source highlight embeds the name of input lang to the converted html file, 
I don't have to write lang detector in javascript.  Adding this feature is a
bit private request but similar type of software may want such
input lang(file type) information. So I submitted the patch here.


I don't know how I have to be careful about API and ABI compatibility.
In the patch I may do something bad about the compatibility.


Masatake YAMATO


diff --git a/lib/srchilite/docgenerator.cc b/lib/srchilite/docgenerator.cc
index 1e1ae73..6494e6f 100644
--- a/lib/srchilite/docgenerator.cc
+++ b/lib/srchilite/docgenerator.cc
@@ -31,6 +31,7 @@ void
 DocGenerator::generate_start_doc(std::ostream *sout)
 {
     bool docTitle = (title.size () > 0);
+    bool docInputLang = (input_lang.size () > 0);
     bool inputFileName = (input_file_name.size () > 0);
 
     *sout <<
@@ -42,7 +43,8 @@ DocGenerator::generate_start_doc(std::ostream *sout)
             "\nby Lorenzo 
Bettini\nhttp://www.lorenzobettini.it\nhttp://www.gnu.org/software/src-highlite";,
             doc_header,
             doc_footer,
-            doc_background
+            doc_background,
+           docInputLang ? input_lang: "unknown"
         );
 }
 
@@ -56,7 +58,8 @@ DocGenerator::generate_end_doc(std::ostream *sout)
             "\nby Lorenzo 
Bettini\nhttp://www.lorenzobettini.it\nhttp://www.gnu.org/software/src-highlite";,
             doc_header,
             doc_footer,
-            doc_background
+            doc_background,
+           ""
         );
 }
 
diff --git a/lib/srchilite/docgenerator.h b/lib/srchilite/docgenerator.h
index 16a2804..3a6282d 100644
--- a/lib/srchilite/docgenerator.h
+++ b/lib/srchilite/docgenerator.h
@@ -47,16 +47,18 @@ protected:
     string css_url;
     string doc_background;
     bool entire_doc;
+    string input_lang;
 
     DocTemplate docTemplate;
 
 public:
     DocGenerator(const string &s, const string &i, const string &h,
-            const string &f, const string &c, const string &back, bool entire,
+            const string &f, const string &c, const string &back, bool entire, 
+           const string &l,
             const string &start_tmpl, const string &end_tmpl) :
         title(s), gen_source_highlight_version(true), input_file_name(i),
                 doc_header(h), doc_footer(f), css_url(c), doc_background(back),
-                entire_doc(entire), docTemplate(DocTemplate(start_tmpl,
+         entire_doc(entire), input_lang(l), docTemplate(DocTemplate(start_tmpl,
                         end_tmpl)) {
     }
     DocGenerator(const string &start_tmpl, const string &end_tmpl) :
@@ -97,6 +99,10 @@ public:
         title = _title;
     }
 
+    void setInputLang(const std::string &_input_lang) {
+      input_lang = _input_lang;
+    }
+
     void setBackgroundColor(const std::string &bg) {
         doc_background = bg;
     }
diff --git a/lib/srchilite/doctemplate.cpp b/lib/srchilite/doctemplate.cpp
index 32b4e2f..63309c5 100644
--- a/lib/srchilite/doctemplate.cpp
+++ b/lib/srchilite/doctemplate.cpp
@@ -14,12 +14,14 @@
 namespace srchilite {
 
 #define TITLE_VAR_TEXT "$title" // the text of the title variable
+#define INPUT_LANG_VAR_TEXT "$inputlang" // the text of the input lang variable
 #define CSS_VAR_TEXT "$css" // the text of the css variable
 #define ADDITIONAL_VAR_TEXT "$additional" // the text of the additional text 
variable
 #define HEADER_VAR_TEXT "$header" // the text of the header variable
 #define FOOTER_VAR_TEXT "$footer" // the text of the footer variable
 #define BACKGROUND_VAR_TEXT "$docbgcolor" // the text of the background 
variable
 #define TITLE_VAR "\\" TITLE_VAR_TEXT // the name of the title variable as 
regexp
+#define INPUT_LANG_VAR "\\" INPUT_LANG_VAR_TEXT // the name of the input lang 
variable as regexp
 #define CSS_VAR "\\" CSS_VAR_TEXT // the name of the css variable as regexp
 #define ADDITIONAL_VAR "\\" ADDITIONAL_VAR_TEXT // the text of the additional 
text variable as regexp
 #define HEADER_VAR "\\" HEADER_VAR_TEXT // the text of the header variable as 
regexp
@@ -35,7 +37,8 @@ DocTemplate::DocTemplate(const string &begin, const string 
&end) :
 
 string
 DocTemplate::output_begin(const string &title, const string &cs, const string 
&add,
-    const string &header, const string &footer, const std::string &background)
+    const string &header, const string &footer, const std::string &background,
+    const string &input_lang)
 {
     boost::regex title_exp(TITLE_VAR);
     boost::regex css_exp(CSS_VAR);
@@ -43,6 +46,7 @@ DocTemplate::output_begin(const string &title, const string 
&cs, const string &a
     boost::regex header_exp(HEADER_VAR);
     boost::regex footer_exp(FOOTER_VAR);
     boost::regex background_exp(BACKGROUND_VAR);
+    boost::regex input_lang_exp(INPUT_LANG_VAR);
 
     string ret = subst(title_exp, begin_repr, title);
     ret = subst(css_exp, ret, cs);
@@ -50,13 +54,15 @@ DocTemplate::output_begin(const string &title, const string 
&cs, const string &a
     ret = subst(header_exp, ret, header);
     ret = subst(footer_exp, ret, footer);
     ret = subst(background_exp, ret, background);
+    ret = subst(input_lang_exp, ret, input_lang);
 
     return ret;
 }
 
 string
 DocTemplate::output_end(const string &title, const string &cs, const string 
&add,
-    const string &header, const string &footer, const std::string &background)
+    const string &header, const string &footer, const std::string &background, 
+    const string &input_lang)
 {
     boost::regex title_exp(TITLE_VAR);
     boost::regex css_exp(CSS_VAR);
@@ -64,6 +70,7 @@ DocTemplate::output_end(const string &title, const string 
&cs, const string &add
     boost::regex header_exp(HEADER_VAR);
     boost::regex footer_exp(FOOTER_VAR);
     boost::regex background_exp(BACKGROUND_VAR);
+    boost::regex input_lang_exp(INPUT_LANG_VAR);
 
     string ret = subst(title_exp, end_repr, title);
     ret = subst(css_exp, ret, cs);
@@ -71,6 +78,7 @@ DocTemplate::output_end(const string &title, const string 
&cs, const string &add
     ret = subst(header_exp, ret, header);
     ret = subst(footer_exp, ret, footer);
     ret = subst(background_exp, ret, background);
+    ret = subst(input_lang_exp, ret, input_lang);
 
     return ret;
 }
diff --git a/lib/srchilite/doctemplate.h b/lib/srchilite/doctemplate.h
index 7ee0e1a..17340e6 100644
--- a/lib/srchilite/doctemplate.h
+++ b/lib/srchilite/doctemplate.h
@@ -22,10 +22,12 @@ public:
 
     std::string output_begin(const std::string &title, const std::string &cs,
             const std::string &add, const std::string &header,
-            const std::string &footer, const std::string &background);
+            const std::string &footer, const std::string &background,
+           const std::string &input_lang);
     std::string output_end(const std::string &title, const std::string &cs,
             const std::string &add, const std::string &header,
-            const std::string &footer, const std::string &background);
+            const std::string &footer, const std::string &background,
+           const std::string &input_lang);
 
     const std::string &toStringBegin() const {
         return begin_repr;
diff --git a/lib/srchilite/sourcehighlight.cpp 
b/lib/srchilite/sourcehighlight.cpp
index 9c0a55b..3abaed7 100644
--- a/lib/srchilite/sourcehighlight.cpp
+++ b/lib/srchilite/sourcehighlight.cpp
@@ -257,6 +257,9 @@ void SourceHighlight::highlight(const std::string &input,
         noDocGenerator->setTitle(input);
     }
 
+    docGenerator->setInputLang(inputLang);
+    noDocGenerator->setInputLang(inputLang);      
+
     if (ctagsFormatter) {
         // if we need to generate references, then set the file info
         ctagsFormatter->setFileInfo(input, output);
@@ -334,6 +337,8 @@ void SourceHighlight::highlight(std::istream &input, 
std::ostream &output,
         documentGenerator->setTitle(title);
     }
 
+    documentGenerator->setInputLang(inputLang);
+
     // first generate the start of the output file
     documentGenerator->generate_start_doc(&output);
 
diff --git a/lib/srchilite/sourcehighlight.h b/lib/srchilite/sourcehighlight.h
index 7d61972..4cef31e 100644
--- a/lib/srchilite/sourcehighlight.h
+++ b/lib/srchilite/sourcehighlight.h
@@ -64,6 +64,9 @@ class SourceHighlight {
     /// the title for the output document (defaults to the source file name)
     std::string title;
 
+    /// the input lang for the output document
+    std::string inputLang;
+
     /// the value for the css
     std::string css;
 
@@ -272,6 +275,10 @@ public:
     void setTitle(const std::string &_title) {
         title = _title;
     }
+    
+    void setInputLang(const std::string &_inputLang) {
+        inputLang = _inputLang;
+    }
 
     void setCss(const std::string &_css) {
         css = _css;
diff --git a/lib/tests/test_outlangparser_main.cpp 
b/lib/tests/test_outlangparser_main.cpp
index 467604b..d7f51cf 100644
--- a/lib/tests/test_outlangparser_main.cpp
+++ b/lib/tests/test_outlangparser_main.cpp
@@ -45,7 +45,7 @@ this is simply the footer: $footer",
             textstyles->docTemplate.toStringEnd());
 
     string start = textstyles->docTemplate.output_begin("title", "css",
-            "additional", "header", "footer", "");
+            "additional", "header", "footer", "", "INPUTLANG");
     cout << "DocTemplate start:\n" << start << endl;
 
     assertEquals(
@@ -59,7 +59,7 @@ and this is some additional stuff: additional",
             start);
 
     string end = textstyles->docTemplate.output_end("title", "css",
-            "additional", "header", "footer", "");
+            "additional", "header", "footer", "", "INPUTLANG");
     cout << "DocTemplate end:\n" << end << endl;
 
     assertEquals(
diff --git a/lib/tests/test_textgenerator_main.cpp 
b/lib/tests/test_textgenerator_main.cpp
index aeaef3b..ed58660 100644
--- a/lib/tests/test_textgenerator_main.cpp
+++ b/lib/tests/test_textgenerator_main.cpp
@@ -74,9 +74,9 @@ int main() {
     DocTemplate docTemplate(start, end);
 
     string transformed_start = docTemplate.output_begin("TITLE", "CSS",
-            "ADDITIONAL", "HEADER\n", "\nFOOTER", "");
+            "ADDITIONAL", "HEADER\n", "\nFOOTER", "", "INPUTLANG");
     string transformed_end = docTemplate.output_end("TITLE", "CSS",
-            "ADDITIONAL", "HEADER\n", "\nFOOTER", "");
+            "ADDITIONAL", "HEADER\n", "\nFOOTER", "", "INPUTLANG");
 
     cout << "orig start : " << start << endl;
     cout << "transformed: " << transformed_start << endl;
diff --git a/src/xhtml.outlang b/src/xhtml.outlang
index ecc1a27..cd5d02c 100644
--- a/src/xhtml.outlang
+++ b/src/xhtml.outlang
@@ -7,6 +7,7 @@ doctemplate
 <head>
 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />
 <meta name=\"GENERATOR\" content=\"$additional\" />
+<meta name=\"INPUTLANG\" content=\"$inputlang\" />
 <title>$title</title>
 </head>
 <body style=\"background-color: $docbgcolor\">
diff --git a/src/xhtmlcss.outlang b/src/xhtmlcss.outlang
index 215800f..1b1387f 100644
--- a/src/xhtmlcss.outlang
+++ b/src/xhtmlcss.outlang
@@ -7,6 +7,7 @@ doctemplate
 <head>
 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />
 <meta name=\"GENERATOR\" content=\"$additional\" />
+<meta name=\"INPUTLANG\" content=\"$inputlang\" />
 <title>$title</title>
 <link rel=\"stylesheet\" href=\"$css\" type=\"text/css\" />
 </head>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]