diff options
author | Kamanji <MaxiArtem@gmail.com> | 2020-01-05 12:01:21 +0300 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2020-01-05 10:01:21 +0100 |
commit | 9a5aaadda82c5e33d481097c9c15b9c8e54e34c5 (patch) | |
tree | 84cdfc327bde941048aa41888f31722693ddae9e /lib/packages | |
parent | ae68ff959bcd358f298e5a225307c8bbce4a1e52 (diff) | |
download | Nim-9a5aaadda82c5e33d481097c9c15b9c8e54e34c5.tar.gz |
Rst parser respect `:start-after:` and `:end-before:` in `include` directive (#12972)
* [FEATURE] rst parser respect :start-after: in include Rst parser now respects `:start-after:` and `:end-before:` attributes for `include` directive. * [DOC] include directive parsing proc update * [TEST] Added unit tests for include rst directive in `rst` module
Diffstat (limited to 'lib/packages')
-rw-r--r-- | lib/packages/docutils/rst.nim | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/lib/packages/docutils/rst.nim b/lib/packages/docutils/rst.nim index eaefc7265..50b855662 100644 --- a/lib/packages/docutils/rst.nim +++ b/lib/packages/docutils/rst.nim @@ -1558,15 +1558,20 @@ proc parseDirBody(p: var RstParser, contentParser: SectionParser): PRstNode = popInd(p) proc dirInclude(p: var RstParser): PRstNode = - # - #The following options are recognized: - # - #start-after : text to find in the external data file - # Only the content after the first occurrence of the specified text will - # be included. - #end-before : text to find in the external data file - # Only the content before the first occurrence of the specified text - # (but after any after text) will be included. + ## + ## The following options are recognized: + ## + ## :start-after: text to find in the external data file + ## + ## Only the content after the first occurrence of the specified + ## text will be included. If text is not found inclusion will + ## start from beginning of the file + ## + ## :end-before: text to find in the external data file + ## + ## Only the content before the first occurrence of the specified + ## text (but after any after text) will be included. If text is + ## not found inclusion will happen until the end of the file. #literal : flag (empty) # The entire included text is inserted into the document as a single # literal block (useful for program listings). @@ -1586,10 +1591,34 @@ proc dirInclude(p: var RstParser): PRstNode = result = newRstNode(rnLiteralBlock) add(result, newRstNode(rnLeaf, readFile(path))) else: + let inputString = readFile(path).string() + let startPosition = + block: + let searchFor = n.getFieldValue("start-after").strip() + if searchFor != "": + let pos = inputString.find(searchFor) + if pos != -1: pos + searchFor.len() + else: 0 + else: + 0 + + let endPosition = + block: + let searchFor = n.getFieldValue("end-before").strip() + if searchFor != "": + let pos = inputString.find(searchFor, start = startPosition) + if pos != -1: pos - 1 + else: 0 + else: + inputString.len - 1 + var q: RstParser initParser(q, p.s) q.filename = path - q.col += getTokens(readFile(path), false, q.tok) + q.col += getTokens( + inputString[startPosition..endPosition].strip(), + false, + q.tok) # workaround a GCC bug; more like the interior pointer bug? #if find(q.tok[high(q.tok)].symbol, "\0\x01\x02") > 0: # InternalError("Too many binary zeros in include file") |