Markdown indented code blocks (#20473)

* Implement Markdown indented code blocks

Additional indentation of 4 spaces makes a block an "indented code block"
(monospaced text without syntax highlighting).
Also `::` RST syntax for code blocks is disabled.

So instead of
```rst
see::

  Some code
```

the code block should be written as
```markdown
see:

    Some code
```

* Migrate RST literal blocks :: to Markdown's ones
This commit is contained in:
Andrey Makarov 2022-10-05 21:03:10 +03:00 • committed by GitHub
commit 6505bd347d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 697 additions and 603 deletions

View file

@ -1,4 +1,3 @@
::
nim command [options] [projectfile] [arguments] nim command [options] [projectfile] [arguments]

View file

@ -314,12 +314,12 @@ To avoid accidental highlighting follow this rule in ``*.nim`` files:
programming languages, including identifiers, in ``*.nim`` files. programming languages, including identifiers, in ``*.nim`` files.
For languages other than Nim add a role after final backtick, For languages other than Nim add a role after final backtick,
e.g. for C++ inline highlighting:: e.g. for C++ inline highlighting:
`#include <stdio.h>`:cpp: `#include <stdio.h>`:cpp:
For a currently unsupported language add the `:code:` role, For a currently unsupported language add the `:code:` role,
like for SQL in this example:: like for SQL in this example:
`SELECT * FROM <table_name>;`:code: `SELECT * FROM <table_name>;`:code:
@ -336,7 +336,7 @@ To avoid accidental highlighting follow this rule in ``*.nim`` files:
.. Note:: ``*.rst`` files have ``:literal:`` as their default role. .. Note:: ``*.rst`` files have ``:literal:`` as their default role.
So for them the rule above is only applicable if the ``:nim:`` role So for them the rule above is only applicable if the ``:nim:`` role
is set up manually as the default \[*]:: is set up manually as the default \[*]:
.. role:: nim(code) .. role:: nim(code)
:language: nim :language: nim
@ -489,7 +489,7 @@ General commit rules
git diff --check --cached || exit $? git diff --check --cached || exit $?
``` ```
5. Describe your commit and use your common sense. 5. Describe your commit and use your common sense.
Example commit message:: Example commit message:
Fixes #123; refs #124 Fixes #123; refs #124
@ -581,8 +581,6 @@ Code reviews
3. In addition, you can view GitHub-like diffs locally to identify what was changed 3. In addition, you can view GitHub-like diffs locally to identify what was changed
within a code block using `diff-highlight`:cmd: or `diff-so-fancy`:cmd:, e.g.: within a code block using `diff-highlight`:cmd: or `diff-so-fancy`:cmd:, e.g.:
::
# put this in ~/.gitconfig: # put this in ~/.gitconfig:
[core] [core]
pager = "diff-so-fancy | less -R" # or: use: `diff-highlight` pager = "diff-so-fancy | less -R" # or: use: `diff-highlight`

View file

@ -358,7 +358,6 @@ Rewrite rules
The current implementation follows strategy (2). This means that resources are The current implementation follows strategy (2). This means that resources are
destroyed at the scope exit. destroyed at the scope exit.
::
var x: T; stmts var x: T; stmts
--------------- (destroy-var) --------------- (destroy-var)

View file

@ -64,7 +64,8 @@ Example:
age: int age: int
``` ```
Outputs:: Outputs:
Person* = object Person* = object
name: string name: string
age: int age: int
@ -133,7 +134,8 @@ The `doc`:option: command:
nim doc docgen_sample.nim nim doc docgen_sample.nim
``` ```
Partial Output:: Partial Output:
... ...
proc helloWorld(times: int) {.raises: [], tags: [].} proc helloWorld(times: int) {.raises: [], tags: [].}
... ...
@ -179,7 +181,8 @@ The `jsondoc`:option: command:
nim jsondoc docgen_sample.nim nim jsondoc docgen_sample.nim
``` ```
Output:: Output:
{ {
"orig": "docgen_sample.nim", "orig": "docgen_sample.nim",
"nimble": "", "nimble": "",
@ -205,7 +208,8 @@ The `jsondoc0`:option: command:
nim jsondoc0 docgen_sample.nim nim jsondoc0 docgen_sample.nim
``` ```
Output:: Output:
[ [
{ {
"comment": "This module is a sample." "comment": "This module is a sample."
@ -247,9 +251,12 @@ If you have a constant:
then it should be referenced in one of the 2 forms: then it should be referenced in one of the 2 forms:
A. non-qualified (no symbol kind specification):: A. non-qualified (no symbol kind specification):
pi_ pi_
B. qualified (with symbol kind specification)::
B. qualified (with symbol kind specification):
`const pi`_ `const pi`_
For routine kinds there are more options. Consider this definition: For routine kinds there are more options. Consider this definition:
@ -262,11 +269,11 @@ Generally following syntax is allowed for referencing `foo`:
* short (without parameters): * short (without parameters):
A. non-qualified:: A. non-qualified:
foo_ foo_
B. qualified:: B. qualified:
`proc foo`_ `proc foo`_
@ -274,29 +281,29 @@ Generally following syntax is allowed for referencing `foo`:
A. non-qualified: A. non-qualified:
1) specifying parameters names:: 1) specifying parameters names:
`foo(a, b)`_ `foo(a, b)`_
2) specifying parameters types:: 2) specifying parameters types:
`foo(int, float)`_ `foo(int, float)`_
3) specifying both names and types:: 3) specifying both names and types:
`foo(a: int, b: float)`_ `foo(a: int, b: float)`_
4) output parameter can also be specified if you wish:: 4) output parameter can also be specified if you wish:
`foo(a: int, b: float): string`_ `foo(a: int, b: float): string`_
B. qualified: all 4 options above are valid. B. qualified: all 4 options above are valid.
Particularly you can use the full format:: Particularly you can use the full format:
`proc foo(a: int, b: float): string`_ `proc foo(a: int, b: float): string`_
.. Tip:: Avoid cluttering your text with extraneous information by using .. Tip:: Avoid cluttering your text with extraneous information by using
one of shorter forms:: one of shorter forms:
binarySearch_ binarySearch_
`binarySearch(a, key, cmp)`_ `binarySearch(a, key, cmp)`_
@ -304,7 +311,7 @@ Generally following syntax is allowed for referencing `foo`:
Brevity is better for reading! If you use a short form and have an Brevity is better for reading! If you use a short form and have an
ambiguity problem (see below) then just add some additional info. ambiguity problem (see below) then just add some additional info.
Symbol kind like `proc` can also be specified in the postfix form:: Symbol kind like `proc` can also be specified in the postfix form:
`foo proc`_ `foo proc`_
`walkDir(d: string) iterator`_ `walkDir(d: string) iterator`_
@ -320,7 +327,7 @@ Symbol kind like `proc` can also be specified in the postfix form::
`proc` and `template`. In this case they are split between their `proc` and `template`. In this case they are split between their
corresponding sections in output file. Qualified references are corresponding sections in output file. Qualified references are
useful in this case -- just disambiguate by referring to these useful in this case -- just disambiguate by referring to these
sections explicitly:: sections explicitly:
See `foo proc`_ and `foo template`_. See `foo proc`_ and `foo template`_.
@ -334,7 +341,7 @@ Symbol kind like `proc` can also be specified in the postfix form::
(while procs have higher priority than other Nim symbol kinds). (while procs have higher priority than other Nim symbol kinds).
Generic parameters can also be used. All in all, this long form will be Generic parameters can also be used. All in all, this long form will be
recognized fine:: recognized fine:
`proc binarySearch*[T; K](a: openArray[T], key: K, cmp: proc(T, K)): int`_ `proc binarySearch*[T; K](a: openArray[T], key: K, cmp: proc(T, K)): int`_
@ -351,14 +358,14 @@ recognized fine::
``` ```
you cannot use names underlined by `~~` so it must be referenced with you cannot use names underlined by `~~` so it must be referenced with
``cmp: proc(T, K)``. Hence these forms are valid:: ``cmp: proc(T, K)``. Hence these forms are valid:
`binarySearch(a: openArray[T], key: K, cmp: proc(T, K))`_ `binarySearch(a: openArray[T], key: K, cmp: proc(T, K))`_
`binarySearch(openArray[T], K, proc(T, K))`_ `binarySearch(openArray[T], K, proc(T, K))`_
`binarySearch(a, key, cmp)`_ `binarySearch(a, key, cmp)`_
2. Default values in routine parameters are not recognized, one needs to 2. Default values in routine parameters are not recognized, one needs to
specify the type and/or name instead. E.g. for referencing `proc f(x = 7)` specify the type and/or name instead. E.g. for referencing `proc f(x = 7)`
use one of the mentioned forms:: use one of the mentioned forms:
`f(int)`_ or `f(x)`_ or `f(x: int)`_. `f(int)`_ or `f(x)`_ or `f(x: int)`_.
3. Generic parameters must be given the same way as in the 3. Generic parameters must be given the same way as in the
@ -376,7 +383,7 @@ recognized fine::
func `[]`*[T](x: openArray[T]): T func `[]`*[T](x: openArray[T]): T
``` ```
A short form works without additional backticks:: A short form works without additional backticks:
`$`_ `$`_
`[]`_ `[]`_
@ -384,7 +391,7 @@ recognized fine::
However for fully-qualified reference copy-pasting backticks (`) into other However for fully-qualified reference copy-pasting backticks (`) into other
backticks will not work in our RST parser (because we use Markdown-like backticks will not work in our RST parser (because we use Markdown-like
inline markup rules). You need either to delete backticks or keep inline markup rules). You need either to delete backticks or keep
them and escape with backslash \\:: them and escape with backslash \\:
no backticks: `func $`_ no backticks: `func $`_
escaped: `func \`$\``_ escaped: `func \`$\``_
@ -392,7 +399,7 @@ recognized fine::
escaped: `func \`[]\`[T](x: openArray[T]): T`_ escaped: `func \`[]\`[T](x: openArray[T]): T`_
.. Note:: Types that defined as `enum`, or `object`, or `tuple` can also be .. Note:: Types that defined as `enum`, or `object`, or `tuple` can also be
referenced with those names directly (instead of `type`):: referenced with those names directly (instead of `type`):
type CopyFlag = enum type CopyFlag = enum
... ...

