summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-11-29 13:55:30 +0100
committerAraq <rumpf_a@web.de>2014-11-29 13:55:30 +0100
commit80b83611875383760da40d626a516e794e1245e7 (patch)
treeba2681fe63384569e53a7414c4fb02fa92ec6671
parent51dd4b7601e24ed5997cf5a60d8e7f6f382b5eb1 (diff)
downloadNim-80b83611875383760da40d626a516e794e1245e7.tar.gz
smileys configurable; safer image attribute handling
-rw-r--r--lib/packages/docutils/rst.nim6
-rw-r--r--lib/packages/docutils/rstgen.nim42
-rw-r--r--todo.txt1
3 files changed, 28 insertions, 21 deletions
diff --git a/lib/packages/docutils/rst.nim b/lib/packages/docutils/rst.nim
index 07014c754..95d49bad7 100644
--- a/lib/packages/docutils/rst.nim
+++ b/lib/packages/docutils/rst.nim
@@ -254,11 +254,11 @@ proc getTokens(buffer: string, skipPounds: bool, tokens: var TTokenSeq): int =
 
 type
   TLevelMap = array[char, int]
-  TSubstitution{.final.} = object 
+  TSubstitution = object 
     key*: string
     value*: PRstNode
 
-  TSharedState {.final.} = object 
+  TSharedState = object 
     options: TRstParseOptions   # parsing options
     uLevel, oLevel: int         # counters for the section levels
     subs: seq[TSubstitution]    # substitutions
@@ -273,7 +273,7 @@ type
                                 # This is for over-underline adornments.
     msgHandler: TMsgHandler     # How to handle errors.
     findFile: TFindFileHandler  # How to find files.
-  
+
   PSharedState = ref TSharedState
   TRstParser = object of RootObj
     idx*: int
diff --git a/lib/packages/docutils/rstgen.nim b/lib/packages/docutils/rstgen.nim
index 50246f2e0..514292039 100644
--- a/lib/packages/docutils/rstgen.nim
+++ b/lib/packages/docutils/rstgen.nim
@@ -60,6 +60,7 @@ type
     seenIndexTerms: Table[string, int] ## \
     ## Keeps count of same text index terms to generate different identifiers
     ## for hyperlinks. See renderIndexTerm proc for details.
+    smileyFrmt: string   ## How to massage the smiley filename.
   
   PDoc = var TRstGenerator ## Alias to type less.
 
@@ -79,8 +80,9 @@ proc init(p: var CodeBlockParams) =
 proc initRstGenerator*(g: var TRstGenerator, target: TOutputTarget,
                        config: StringTableRef, filename: string,
                        options: TRstParseOptions,
-                       findFile: TFindFileHandler,
-                       msgHandler: TMsgHandler) =
+                       findFile: TFindFileHandler=nil,
+                       msgHandler: TMsgHandler=nil,
+                       smileyFrmt = "/images/smilies/$1.gif") =
   ## Initializes a ``TRstGenerator``.
   ##
   ## You need to call this before using a ``TRstGenerator`` with any other
@@ -121,10 +123,7 @@ proc initRstGenerator*(g: var TRstGenerator, target: TOutputTarget,
   ##   import packages/docutils/rstgen
   ##
   ##   var gen: TRstGenerator
-  ##
-  ##   gen.initRstGenerator(outHtml, defaultConfig(),
-  ##     "filename", {}, nil, nil)
-
+  ##   gen.initRstGenerator(outHtml, defaultConfig(), "filename", {})
   g.config = config
   g.target = target
   g.tocPart = @[]
@@ -143,6 +142,7 @@ proc initRstGenerator*(g: var TRstGenerator, target: TOutputTarget,
   let s = config["split.item.toc"]
   if s != "": g.splitAfter = parseInt(s)
   for i in low(g.meta)..high(g.meta): g.meta[i] = ""
+  g.smileyFrmt = smileyFrmt
 
 proc writeIndexFile*(g: var TRstGenerator, outfile: string) =
   ## Writes the current index buffer to the specified output file.
@@ -745,34 +745,40 @@ proc renderTocEntries*(d: var TRstGenerator, j: var int, lvl: int,
   else:
     result.add(tmp)
 
-proc renderImage(d: PDoc, n: PRstNode, result: var string) = 
+proc renderImage(d: PDoc, n: PRstNode, result: var string) =
+  template valid(s): expr =
+    s.len > 0 and allCharsInSet(s, {'/',':','%','_','\\','\128'..'\xFF'} +
+                                   Digits + Letters + WhiteSpace)
+
   var options = ""
   var s = getFieldValue(n, "scale")
-  if s != "": dispA(d.target, options, " scale=\"$1\"", " scale=$1", [strip(s)])
+  if s.valid: dispA(d.target, options, " scale=\"$1\"", " scale=$1", [strip(s)])
   
   s = getFieldValue(n, "height")
-  if s != "": dispA(d.target, options, " height=\"$1\"", " height=$1", [strip(s)])
+  if s.valid: dispA(d.target, options, " height=\"$1\"", " height=$1", [strip(s)])
   
   s = getFieldValue(n, "width")
-  if s != "": dispA(d.target, options, " width=\"$1\"", " width=$1", [strip(s)])
+  if s.valid: dispA(d.target, options, " width=\"$1\"", " width=$1", [strip(s)])
   
   s = getFieldValue(n, "alt")
-  if s != "": dispA(d.target, options, " alt=\"$1\"", "", [strip(s)])
+  if s.valid: dispA(d.target, options, " alt=\"$1\"", "", [strip(s)])
   
   s = getFieldValue(n, "align")
-  if s != "": dispA(d.target, options, " align=\"$1\"", "", [strip(s)])
+  if s.valid: dispA(d.target, options, " align=\"$1\"", "", [strip(s)])
   
   if options.len > 0: options = dispF(d.target, "$1", "[$1]", [options])
-  
-  dispA(d.target, result, "<img src=\"$1\"$2 />", "\\includegraphics$2{$1}", 
-                 [getArgument(n), options])
+
+  let arg = getArgument(n)
+  if arg.valid:
+    dispA(d.target, result, "<img src=\"$1\"$2 />", "\\includegraphics$2{$1}", 
+          [arg, options])
   if len(n) >= 3: renderRstToOut(d, n.sons[2], result)
   
 proc renderSmiley(d: PDoc, n: PRstNode, result: var string) =
   dispA(d.target, result,
-    """<img src="/images/smilies/$1.gif" width="15" 
-        height="17" hspace="2" vspace="2" />""",
-    "\\includegraphics{$1}", [n.text])
+    """<img src="$1" width="15" 
+        height="17" hspace="2" vspace="2" class="smiley" />""",
+    "\\includegraphics{$1}", [d.smileyFrmt % n.text])
   
 proc parseCodeBlockField(d: PDoc, n: PRstNode, params: var CodeBlockParams) =
   ## Parses useful fields which can appear before a code block.
diff --git a/todo.txt b/todo.txt
index 41db0b72f..077f5c9cb 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,6 +1,7 @@
 version 0.10
 ============
 
+- introduce ``--experimental`` switch
 - make nimble part of the distribution
 - split idetools into separate tool
 - split docgen into separate tool