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, "
", "\\includegraphics$2{$1}",
- [getArgument(n), options])
+
+ let arg = getArgument(n)
+ if arg.valid:
+ dispA(d.target, result, "
", "\\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,
- """
""",
- "\\includegraphics{$1}", [n.text])
+ """
""",
+ "\\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