View file

@ -66,7 +66,7 @@ without additional annotations:
``` ```
This program contains a famous "index out of bounds" bug. DrNim This program contains a famous "index out of bounds" bug. DrNim
detects it and produces the following error message:: detects it and produces the following error message:
cannot prove: i <= len(a) + -1; counter example: i -> 0 a.len -> 0 [IndexCheck] cannot prove: i <= len(a) + -1; counter example: i -> 0 a.len -> 0 [IndexCheck]
@ -146,7 +146,7 @@ Example: insertionSort
Unfortunately, the invariants required to prove that this code is correct take more Unfortunately, the invariants required to prove that this code is correct take more
code than the imperative instructions. However, this effort can be compensated code than the imperative instructions. However, this effort can be compensated
by the fact that the result needs very little testing. Be aware though that by the fact that the result needs very little testing. Be aware though that
DrNim only proves that after `insertionSort` this condition holds:: DrNim only proves that after `insertionSort` this condition holds:
forall(i in 1..<a.len, a[i-1] <= a[i]) forall(i in 1..<a.len, a[i-1] <= a[i])
@ -170,7 +170,7 @@ Syntax of propositions
====================== ======================
The basic syntax is `ensures|requires|invariant: <prop>`. The basic syntax is `ensures|requires|invariant: <prop>`.
A `prop` is either a comparison or a compound:: A `prop` is either a comparison or a compound:
prop = nim_bool_expression prop = nim_bool_expression
| prop 'and' prop | prop 'and' prop

View file

@ -70,7 +70,6 @@ the trace acts like an explanation; in traditional profilers you can only find
expensive leaf functions easily but the *reason* why they are invoked expensive leaf functions easily but the *reason* why they are invoked
often remains mysterious. often remains mysterious.
::
total executions of each stack trace: total executions of each stack trace:
Entry: 0/3391 Calls: 84/4160 = 2.0% [sum: 84; 84/4160 = 2.0%] Entry: 0/3391 Calls: 84/4160 = 2.0% [sum: 84; 84/4160 = 2.0%]
newCrcFromRopeAux newCrcFromRopeAux

View file

