* Bug 12810: support added to build RTL pages (style.css, xmltoformat) 22/19822/7
Samuel GOUGEON [Fri, 2 Mar 2018 22:40:07 +0000 (23:40 +0100)]
  http://bugzilla.scilab.org/12810#c25

  With this patch:
  * pages for fa_* and ar_* are correctly built.
    They are correctly rendered RTL in a web browser, with protected
    area (literal, code, pre, etc).
    Only the path is right-justified but still LTR (could be reverted
    with a bit more work... Worthwhile to?)
  * The Scilab help viewer still can't render them correctly.
  * In partial fa or ar corpus, default en_US replacement pages are
    rendered LTR as usual.

Change-Id: I51cf8d62d943a3ddc7512c3ba7e1f5f6a0a7a1db

scilab/CHANGES.md
scilab/modules/helptools/data/css/style.css
scilab/modules/helptools/macros/xmltoformat.sci
scilab/modules/helptools/src/java/org/scilab/modules/helptools/HTMLDocbookTagConverter.java

index 8dd167e..81a63a0 100644 (file)
@@ -447,6 +447,7 @@ Known issues
 * [#12566](http://bugzilla.scilab.org/show_bug.cgi?id=12566): `disp()` of a T-list with a single field set to an encoded integer value generated an error.
 * [#12618](http://bugzilla.scilab.org/show_bug.cgi?id=12618): `mfile2sci()` failed converting `a=1i // ab` into `a=1*%i // ab`.
 * [#12659](http://bugzilla.scilab.org/show_bug.cgi?id=12659): Crash on big modulo.
+* [#12810](http://bugzilla.scilab.org/show_bug.cgi?id=12810): support added to build RTL help pages.
 * [#12926](http://bugzilla.scilab.org/show_bug.cgi?id=12926): `~%f==1` was parsed as `~(%f==1)` instead of `(~%f)==1`.
 * [#13306](http://bugzilla.scilab.org/show_bug.cgi?id=13306): Evaluating a function set as a structure field could fail.
 * [#13197](http://bugzilla.scilab.org/show_bug.cgi?id=13197): The documentation of `lib()` needed to be updated for Scilab 6.
index 93bd898..f116584 100644 (file)
@@ -68,6 +68,7 @@ h5 {
     color:#333333;
     line-height:120%;
     padding:10px;
+    direction: ltr;
 }
 
 .literal {
@@ -91,12 +92,14 @@ h5 {
     font-family: monospace;
     font-size: 100%;
     color: #32b9b9;
+    direction: ltr;
 }
 
 .varname {
     font-family: monospace;
     font-weight: bold;
     font-size: 100%;
+    direction: ltr;
 }
 
 .constant {
@@ -130,6 +133,7 @@ a:hover {
 pre {
     margin-bottom: 0px;
     margin-top: 0px;
+    direction: ltr;
 }
 
 .leftpart {
@@ -203,9 +207,10 @@ ul.toc li {
 /* Top and bottom navigation controls on manual pages --------------------- */
 div.manualnavbar {
     background-color: #F0F0FF;
-        color: inherit;
-        padding: 4px;
-        margin-bottom: 10px;
+    color: inherit;
+    padding: 4px;
+    margin-bottom: 10px;
+    direction: ltr;
 }
 div.manualnavbar .prev {
         padding-right: 4px;
@@ -375,4 +380,3 @@ td.revnumber
 {
   vertical-align: top;
 }
-
index 661c117..fd98367 100644 (file)
@@ -4,7 +4,7 @@
 // Copyright (C) 2009 DIGITEO - Vincent COUVERT <vincent.couvert@scilab.org>
 // Copyright (C) 2010 - 2011 DIGITEO - Allan CORNET
 // Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
-// Copyright (C) 2016 - Samuel GOUGEON
+// Copyright (C) 2016, 2018 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
@@ -371,7 +371,7 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
         elseif nb_dir==1
             mprintf(_("\nBuilding the master document:\n"));
         end
-        
+
         for k=1:nb_dir
             mprintf(_("\t%s\n"),strsubst(dirs_c(k),SCI_long,"SCI"));
 
@@ -393,7 +393,7 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
         elseif nb_dir==1
             mprintf(_("\nBuilding the master document:\n"));
         end
-        
+
         for k=1:nb_dir
             mprintf(_("\t%s\n"),strsubst(dirs(k),SCI_long,"SCI"));
 
@@ -595,9 +595,21 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
 
             // process the build
             fileToExec = buildDoc(output_format,this_tree("master_document"),directory_language_c(k),dirs_c(k));
+            // In case of HTML or jar requested: HTML files are now available
+            // Not yet the jar.
+
             if fileToExec ~= [] then
                 exec(fileToExec, -1);
             end
+
+            // In case of Right-to-left language, we must now tune some tags
+            //  and contents in HTML files to support the Right-to-left rendering
+            if or(part(directory_language_c(k),1:2)==["fa" "ar"])
+                path = dirs_c(k)+filesep()+"scilab_"+directory_language_c(k)+"_help"+filesep();
+                x2f_tune_rtl_html(path, directory_language_c(k));
+            end
+
+            // if javaHelp: => building now the jar from the HTML
             if ~isempty(second_pass_format) then
                 buildDoc(second_pass_format,this_tree("master_document"),directory_language_c(k),dirs_c(k));
             end
@@ -696,9 +708,21 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
 
             // process the build
             fileToExec = buildDoc(output_format,this_tree("master_document"),directory_language(k),dirs(k));
+            // In case of HTML or jar requested: HTML files are now available
+            // Not yet the jar.
+
             if fileToExec ~= [] then
                 exec(fileToExec, -1);
             end
+
+            // In case of Right-to-left language, we must now tune some tags
+            //  and contents in HTML files to support the Right-to-left rendering
+            if or(part(directory_language(k),1:2)==["fa" "ar"])
+                path = dirs(k)+filesep()+"scilab_"+directory_language(k)+"_help"+filesep();
+                x2f_tune_rtl_html(path, directory_language(k));
+            end
+
+            // if javaHelp: => building now the jar from the HTML
             if ~isempty(second_pass_format) then
                 buildDoc(second_pass_format,this_tree("master_document"),directory_language(k),dirs(k));
             end
@@ -722,6 +746,57 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
 endfunction
 
 // =============================================================================
+// In case of Right-to-left language: tune some HTML tags and contents in HTML
+// files to support the right-to-left rendering
+// =============================================================================
+function x2f_tune_rtl_html(path, lang)
+    // Called only for fa_* and ar_* RtL languages
+    mprintf(_("Post-processing Right-to-Left pages in ""%s""...\n"), lang);
+
+    lang = part(lang,1:2);
+
+    F = listfiles(path + "*.html");
+    if F==[] then
+        return
+    end
+    n = size(F,1);
+    if n>100 & getscilabmode()~="NWNI" then
+        h = waitbar(0);
+    end
+    i = 0;
+    for f = F'
+        c = htmlRead(f);
+        // We must detect, select and process only non default en_US pages:
+        // "ا" aleph = max frequency character in Farsi and Arabic (~12%)
+        // p = xmlXPath(c, "//body/div/p[@class=""refpurpose""]").content;
+        //   Too short sample... and not applicable to sections pages.
+        // => Rather considering the content of the whole page:
+        cc = htmlRead(f);
+        p = xmlXPath(cc, "//head");
+        xmlRemove(p);
+        p = xmlXPath(cc, "//body/div[@class=""manualnavbar""]");
+        xmlRemove(p);
+        p = xmlXPath(cc, "//body/span[@class=""path""]");
+        xmlRemove(p);
+        p = xmlXPath(cc, "//body/div/ul/li[@class=""member""]");
+        xmlRemove(p);
+        if grep(strcat(cc.root.content),"ا")~=[]
+            xmlSetAttributes(c.root, ["dir" "rtl"]);  // <html> => <html dir="rtl"> :
+            htmlWrite(c, f);
+        end
+        xmlDelete(c);
+        xmlDelete(cc);
+        i = i+1;
+        if isdef("h","l") & ~modulo(i, 20)
+            waitbar(i/n, h)
+        end
+    end
+    if isdef("h","l") then
+        close(h)
+    end
+endfunction
+
+// =============================================================================
 // check and move the generated files
 // =============================================================================
 function check_move(buildDoc_file)
@@ -1592,7 +1667,7 @@ endfunction
 // tree_out = x2f_merge_trees( tree_in_1 , tree_in_2 )
 //    tree_in_1: reference
 //    tree_in_2: secondary (to be completed from reference)
-//    
+//
 // Date : 27/04/2009
 // =============================================================================
 
@@ -1670,7 +1745,7 @@ function tree_out = x2f_merge_trees( tree_in_1 , tree_in_2 )
             tree_out("xml_number")  = tree_out("xml_number") + 1;
         end
     end
-    
+
     // Fix http://bugzilla.scilab.org/11692 :
     tmp = strsubst(convstr(xmllist_out(:,4)), "/^percent/","%","r")
     [tmp, k] = gsort(tmp, "g", "i");
index 69b15a9..57a9641 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2010 - Calixte DENIZET
- * Copyright (C) 2016, 2017 - Samuel GOUGEON
+ * Copyright (C) 2016 - 2018 - Samuel GOUGEON
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
  *
@@ -438,7 +438,7 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
      */
     public String makePath(final String id) {
         buffer.setLength(0);
-        buffer.append("<span class=\"path\">");
+        buffer.append("<span class=\"path\" dir=\"ltr\">");
         HTMLDocbookLinkResolver.TreeId leaf = mapTreeId.get(id);
         if (leaf == null) {
             return "";
@@ -876,7 +876,7 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
      * @throws SAXEception if an error is encountered
      */
     public String handleLiteral(final Map<String, String> attributes, final String contents) throws SAXException {
-        return encloseContents("code", "literal", contents);
+      return encloseContents("code", new String[] {"class", "literal", "dir", "ltr"}, contents);
     }
 
     /**
@@ -893,7 +893,7 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
         //replace spaces by &nbsp;
         s = s.replace(" ", "&nbsp;");
 
-        return encloseContents("code", "literallayout", s);
+        return encloseContents("code", new String[] {"class", "literallayout", "dir", "ltr"}, s);
     }
 
     /**