Files
Nim/nimdoc/testproject/subdir/subdir_b/utils.nim
Andrey Makarov cde6b2aab8 Implement Pandoc Markdown concise link extension (#20304)
* Implement Pandoc Markdown concise link extension

This implements https://github.com/nim-lang/Nim/issues/20127.
Besides reference to headings we also support doing references
to Nim symbols inside Nim modules.

Markdown:
```
Some heading
------------

Ref. [Some heading].
```

Nim:
```
proc someFunction*() ...

... ## Ref. [someFunction]
```

This is substitution for RST syntax like `` `target`_ ``.
All 3 syntax variants of extension from Pandoc Markdown are supported:
`[target]`, `[target][]`, `[description][target]`.

This PR also fixes clashes in existing files, particularly
conflicts with RST footnote feature, which does not work with
this PR (but there is a plan to adopt a popular [Markdown footnote
extension](https://pandoc.org/MANUAL.html#footnotes) to make footnotes work).

Also the PR fixes a bug that Markdown links did not work when `[...]`
section had a line break.

The implementation is straightforward since link resolution did not
change w.r.t. RST implementation, it's almost only about new syntax
addition. The only essential difference is a possibility to add a custom
link description: form `[description][target]` which does not have an
RST equivalent.

* fix nim 1.0 gotcha
2022-09-04 14:52:21 -04:00

214 lines
4.9 KiB
Nim

##[
.. include:: ./utils_overview.rst
# This is now a header
## Next header
### And so on
# More headers
###### Up to level 6
#. An enumeration
#. Second idea here.
More text.
1. Other case value
2. Second case.
Ref group fn2_ or specific function like `fn2()`_
or `fn2( int )`_ or `fn2(int,
float)`_.
Ref generics like this: binarySearch_ or `binarySearch(openArray[T], K,
proc (T, K))`_ or `proc binarySearch(openArray[T], K, proc (T, K))`_ or
in different style: `proc binarysearch(openarray[T], K, proc(T, K))`_.
Can be combined with export symbols and type parameters:
`binarysearch*[T, K](openArray[T], K, proc (T, K))`_.
With spaces `binary search`_.
Note that `proc` can be used in postfix form: `binarySearch proc`_.
Ref. type like G_ and `type G`_ and `G[T]`_ and `type G*[T]`_.
Group ref. with capital letters works: fN11_ or fn11_
]##
include ./utils_helpers
type
SomeType* = enum
enumValueA,
enumValueB,
enumValueC
G*[T] = object
val: T
proc someType*(): SomeType =
## constructor.
SomeType(2)
proc fn2*() = discard ## comment
proc fn2*(x: int) =
## fn2 comment
discard
proc fn2*(x: int, y: float) =
discard
proc binarySearch*[T, K](a: openArray[T]; key: K;
cmp: proc (x: T; y: K): int {.closure.}): int =
discard
proc fn3*(): auto = 1 ## comment
proc fn4*(): auto = 2 * 3 + 4 ## comment
proc fn5*() ## comment
proc fn5*() = discard
proc fn6*() =
## comment
proc fn7*() =
## comment
discard
proc fn8*(): auto =
## comment
1+1
func fn9*(a: int): int = 42 ## comment
func fn10*(a: int): int = a ## comment
# Note capital letter N will be handled correctly in
# group references like fN11_ or fn11_
# (or [fN11] or [fn11] in Markdown Syntax):
func fN11*() = discard
func fN11*(x: int) = discard
# bug #9235
template aEnum*(): untyped =
type
A* {.inject.} = enum ## The enum A.
aA
template bEnum*(): untyped =
type
B* {.inject.} = enum ## The enum B.
bB
func someFunc*() =
## My someFunc.
## Stuff in `quotes` here.
## [Some link](https://nim-lang.org)
discard
template fromUtilsGen*(): untyped =
## should be shown in utils.html only
runnableExamples:
discard "should be in utils.html only, not in module that calls fromUtilsGen"
## ditto
iterator fromUtils1*(): int =
runnableExamples:
# ok1
assert 1 == 1
# ok2
yield 15
template fromUtils2*() =
## ok3
runnableExamples:
discard """should be shown as examples for fromUtils2
in module calling fromUtilsGen"""
proc fromUtils3*() =
## came form utils but should be shown where `fromUtilsGen` is called
runnableExamples: discard """should be shown as examples for fromUtils3
in module calling fromUtilsGen"""
proc f*(x: G[int]) =
## There is also variant `f(G[string])`_
discard
proc f*(x: G[string]) =
## See also `f(G[int])`_.
discard
## Ref. `[]`_ is the same as `proc \`[]\`(G[T])`_ because there are no
## overloads. The full form: `proc \`[]\`*[T](x: G[T]): T`_
proc `[]`*[T](x: G[T]): T = x.val
## Ref. `[]=`_ aka `\`[]=\`(G[T], int, T)`_.
proc `[]=`*[T](a: var G[T], index: int, value: T) = discard
## Ref. `$`_ aka `proc $`_ or `proc \`$\``_.
proc `$`*[T](a: G[T]): string = ""
## Ref. `$(a: ref SomeType)`_.
proc `$`*[T](a: ref SomeType): string = ""
## Ref. foo_bar_ aka `iterator foo_bar_`_.
iterator fooBar*(a: seq[SomeType]): int = discard
## Ref. `fn[T; U,V: SomeFloat]()`_.
proc fn*[T; U, V: SomeFloat]() = discard
## Ref. `'big`_ or `func \`'big\``_ or `\`'big\`(string)`_.
func `'big`*(a: string): SomeType = discard
##[
Pandoc Markdown
===============
Now repeat all the auto links of above in Pandoc Markdown Syntax.
Ref group [fn2] or specific function like [fn2()]
or [fn2( int )] or [fn2(int,
float)].
Ref generics like this: [binarySearch] or [binarySearch(openArray[T], K,
proc (T, K))] or [proc binarySearch(openArray[T], K, proc (T, K))] or
in different style: [proc binarysearch(openarray[T], K, proc(T, K))].
Can be combined with export symbols and type parameters:
[binarysearch*[T, K](openArray[T], K, proc (T, K))].
With spaces [binary search].
Note that `proc` can be used in postfix form: [binarySearch proc].
Ref. type like [G] and [type G] and [G[T]] and [type G*[T]].
Group ref. with capital letters works: [fN11] or [fn11]
Ref. [`[]`] is the same as [proc `[]`(G[T])] because there are no
overloads. The full form: [proc `[]`*[T](x: G[T]): T]
Ref. [`[]=`] aka [`[]=`(G[T], int, T)].
Ref. [$] aka [proc $] or [proc `$`].
Ref. [$(a: ref SomeType)].
Ref. [foo_bar] aka [iterator foo_bar_].
Ref. [fn[T; U,V: SomeFloat]()].
Ref. ['big] or [func `'big`] or [`'big`(string)].
Link name syntax
----------------
Pandoc Markdown has synax for changing text of links:
Ref. [this proc][`[]`] or [another symbol][G[T]].
Symbols documentation
---------------------
Let us repeat auto links from symbols section below:
There is also variant [f(G[string])].
See also [f(G[int])].
]##