@ -10,7 +10,7 @@ A `Source Code Filter (SCF)` transforms the input character stream to an in-mem
output stream before parsing. A filter can be used to provide templating output stream before parsing. A filter can be used to provide templating
systems or preprocessors. systems or preprocessors.
To use a filter for a source file the `#?` notation is used:: To use a filter for a source file the `#?` notation is used:
#? stdtmpl(subsChar = '$', metaChar = '#') #? stdtmpl(subsChar = '$', metaChar = '#')
#proc generateXML(name, age: string): string = #proc generateXML(name, age: string): string =
@ -50,7 +50,7 @@ In your `main.nim`:
Pipe operator Pipe operator
============= =============
Filters can be combined with the `|` pipe operator:: Filters can be combined with the `|` pipe operator:
#? strip(startswith="<") | stdtmpl #? strip(startswith="<") | stdtmpl
#proc generateXML(name, age: string): string = #proc generateXML(name, age: string): string =
@ -123,7 +123,7 @@ Parameters and their defaults:
* `toString: string = "$"` * `toString: string = "$"`
: the operation that is applied to each expression : the operation that is applied to each expression
Example:: Example:
#? stdtmpl | standard #? stdtmpl | standard
#proc generateHTMLPage(title, currentTab, content: string, #proc generateHTMLPage(title, currentTab, content: string,
@ -183,7 +183,7 @@ whitespace) is converted to a string literal that is added to `result`.
The substitution character introduces a Nim expression *e* within the The substitution character introduces a Nim expression *e* within the
string literal. *e* is converted to a string with the *toString* operation string literal. *e* is converted to a string with the *toString* operation
which defaults to `$`. For strong type checking, set `toString` to the which defaults to `$`. For strong type checking, set `toString` to the
empty string. *e* must match this PEG pattern:: empty string. *e* must match this PEG pattern:
e <- [a-zA-Z\128-\255][a-zA-Z0-9\128-\255_.]* / '{' x '}' e <- [a-zA-Z\128-\255][a-zA-Z0-9\128-\255_.]* / '{' x '}'
x <- '{' x+ '}' / [^}]* x <- '{' x+ '}' / [^}]*
@ -192,7 +192,7 @@ To produce a single substitution character it has to be doubled: `$$`
produces `$`. produces `$`.
The template engine is quite flexible. It is easy to produce a procedure that The template engine is quite flexible. It is easy to produce a procedure that
writes the template code directly to a file:: writes the template code directly to a file:
#? stdtmpl(emit="f.write") | standard #? stdtmpl(emit="f.write") | standard
#proc writeHTMLPage(f: File, title, currentTab, content: string, #proc writeHTMLPage(f: File, title, currentTab, content: string,

View file

@ -36,13 +36,17 @@ Specifying the location of the query
All of the available idetools commands require you to specify a All of the available idetools commands require you to specify a
query location through the `--track` or `--trackDirty` switches. query location through the `--track` or `--trackDirty` switches.
The general idetools invocations are:: The general idetools invocations are:
```cmd
nim idetools --track:FILE,LINE,COL <switches> proj.nim nim idetools --track:FILE,LINE,COL <switches> proj.nim
```
Or:: Or:
```cmd
nim idetools --trackDirty:DIRTY_FILE,FILE,LINE,COL <switches> proj.nim nim idetools --trackDirty:DIRTY_FILE,FILE,LINE,COL <switches> proj.nim
```
`proj.nim` `proj.nim`
: This is the main *project* filename. Most of the time you will : This is the main *project* filename. Most of the time you will
@ -178,14 +182,18 @@ results of the compilation, and subsequent queries should be fast
in the millisecond range, thus being responsive enough for IDEs. in the millisecond range, thus being responsive enough for IDEs.
If you want to start the server using stdin/stdout as communication If you want to start the server using stdin/stdout as communication
you need to type:: you need to type:
```cmd
nim serve --server.type:stdin proj.nim nim serve --server.type:stdin proj.nim
```
If you want to start the server using tcp and a port, you need to type:: If you want to start the server using tcp and a port, you need to type:
```cmd
nim serve --server.type:tcp --server.port:6000 \ nim serve --server.type:tcp --server.port:6000 \
--server.address:hostname proj.nim --server.address:hostname proj.nim
```
In both cases the server will start up and await further commands. In both cases the server will start up and await further commands.
The syntax of the commands you can now send to the server is The syntax of the commands you can now send to the server is
@ -542,10 +550,12 @@ Running the test suite
At the moment idetools support is still in development so the test At the moment idetools support is still in development so the test
suite is not integrated with the main test suite and you have to suite is not integrated with the main test suite and you have to
run it manually. First you have to compile the tester:: run it manually. First you have to compile the tester:
```cmd
$ cd my/nim/checkout/tests $ cd my/nim/checkout/tests
$ nim c testament/caasdriver.nim $ nim c testament/caasdriver.nim
```
Running the `caasdriver` without parameters will attempt to process Running the `caasdriver` without parameters will attempt to process
all the test cases in all three operation modes. If a test succeeds all the test cases in all three operation modes. If a test succeeds
@ -567,9 +577,11 @@ If you don't want to run all the test case files you can pass any
substring as a parameter to `caasdriver`. Only files matching the substring as a parameter to `caasdriver`. Only files matching the
passed substring will be run. The filtering doesn't use any globbing passed substring will be run. The filtering doesn't use any globbing
metacharacters, it's a plain match. For example, to run only metacharacters, it's a plain match. For example, to run only
`*-compile*.txt` tests in verbose mode:: `*-compile*.txt` tests in verbose mode:
```cmd
./caasdriver verbose -compile ./caasdriver verbose -compile
```
Test case file format Test case file format

View file

@ -593,14 +593,14 @@ Integer literals
In Nim, there is a redundant way to specify the type of an In Nim, there is a redundant way to specify the type of an
integer literal. First, it should be unsurprising that every integer literal. First, it should be unsurprising that every
node has a node kind. The node of an integer literal can be any of the node has a node kind. The node of an integer literal can be any of the
following values:: following values:
nkIntLit, nkInt8Lit, nkInt16Lit, nkInt32Lit, nkInt64Lit, nkIntLit, nkInt8Lit, nkInt16Lit, nkInt32Lit, nkInt64Lit,
nkUIntLit, nkUInt8Lit, nkUInt16Lit, nkUInt32Lit, nkUInt64Lit nkUIntLit, nkUInt8Lit, nkUInt16Lit, nkUInt32Lit, nkUInt64Lit
On top of that, there is also the `typ` field for the type. The On top of that, there is also the `typ` field for the type. The
kind of the `typ` field can be one of the following ones, and it kind of the `typ` field can be one of the following ones, and it
should be matching the literal kind:: should be matching the literal kind:
tyInt, tyInt8, tyInt16, tyInt32, tyInt64, tyUInt, tyUInt8, tyInt, tyInt8, tyInt16, tyInt32, tyInt64, tyUInt, tyUInt8,
tyUInt16, tyUInt32, tyUInt64 tyUInt16, tyUInt32, tyUInt64
@ -656,7 +656,6 @@ pointing back to the integer literal node in the ast containing the
integer value. These are the properties that hold true for integer integer value. These are the properties that hold true for integer
literal types. literal types.
::
n.kind == nkIntLit n.kind == nkIntLit
n.typ.kind == tyInt n.typ.kind == tyInt
n.typ.n == n n.typ.n == n

View file

@ -47,14 +47,14 @@ is not ambiguous.
Non-terminals start with a lowercase letter, abstract terminal symbols are in Non-terminals start with a lowercase letter, abstract terminal symbols are in
UPPERCASE. Verbatim terminal symbols (including keywords) are quoted UPPERCASE. Verbatim terminal symbols (including keywords) are quoted
with `'`. An example:: with `'`. An example:
ifStmt = 'if' expr ':' stmts ('elif' expr ':' stmts)* ('else' stmts)? ifStmt = 'if' expr ':' stmts ('elif' expr ':' stmts)* ('else' stmts)?
The binary `^*` operator is used as a shorthand for 0 or more occurrences The binary `^*` operator is used as a shorthand for 0 or more occurrences
separated by its second argument; likewise `^+` means 1 or more separated by its second argument; likewise `^+` means 1 or more
occurrences: `a ^+ b` is short for `a (b a)*` occurrences: `a ^+ b` is short for `a (b a)*`
and `a ^* b` is short for `(a (b a)*)?`. Example:: and `a ^* b` is short for `(a (b a)*)?`. Example:
arrayConstructor = '[' expr ^* ',' ']' arrayConstructor = '[' expr ^* ',' ']'
@ -190,7 +190,7 @@ is another pseudo terminal that describes the *action* of popping a value
from the stack, `IND{>}` then implies to push onto the stack. from the stack, `IND{>}` then implies to push onto the stack.
With this notation we can now easily define the core of the grammar: A block of With this notation we can now easily define the core of the grammar: A block of
statements (simplified example):: statements (simplified example):
ifStmt = 'if' expr ':' stmt ifStmt = 'if' expr ':' stmt
(IND{=} 'elif' expr ':' stmt)* (IND{=} 'elif' expr ':' stmt)*
@ -409,7 +409,7 @@ ending of the string literal is defined by the pattern `"""[^"]`, so this:
""""long string within quotes"""" """"long string within quotes""""
``` ```
Produces:: Produces:
"long string within quotes" "long string within quotes"
@ -434,7 +434,7 @@ To produce a single `"` within a raw string literal, it has to be doubled:
r"a""b" r"a""b"
``` ```
Produces:: Produces:
a"b a"b
@ -513,7 +513,7 @@ See also [custom numeric literals].
Numeric literals Numeric literals
---------------- ----------------
Numeric literals have the form:: Numeric literals have the form:
hexdigit = digit | 'A'..'F' | 'a'..'f' hexdigit = digit | 'A'..'F' | 'a'..'f'
octdigit = '0'..'7' octdigit = '0'..'7'
@ -674,7 +674,7 @@ Operators
--------- ---------
Nim allows user defined operators. An operator is any combination of the Nim allows user defined operators. An operator is any combination of the
following characters:: following characters:
= + - * / < > = + - * / < >
@ $ ~ & % | @ $ ~ & % |
@ -698,7 +698,7 @@ as `a(not b)`, not as `(a) not (b)`.
Unicode Operators Unicode Operators
----------------- -----------------
These Unicode operators are also parsed as operators:: These Unicode operators are also parsed as operators:
∙ ∘ × ★ ⊗ ⊘ ⊙ ⊛ ⊠ ⊡ ∩ ∧ ⊓ # same priority as * (multiplication) ∙ ∘ × ★ ⊗ ⊘ ⊙ ⊛ ⊠ ⊡ ∩ ∧ ⊓ # same priority as * (multiplication)
± ⊕ ⊖ ⊞ ⊟ ∪ ∨ ⊔ # same priority as + (addition) ± ⊕ ⊖ ⊞ ⊟ ∪ ∨ ⊔ # same priority as + (addition)
@ -714,7 +714,7 @@ No Unicode normalization step is performed.
Other tokens Other tokens
------------ ------------
The following strings denote other tokens:: The following strings denote other tokens:
` ( ) { } [ ] , ; [. .] {. .} (. .) [: ` ( ) { } [ ] , ; [. .] {. .} (. .) [:
@ -1207,9 +1207,11 @@ The boolean type is named `bool`:idx: in Nim and can be one of the two
pre-defined values `true` and `false`. Conditions in `while`, pre-defined values `true` and `false`. Conditions in `while`,
`if`, `elif`, `when`-statements need to be of type `bool`. `if`, `elif`, `when`-statements need to be of type `bool`.
This condition holds:: This condition holds:
```nim
ord(false) == 0 and ord(true) == 1 ord(false) == 0 and ord(true) == 1
```
The operators `not, and, or, xor, <, <=, >, >=, !=, ==` are defined The operators `not, and, or, xor, <, <=, >, >=, !=, ==` are defined
for the bool type. The `and` and `or` operators perform short-cut for the bool type. The `and` and `or` operators perform short-cut
@ -1248,8 +1250,9 @@ specified. The values are ordered. Example:
``` ```
Now the following holds:: Now the following holds:
```nim
ord(north) == 0 ord(north) == 0
ord(east) == 1 ord(east) == 1
ord(south) == 2 ord(south) == 2
@ -1257,6 +1260,7 @@ Now the following holds::
# Also allowed: # Also allowed:
ord(Direction.west) == 3 ord(Direction.west) == 3
```
The implied order is: north < east < south < west. The comparison operators can be used The implied order is: north < east < south < west. The comparison operators can be used
with enumeration types. Instead of `north` etc., the enum value can also with enumeration types. Instead of `north` etc., the enum value can also
@ -2568,8 +2572,9 @@ literal match and that is better than a generic match etc. In the following,
for the routine `p`. for the routine `p`.
A routine `p` matches better than a routine `q` if the following A routine `p` matches better than a routine `q` if the following
algorithm returns true:: algorithm returns true:
```nim
for each matching category m in ["exact match", "literal match", for each matching category m in ["exact match", "literal match",
"generic match", "subtype match", "generic match", "subtype match",
"integral match", "conversion match"]: "integral match", "conversion match"]:
@ -2579,6 +2584,7 @@ algorithm returns true::
else: else:
return false return false
return "ambiguous" return "ambiguous"
```
Some examples: Some examples:
@ -4061,7 +4067,7 @@ Nonoverloadable builtins
------------------------ ------------------------
The following built-in procs cannot be overloaded for reasons of implementation The following built-in procs cannot be overloaded for reasons of implementation
simplicity (they require specialized semantic checking):: simplicity (they require specialized semantic checking):
declared, defined, definedInScope, compiles, sizeof, declared, defined, definedInScope, compiles, sizeof,
is, shallowCopy, getAst, astToStr, spawn, procCall is, shallowCopy, getAst, astToStr, spawn, procCall
@ -4071,7 +4077,7 @@ keyword however, a redefinition may `shadow`:idx: the definition in
the [system](system.html) module. the [system](system.html) module.
From this list the following should not be written in dot From this list the following should not be written in dot
notation `x.f` since `x` cannot be type-checked before it gets passed notation `x.f` since `x` cannot be type-checked before it gets passed
to `f`:: to `f`:
declared, defined, definedInScope, compiles, getAst, astToStr declared, defined, definedInScope, compiles, getAst, astToStr
@ -8291,7 +8297,7 @@ The `dynlib` import mechanism supports a versioning scheme:
importc, dynlib: "libtcl(|8.5|8.4|8.3).so.(1|0)".} importc, dynlib: "libtcl(|8.5|8.4|8.3).so.(1|0)".}
``` ```
At runtime, the dynamic library is searched for (in this order):: At runtime, the dynamic library is searched for (in this order):
libtcl.so.1 libtcl.so.1
libtcl.so.0 libtcl.so.0

View file

@ -790,7 +790,7 @@ be part of a single graph.
Assignments like `a = b` "connect" two variables, both variables end up in the Assignments like `a = b` "connect" two variables, both variables end up in the
same graph `{a, b} = G(a) = G(b)`. Unfortunately, the pattern to look for is same graph `{a, b} = G(a) = G(b)`. Unfortunately, the pattern to look for is
much more complex than that and can involve multiple assignment targets much more complex than that and can involve multiple assignment targets
and sources:: and sources:
f(x, y) = g(a, b) f(x, y) = g(a, b)
@ -1586,7 +1586,7 @@ all the arguments, but also the matched operators in reverse polish notation:
``` ```
This passes the expression `x + y * z - x` to the `optM` macro as This passes the expression `x + y * z - x` to the `optM` macro as
an `nnkArgList` node containing:: an `nnkArgList` node containing:
Arglist Arglist
Sym "x" Sym "x"

View file

@ -22,7 +22,8 @@ Usage (to convert Markdown into HTML):
nim md2html markdown_rst.md nim md2html markdown_rst.md
``` ```
Output:: Output:
You're reading it! You're reading it!
The `md2tex`:option: command is invoked identically to `md2html`:option:, The `md2tex`:option: command is invoked identically to `md2html`:option:,
@ -132,7 +133,7 @@ Additional Nim-specific features
* ``:idx:`` role for \`interpreted text\` to include the link to this * ``:idx:`` role for \`interpreted text\` to include the link to this
text into an index (example: [Nim index]). text into an index (example: [Nim index]).
* double slash `//` in option lists serves as a prefix for any option that * double slash `//` in option lists serves as a prefix for any option that
starts from a word (without any leading symbols like `-`, `--`, `/`):: starts from a word (without any leading symbols like `-`, `--`, `/`):
//compile compile the project //compile compile the project
//doc generate documentation //doc generate documentation
@ -152,7 +153,7 @@ Optional additional features, by default turned on:
* Markdown tables * Markdown tables
* Markdown code blocks. For them the same additional arguments as for RST * Markdown code blocks. For them the same additional arguments as for RST
code blocks can be provided (e.g. `test` or `number-lines`) but with code blocks can be provided (e.g. `test` or `number-lines`) but with
a one-line syntax like this:: a one-line syntax like this:
```nim test number-lines=10 ```nim test number-lines=10
echo "ok" echo "ok"
@ -189,7 +190,7 @@ This parser has 2 modes for inline markup:
does escape so that we can always input a single backtick ` in does escape so that we can always input a single backtick ` in
inline code. However that makes impossible to input code with inline code. However that makes impossible to input code with
``\`` at the end in *single* backticks, one must use *double* ``\`` at the end in *single* backticks, one must use *double*
backticks:: backticks:
`\` -- WRONG `\` -- WRONG
``\`` -- GOOD ``\`` -- GOOD
@ -204,8 +205,6 @@ This parser has 2 modes for inline markup:
- interpretation of Markdown block quotes is also slightly different, - interpretation of Markdown block quotes is also slightly different,
e.g. case e.g. case
::
>>> foo >>> foo
> bar > bar
>>baz >>baz

View file

@ -241,7 +241,7 @@ found an ambiguity error is produced.
However before the PATH is used the current directory is checked for the However before the PATH is used the current directory is checked for the
file's existence. So if PATH contains ``$lib`` and ``$lib/bar`` and the file's existence. So if PATH contains ``$lib`` and ``$lib/bar`` and the
directory structure looks like this:: directory structure looks like this:
$lib/x.nim $lib/x.nim
$lib/bar/x.nim $lib/bar/x.nim
@ -319,7 +319,7 @@ Another way is to make Nim invoke a cross compiler toolchain:
For cross compilation, the compiler invokes a C compiler named For cross compilation, the compiler invokes a C compiler named
like `$cpu.$os.$cc` (for example arm.linux.gcc) and the configuration like `$cpu.$os.$cc` (for example arm.linux.gcc) and the configuration
system is used to provide meaningful defaults. For example for `ARM` your system is used to provide meaningful defaults. For example for `ARM` your
configuration file should contain something like:: configuration file should contain something like:
arm.linux.gcc.path = "/usr/bin" arm.linux.gcc.path = "/usr/bin"
arm.linux.gcc.exe = "arm-linux-gcc" arm.linux.gcc.exe = "arm-linux-gcc"
@ -435,7 +435,7 @@ and `passL`:option: command line switches to something like:
--passL="-specs=$DEVKITPRO/libnx/switch.specs -L$DEVKITPRO/libnx/lib -lnx" --passL="-specs=$DEVKITPRO/libnx/switch.specs -L$DEVKITPRO/libnx/lib -lnx"
``` ```
or setup a ``nim.cfg`` file like so:: or setup a ``nim.cfg`` file like so:
#nim.cfg #nim.cfg
--mm:orc --mm:orc

View file

@ -28,21 +28,28 @@ system by this day and age, your project is already in big trouble.
Installation Installation
------------ ------------
Nimfix is part of the compiler distribution. Compile via:: Nimfix is part of the compiler distribution. Compile via:
```cmd
nim c compiler/nimfix/nimfix.nim nim c compiler/nimfix/nimfix.nim
mv compiler/nimfix/nimfix bin mv compiler/nimfix/nimfix bin
```
Or on windows:: Or on windows:
```cmd
nim c compiler\nimfix\nimfix.nim nim c compiler\nimfix\nimfix.nim
move compiler\nimfix\nimfix.exe bin move compiler\nimfix\nimfix.exe bin
```
Usage Usage
----- -----
Usage: Usage:
```cmd
nimfix [options] projectfile.nim nimfix [options] projectfile.nim
```
Options: Options:

View file

@ -1,11 +1,16 @@
Usage: Usage:
* To search:: * To search:
nimgrep [options] PATTERN [(FILE/DIRECTORY)*/-] nimgrep [options] PATTERN [(FILE/DIRECTORY)*/-]
* To replace::
* To replace:
nimgrep [options] PATTERN --replace REPLACEMENT (FILE/DIRECTORY)*/- nimgrep [options] PATTERN --replace REPLACEMENT (FILE/DIRECTORY)*/-
* To list file names::
* To list file names:
nimgrep [options] --filenames [PATTERN] [(FILE/DIRECTORY)*] nimgrep [options] --filenames [PATTERN] [(FILE/DIRECTORY)*]
Positional arguments, from left to right: Positional arguments, from left to right:
@ -42,7 +47,8 @@ Options:
to abort any time without touching the file to abort any time without touching the file
--filenames just list filenames. Provide a PATTERN to find it in --filenames just list filenames. Provide a PATTERN to find it in
the filenames (not in the contents of a file) or run the filenames (not in the contents of a file) or run
with empty pattern to just list all files:: with empty pattern to just list all files:
nimgrep --filenames # In current dir nimgrep --filenames # In current dir
nimgrep --filenames "" DIRECTORY nimgrep --filenames "" DIRECTORY
# Note empty pattern "", lists all files in DIRECTORY # Note empty pattern "", lists all files in DIRECTORY

View file

@ -72,7 +72,7 @@ Key description
Many sections support the `files` key. Listed filenames Many sections support the `files` key. Listed filenames
can be separated by semicolon or the `files` key can be repeated. Wildcards can be separated by semicolon or the `files` key can be repeated. Wildcards
in filenames are supported. If it is a directory name, all files in the in filenames are supported. If it is a directory name, all files in the
directory are used:: directory are used:
[Config] [Config]
Files: "configDir" Files: "configDir"

View file

@ -131,7 +131,7 @@ notation meaning
Supported PEG grammar Supported PEG grammar
--------------------- ---------------------
The PEG parser implements this grammar (written in PEG syntax):: The PEG parser implements this grammar (written in PEG syntax):
# Example grammar of PEG in PEG syntax. # Example grammar of PEG in PEG syntax.
# Comments start with '#'. # Comments start with '#'.

View file

@ -56,7 +56,7 @@ backslashes are interpreted by the regular expression engine:
A regular expression is a pattern that is matched against a subject string A regular expression is a pattern that is matched against a subject string
from left to right. Most characters stand for themselves in a pattern, and from left to right. Most characters stand for themselves in a pattern, and
match the corresponding characters in the subject. As a trivial example, match the corresponding characters in the subject. As a trivial example,
the pattern:: the pattern:
The quick brown fox The quick brown fox
@ -130,7 +130,7 @@ in patterns in a visible manner. There is no restriction on the appearance of
non-printing characters, apart from the binary zero that terminates a pattern, non-printing characters, apart from the binary zero that terminates a pattern,
but when a pattern is being prepared by text editing, it is usually easier to but when a pattern is being prepared by text editing, it is usually easier to
use one of the following escape sequences than the binary character it use one of the following escape sequences than the binary character it
represents:: represents:
============== ============================================================ ============== ============================================================
character meaning character meaning
@ -246,7 +246,7 @@ The fourth use of backslash is for certain `simple assertions`:idx:. An
assertion specifies a condition that has to be met at a particular point in assertion specifies a condition that has to be met at a particular point in
a match, without consuming any characters from the subject string. The use of a match, without consuming any characters from the subject string. The use of
subpatterns for more complicated assertions is described below. The subpatterns for more complicated assertions is described below. The
backslashed assertions are:: backslashed assertions are:
============== ============================================================ ============== ============================================================
assertion meaning assertion meaning

View file

@ -1,6 +1,6 @@
.. ..
Usage of this file: Usage of this file:
Add this in the beginning of *.rst file:: Add this in the beginning of *.rst file:
.. default-role:: code .. default-role:: code
.. include:: rstcommon.rst .. include:: rstcommon.rst

View file

@ -45,24 +45,28 @@ We start the tour with a modified "hello world" program:
``` ```
Save this code to the file "greetings.nim". Now compile and run it:: Save this code to the file "greetings.nim". Now compile and run it:
```cmd
nim compile --run greetings.nim nim compile --run greetings.nim
```
With the ``--run`` [switch](nimc.html#compiler-usage-commandminusline-switches) Nim With the ``--run`` [switch](nimc.html#compiler-usage-commandminusline-switches) Nim
executes the file automatically after compilation. You can give your program executes the file automatically after compilation. You can give your program
command-line arguments by appending them after the filename:: command-line arguments by appending them after the filename:
```cmd
nim compile --run greetings.nim arg1 arg2 nim compile --run greetings.nim arg1 arg2
```
Commonly used commands and switches have abbreviations, so you can also use:: Commonly used commands and switches have abbreviations, so you can also use:
```cmd
nim c -r greetings.nim nim c -r greetings.nim
```
This is a **debug version**. This is a **debug version**.
To compile a release version use:: To compile a release version use:
```cmd
nim c -d:release greetings.nim nim c -d:release greetings.nim
```
By default, the Nim compiler generates a large number of runtime checks By default, the Nim compiler generates a large number of runtime checks
aiming for your debugging pleasure. With ``-d:release`` some checks are aiming for your debugging pleasure. With ``-d:release`` some checks are

View file

@ -75,7 +75,7 @@ proc toLangSymbol*(linkText: PRstNode): LangSymbol =
## Parses `linkText` into a more structured form using a state machine. ## Parses `linkText` into a more structured form using a state machine.
## ##
## This proc is designed to allow link syntax with operators even ## This proc is designed to allow link syntax with operators even
## without escaped backticks inside:: ## without escaped backticks inside:
## ##
## `proc *`_ ## `proc *`_
## `proc []`_ ## `proc []`_

View file

@ -2172,7 +2172,7 @@ proc whichSection(p: RstParser): RstNodeKind =
# for punctuation sequences that can be both tkAdornment and tkPunct # for punctuation sequences that can be both tkAdornment and tkPunct
if isMarkdownCodeBlock(p): if isMarkdownCodeBlock(p):
return rnCodeBlock return rnCodeBlock
elif currentTok(p).symbol == "::": elif isRst(p) and currentTok(p).symbol == "::":
return rnLiteralBlock return rnLiteralBlock
elif currentTok(p).symbol == ".." and elif currentTok(p).symbol == ".." and
nextTok(p).kind in {tkWhite, tkIndent}: nextTok(p).kind in {tkWhite, tkIndent}:
@ -2362,8 +2362,10 @@ proc parseParagraph(p: var RstParser, result: PRstNode) =
of tkIndent: of tkIndent:
if nextTok(p).kind == tkIndent: if nextTok(p).kind == tkIndent:
inc p.idx inc p.idx
break break # blank line breaks paragraph for both Md & Rst
elif currentTok(p).ival == currInd(p): elif currentTok(p).ival == currInd(p) or (
isMd(p) and currentTok(p).ival > currInd(p)):
# (Md allows adding additional indentation inside paragraphs)
inc p.idx inc p.idx
case whichSection(p) case whichSection(p)
of rnParagraph, rnLeaf, rnHeadline, rnMarkdownHeadline, of rnParagraph, rnLeaf, rnHeadline, rnMarkdownHeadline,
@ -2377,7 +2379,8 @@ proc parseParagraph(p: var RstParser, result: PRstNode) =
else: else:
break break
of tkPunct: of tkPunct:
if (let literalBlockKind = whichRstLiteralBlock(p); if isRst(p) and (
let literalBlockKind = whichRstLiteralBlock(p);
literalBlockKind != lbNone): literalBlockKind != lbNone):
result.add newLeaf(":") result.add newLeaf(":")
inc p.idx # skip '::' inc p.idx # skip '::'
@ -2932,8 +2935,8 @@ proc parseSection(p: var RstParser, result: PRstNode) =
elif currentTok(p).ival > currInd(p): elif currentTok(p).ival > currInd(p):
if roPreferMarkdown in p.s.options: # Markdown => normal paragraphs if roPreferMarkdown in p.s.options: # Markdown => normal paragraphs
if currentTok(p).ival - currInd(p) >= 4: if currentTok(p).ival - currInd(p) >= 4:
rstMessage(p, mwRstStyle, result.add parseLiteralBlock(p)
"Markdown indented code not implemented") else:
pushInd(p, currentTok(p).ival) pushInd(p, currentTok(p).ival)
parseSection(p, result) parseSection(p, result)
popInd(p) popInd(p)

View file

@ -377,7 +377,7 @@ proc renderRstToJsonNode(node: PRstNode): JsonNode =
proc renderRstToJson*(node: PRstNode): string = proc renderRstToJson*(node: PRstNode): string =
## Writes the given RST node as JSON that is in the form ## Writes the given RST node as JSON that is in the form
## :: ##
## { ## {
## "kind":string node.kind, ## "kind":string node.kind,
## "text":optional string node.text, ## "text":optional string node.text,

View file

@ -57,9 +57,10 @@ proc memoryLock*(a1: pointer, a2: int) =
proc memoryLockAll*(flags: int) = proc memoryLockAll*(flags: int) =
## Locks all memory for the running process to prevent swapping. ## Locks all memory for the running process to prevent swapping.
## ##
## example:: ## example:
## ## ```nim
## memoryLockAll(MCL_CURRENT or MCL_FUTURE) ## memoryLockAll(MCL_CURRENT or MCL_FUTURE)
## ```
if mlockall(flags.cint) != 0: if mlockall(flags.cint) != 0:
raise newException(OSError, $strerror(errno)) raise newException(OSError, $strerror(errno))

View file

@ -9,7 +9,7 @@
## This module implements the basics for Linux distribution ("distro") ## This module implements the basics for Linux distribution ("distro")
## detection and the OS's native package manager. Its primary purpose is to ## detection and the OS's native package manager. Its primary purpose is to
## produce output for Nimble packages, like:: ## produce output for Nimble packages, like:
## ##
## To complete the installation, run: ## To complete the installation, run:
## ##

View file

@ -34,7 +34,7 @@
## var nim = "Nim" ## var nim = "Nim"
## echo h1(a(href="https://nim-lang.org", nim)) ## echo h1(a(href="https://nim-lang.org", nim))
## ##
## Writes the string:: ## Writes the string:
## ##
## <h1><a href="https://nim-lang.org">Nim</a></h1> ## <h1><a href="https://nim-lang.org">Nim</a></h1>
## ##

View file

@ -2294,7 +2294,8 @@ iterator walkDir*(dir: string; relative = false, checkDir = false):
## ##
## **Example:** ## **Example:**
## ##
## This directory structure:: ## This directory structure:
##
## dirA / dirB / fileB1.txt ## dirA / dirB / fileB1.txt
## / dirC ## / dirC
## / fileA1.txt ## / fileA1.txt

View file

@ -2058,7 +2058,7 @@ func parsePeg*(pattern: string, filename = "pattern", line = 1, col = 0): Peg =
func peg*(pattern: string): Peg = func peg*(pattern: string): Peg =
## constructs a Peg object from the `pattern`. The short name has been ## constructs a Peg object from the `pattern`. The short name has been
## chosen to encourage its use as a raw string modifier:: ## chosen to encourage its use as a raw string modifier:
## ##
## peg"{\ident} \s* '=' \s* {.*}" ## peg"{\ident} \s* '=' \s* {.*}"
result = parsePeg(pattern, "pattern") result = parsePeg(pattern, "pattern")

View file

@ -171,7 +171,7 @@ For strings and numeric types the optional argument is a so-called
# Standard format specifiers for strings, integers and floats # Standard format specifiers for strings, integers and floats
The general form of a standard format specifier is:: The general form of a standard format specifier is:
[[fill]align][sign][#][0][minimumwidth][.precision][type] [[fill]align][sign][#][0][minimumwidth][.precision][type]
@ -423,7 +423,7 @@ proc formatInt(n: SomeNumber; radix: int; spec: StandardFormatSpecifier): string
proc parseStandardFormatSpecifier*(s: string; start = 0; proc parseStandardFormatSpecifier*(s: string; start = 0;
ignoreUnknownSuffix = false): StandardFormatSpecifier = ignoreUnknownSuffix = false): StandardFormatSpecifier =
## An exported helper proc that parses the "standard format specifiers", ## An exported helper proc that parses the "standard format specifiers",
## as specified by the grammar:: ## as specified by the grammar:
## ##
## [[fill]align][sign][#][0][minimumwidth][.precision][type] ## [[fill]align][sign][#][0][minimumwidth][.precision][type]
## ##

View file

@ -778,7 +778,7 @@ macro `<>`*(x: untyped): untyped =
## .. code-block:: nim ## .. code-block:: nim
## <>a(href="http://nim-lang.org", newText("Nim rules.")) ## <>a(href="http://nim-lang.org", newText("Nim rules."))
## ##
## Produces an XML tree for:: ## Produces an XML tree for:
## ##
## <a href="http://nim-lang.org">Nim rules.</a> ## <a href="http://nim-lang.org">Nim rules.</a>
## ##

View file

@ -91,7 +91,8 @@
## Sample output ## Sample output
## ------------- ## -------------
## The program should output something similar to this, but keep in mind that ## The program should output something similar to this, but keep in mind that
## exact results may vary in the real world:: ## exact results may vary in the real world:
##
## Hello World! ## Hello World!
## Pretend I'm doing useful work... ## Pretend I'm doing useful work...
## Pretend I'm doing useful work... ## Pretend I'm doing useful work...

View file

@ -7,6 +7,8 @@ discard """
[Suite] RST indentation [Suite] RST indentation
[Suite] Markdown indentation
[Suite] Warnings [Suite] Warnings
[Suite] RST include directive [Suite] RST include directive
@ -124,12 +126,12 @@ suite "RST parsing":
check(dedent""" check(dedent"""
Paragraph:: Paragraph::
>x""".toAst == expected) >x""".toAst(rstOptions = preferRst) == expected)
check(dedent""" check(dedent"""
Paragraph:: Paragraph::
>x""".toAst == expected) >x""".toAst(rstOptions = preferRst) == expected)
test "RST quoted literal blocks, :: at a separate line": test "RST quoted literal blocks, :: at a separate line":
let expected = let expected =
@ -148,7 +150,7 @@ suite "RST parsing":
:: ::
>x >x
>>y""".toAst == expected) >>y""".toAst(rstOptions = preferRst) == expected)
check(dedent""" check(dedent"""
Paragraph Paragraph
@ -156,7 +158,7 @@ suite "RST parsing":
:: ::
>x >x
>>y""".toAst == expected) >>y""".toAst(rstOptions = preferRst) == expected)
test "Markdown quoted blocks": test "Markdown quoted blocks":
check(dedent""" check(dedent"""
@ -779,7 +781,7 @@ suite "RST parsing":
code code
""".toAst == """.toAst(rstOptions = preferRst) ==
dedent""" dedent"""
rnInner rnInner
rnLeaf 'Check' rnLeaf 'Check'
@ -788,6 +790,32 @@ suite "RST parsing":
rnLeaf 'code' rnLeaf 'code'
""") """)
test "Markdown indented code blocks":
check(dedent"""
See
some code""".toAst ==
dedent"""
rnInner
rnInner
rnLeaf 'See'
rnLiteralBlock
rnLeaf 'some code'
""")
# not a code block -- no blank line before:
check(dedent"""
See
some code""".toAst ==
dedent"""
rnInner
rnLeaf 'See'
rnLeaf ' '
rnLeaf 'some'
rnLeaf ' '
rnLeaf 'code'
""")
suite "RST tables": suite "RST tables":
test "formatting in tables works": test "formatting in tables works":
@ -1238,6 +1266,31 @@ suite "RST indentation":
rnLeaf 'term3definition2' rnLeaf 'term3definition2'
""") """)
suite "Markdown indentation":
test "Markdown paragraph indentation":
# Additional spaces (<=3) of indentation does not break the paragraph.
# TODO: in 2nd case de-indentation causes paragraph to break, this is
# reasonable but does not seem to conform the Markdown spec.
check(dedent"""
Start1
stop1
Start2
stop2
""".toAst ==
dedent"""
rnInner
rnParagraph
rnLeaf 'Start1'
rnLeaf ' '
rnLeaf 'stop1'
rnParagraph
rnLeaf 'Start2'
rnParagraph
rnLeaf 'stop2'
rnLeaf ' '
""")
suite "Warnings": suite "Warnings":
test "warnings for broken footnotes/links/substitutions": test "warnings for broken footnotes/links/substitutions":
let input = dedent""" let input = dedent"""

View file

@ -632,7 +632,7 @@ Test literal block
:: ::
check """ check """
let output1 = input1.toHtml let output1 = input1.toHtml(preferRst)
doAssert "<pre>" in output1 doAssert "<pre>" in output1
test "Markdown code block": test "Markdown code block":