Browse Source

Add mdfmt, a Markdown formatting helper

Also a first POSIX-oriented library!
Alois Mahdal 7 years ago
parent
commit
0963d94414
44 changed files with 882 additions and 0 deletions
  1. 1
    0
      mkit.ini
  2. 17
    0
      packaging/debian/control
  3. 1
    0
      packaging/debian/shellfu-sh-mdfmt.install
  4. 10
    0
      packaging/template.spec
  5. 231
    0
      src/include-sh/mdfmt.sh
  6. 212
    0
      tests/mdfmt/TF_RUN
  7. 4
    0
      tests/mdfmt/oracle/args_h1.stdout
  8. 4
    0
      tests/mdfmt/oracle/args_h2.stdout
  9. 3
    0
      tests/mdfmt/oracle/args_h3.stdout
  10. 8
    0
      tests/mdfmt/oracle/args_ol.stdout
  11. 8
    0
      tests/mdfmt/oracle/args_p.stdout
  12. 7
    0
      tests/mdfmt/oracle/args_pre.stdout
  13. 8
    0
      tests/mdfmt/oracle/args_ul.stdout
  14. 4
    0
      tests/mdfmt/oracle/blockquoted_h1.stdout
  15. 4
    0
      tests/mdfmt/oracle/blockquoted_h2.stdout
  16. 3
    0
      tests/mdfmt/oracle/blockquoted_h3.stdout
  17. 8
    0
      tests/mdfmt/oracle/blockquoted_ol.stdout
  18. 8
    0
      tests/mdfmt/oracle/blockquoted_p.stdout
  19. 7
    0
      tests/mdfmt/oracle/blockquoted_pre.stdout
  20. 8
    0
      tests/mdfmt/oracle/blockquoted_ul.stdout
  21. 83
    0
      tests/mdfmt/oracle/doc_egg.stdout
  22. 16
    0
      tests/mdfmt/oracle/nest_ol_ol.stdout
  23. 16
    0
      tests/mdfmt/oracle/nest_ol_p.stdout
  24. 15
    0
      tests/mdfmt/oracle/nest_ol_pre.stdout
  25. 16
    0
      tests/mdfmt/oracle/nest_ol_ul.stdout
  26. 16
    0
      tests/mdfmt/oracle/nest_ul_ol.stdout
  27. 16
    0
      tests/mdfmt/oracle/nest_ul_p.stdout
  28. 15
    0
      tests/mdfmt/oracle/nest_ul_pre.stdout
  29. 16
    0
      tests/mdfmt/oracle/nest_ul_ul.stdout
  30. 8
    0
      tests/mdfmt/oracle/pair_h1_h2.stdout
  31. 12
    0
      tests/mdfmt/oracle/pair_h1_p.stdout
  32. 16
    0
      tests/mdfmt/oracle/pair_p_ol.stdout
  33. 15
    0
      tests/mdfmt/oracle/pair_p_pre.stdout
  34. 16
    0
      tests/mdfmt/oracle/pair_p_ul.stdout
  35. 4
    0
      tests/mdfmt/oracle/single_h1.stdout
  36. 4
    0
      tests/mdfmt/oracle/single_h2.stdout
  37. 3
    0
      tests/mdfmt/oracle/single_h3.stdout
  38. 8
    0
      tests/mdfmt/oracle/single_ol.stdout
  39. 8
    0
      tests/mdfmt/oracle/single_p.stdout
  40. 7
    0
      tests/mdfmt/oracle/single_pre.stdout
  41. 8
    0
      tests/mdfmt/oracle/single_ul.stdout
  42. 6
    0
      tests/shellfu_api/oracle/functions.stdout
  43. 1
    0
      tests/shellfu_api/oracle/modules.stdout
  44. 1
    0
      tests/shellfu_api/oracle/variables.stdout

+ 1
- 0
mkit.ini View File

@@ -51,4 +51,5 @@
51 51
     etc_bc   = src/complete.bash        shellfu.bash
52 52
     etc_bc   = src/complete-devel.bash  shellfu-devel.bash
53 53
     includes = src/include-bash
54
+    includes = src/include-sh
54 55
     share    = src/shellfu.sh

+ 17
- 0
packaging/debian/control View File

@@ -108,5 +108,22 @@ Description: Bash-specific base
108 108
  This sub-package contains POSIX-oriented parts of library infrastructure.
109 109
  Generic Shellfu modules aiming for POSIX compatibility should depend on this.
110 110
 
111
+Package: shellfu-sh-mdfmt
112
+Architecture: all
113
+Depends: shellfu-sh
114
+Description: Markdown formatting helper
115
+ Shellfu is an attempt to add modularity to your shell scripts.
116
+ .
117
+ With Shellfu you can develop your shell modules separately from your
118
+ scripts, and test, use, explore or study them without need to be aware
119
+ of details such as where the actual files are placed.
120
+ .
121
+ Shellfu is mostly intended for cases when there's need for non-trivial
122
+ amount of reliable body of shell scripts, and access to advanced modular
123
+ languages such as Python or Perl is limited.
124
+ .
125
+ This sub-package contains Markdown formatting helper, a function that
126
+ Helps you generate Markdown paragraph elements from your shell scripts.
127
+
111 128
 
112 129
 # control file built with MKit __MKIT_SELF_VERSION__

+ 1
- 0
packaging/debian/shellfu-sh-mdfmt.install View File

@@ -0,0 +1 @@
1
+/usr/local/share/shellfu/include-sh/mdfmt.sh

+ 10
- 0
packaging/template.spec View File

@@ -60,6 +60,13 @@ Requires: shellfu
60 60
 This sub-package contains POSIX-oriented parts of library infrastructure.
61 61
 Generic Shellfu modules aiming for POSIX compatibility should depend on this.
62 62
 
63
+%package sh-mdfmt
64
+Summary: Markdown formatting helper
65
+Requires: shellfu-sh
66
+%description sh-mdfmt
67
+This sub-package contains Markdown formatting helper, a function that
68
+helps you generate Markdown paragraph elements from your shell scripts.
69
+
63 70
 
64 71
 %prep
65 72
 %setup -q
@@ -107,6 +114,9 @@ make %{?_smp_mflags}
107 114
 %files sh
108 115
 %dir /usr/local/share/shellfu/include-sh
109 116
 
117
+%files sh-mdfmt
118
+/usr/local/share/shellfu/include-sh/mdfmt.sh
119
+
110 120
 %changelog
111 121
 
112 122
 # specfile built with MKit __MKIT_SELF_VERSION__

+ 231
- 0
src/include-sh/mdfmt.sh View File

@@ -0,0 +1,231 @@
1
+#!/usr/bin/sh
2
+
3
+#
4
+# mdfmt - Markdown formatted output from your shell scripts
5
+#
6
+# These functions allow you to easily output a valid Markdown
7
+# from your script.
8
+#
9
+
10
+MDFMT_WIDTH=${MDFMT_WIDTH:-75}
11
+
12
+_mdfmt__fmttype() {
13
+    #
14
+    # Format fragments $@ as type $Elem
15
+    #
16
+    case $Elem in
17
+        h1)
18
+            local hdr
19
+            hdr=$(_mdfmt__join "$@")
20
+            echo
21
+            echo
22
+            echo "$hdr"
23
+            echo "$hdr" | tr -c '\n' =
24
+            ;;
25
+        h2)
26
+            local hdr
27
+            hdr=$(_mdfmt__join "$@")
28
+            echo
29
+            echo
30
+            echo "$hdr"
31
+            echo "$hdr" | tr -c '\n' -
32
+            ;;
33
+        h3)
34
+            local hdr
35
+            hdr=$(_mdfmt__join "$@")
36
+            echo
37
+            echo
38
+            echo "### $hdr ###"
39
+            ;;
40
+        p)
41
+            echo
42
+            _mdfmt__join "$@" \
43
+              | fmt -w "$(_mdfmt__width)"
44
+            ;;
45
+        ul)
46
+            printf '\n *  '
47
+            _mdfmt__join "$@" \
48
+              | fmt -t -w "$(_mdfmt__width)" \
49
+              | sed -e 's/^   /    /'
50
+            ;;
51
+        ol)
52
+            printf '\n 1. '
53
+            _mdfmt__join "$@" \
54
+              | fmt -t -w "$(_mdfmt__width)" \
55
+              | sed -e 's/^   /    /'
56
+            ;;
57
+        pre)
58
+            echo
59
+            _mdfmt__join "$@" \
60
+              | sed -e 's/^/    /'
61
+            ;;
62
+    esac
63
+}
64
+
65
+_mdfmt__indent() {
66
+    #
67
+    # Indent as many spaces as needed
68
+    #
69
+    local pfx
70
+    test "$Nest" -eq 0 && { cat; return; }
71
+    test "$Elem" == h1 && { cat; return; }
72
+    test "$Elem" == h2 && { cat; return; }
73
+    test "$Elem" == h3 && { cat; return; }
74
+    pfx=$(
75
+        for n in $(seq 1 "$Nest");
76
+        do
77
+            printf '    '
78
+        done
79
+    )
80
+    sed "s/^/$pfx/"
81
+}
82
+
83
+_mdfmt__join() {
84
+    #
85
+    # Properly join text fragments $@
86
+    #
87
+    case $Elem in
88
+        pre)  printf '%s\n' "$@" ;;
89
+        h*)   echo "$1"          ;;
90
+        *)    echo "$@"          ;;
91
+    esac
92
+}
93
+
94
+_mdfmt__quote() {
95
+    #
96
+    # Quote if needed
97
+    #
98
+    local pfx
99
+    $Quoted || { cat; return; }
100
+    test "$Elem" == h1 && { cat; return; }
101
+    test "$Elem" == h2 && { cat; return; }
102
+    test "$Elem" == h3 && { cat; return; }
103
+    sed 's/^/> /'
104
+}
105
+
106
+_mdfmt__width() {
107
+    #
108
+    # Calculate width
109
+    #
110
+    echo "$((MDFMT_WIDTH - Nest * 4))"
111
+}
112
+
113
+mdfmt() {
114
+    #
115
+    # Format text as Markdown element $1
116
+    #
117
+    # Usage:
118
+    #     mdfmt [-n|--nest LEVEL] [-q|--quote] ELEM FRAG [FRAG..]
119
+    #
120
+    # Take text passed as one or more FRAGs and output it formatted in
121
+    # Markdown as ELEM.  Passing higher LEVEL than previous item causes
122
+    # items to nest.
123
+    #
124
+    # When multiple FRAGs are provided, the text is simply joined together
125
+    # (and in most cases re-formatted to fit MDFMT_WIDTH).  This allows
126
+    # you to pass long texts and keep your code tidy by breaking the text
127
+    # into several pieces and using line continuation character `\`.
128
+    #
129
+    # Additional character-level formatting is achieved using standard
130
+    # Markdown motation, i.e. asterisk for emphasis, double asterisk
131
+    # for strong emphasis and backtick for verbatim text.
132
+    #
133
+    # Options:
134
+    #
135
+    #   * `-n LEVEL`, `--nest LEVEL`  Causes item to be indented so that
136
+    #     it will be nested into the previous item, if the LEVEL is higher
137
+    #     than the previous one.  Default value is zero.
138
+    #
139
+    #     This can be used to e.g. include unordered items or code examples
140
+    #     inside ordered items, or multiple paragraphs per (un)ordered
141
+    #     item.
142
+    #
143
+    #   * `-q`, `--quote`  Causes item to appear blockquoted.
144
+    #
145
+    # Following values are available for ELEM (names are inspired by
146
+    # HTML elements):
147
+    #
148
+    #  *  `h1`, `h2`, `h3`  - headings of respective weight. Ignores
149
+    #     nesting.   Accepts only single FRAG.
150
+    #
151
+    #  *  `p` - a paragraph.
152
+    #
153
+    #  *  `ul`, `ol` - unordered list item (bullet) or ordered (numbered)
154
+    #     list item.
155
+    #
156
+    #  *  `pre` - pre-formatted code.  Multiple FRAGs are treated as lines
157
+    #     and spaces are preserved.
158
+    #
159
+    # Examples:
160
+    #
161
+    #     mdfmt h1 "how to boil an egg"
162
+    #
163
+    #     mdfmt p  "this tutorial shows you how to boil an egg" \
164
+    #              "the best way possible"
165
+    #
166
+    #     mdfmt h2 "variant 1"
167
+    #
168
+    #     mdfmt ol "take egg"
169
+    #     mdfmt ol "put it in a pot full of water"
170
+    #     mdfmt ol "place pot onto stove"
171
+    #     mdfmt ol "turn on stove"
172
+    #     mdfmt ol "wait"
173
+    #     mdfmt --nest 1 ul "for hard-boiled, wait 10 minutes"
174
+    #     mdfmt --nest 1 ul "for soft-boiled, wait 3 minutes"
175
+    #     mdfmt ol "turn off the stove"
176
+    #     mdfmt ol "replace water with cold water "
177
+    #     mdfmt ol "break and replace shell from the egg"
178
+    #
179
+    #     mdfmt h2 "variant 1"
180
+    #
181
+    #     mdfmt ol "start your favorite browser"
182
+    #     mdfmt ol "open youtube:"
183
+    #     mdfmt --nest 1 pre "https://www.youtube.com/"
184
+    #     mdfmt ol "enter following text in Search box:"
185
+    #     mdfmt --nest 1 pre "how to boil an egg"
186
+    #     mdfmt ol "watch at least 5 videos"
187
+    #     mdfmt ol "go to the closest restaurant and ask for" \
188
+    #               "a boiled egg"
189
+    #
190
+    #     mdfmt h2 "conclusion"
191
+    #
192
+    #     mdfmt p  "We hope you enjoy the egg. Seriously."
193
+    #
194
+    local Nest=0
195
+    local Elem
196
+    local Quoted=false
197
+    local usage="usage: mdfmt [-n|--nest LVL] ELEM FRAG [FRAG..]"
198
+    while true; do case $1 in
199
+        -n|--nest)
200
+            Nest=$2
201
+            shift 2 || {
202
+                echo "$usage" >&2
203
+                return 2
204
+            }
205
+            ;;
206
+        -q|--quote)
207
+            Quoted=true
208
+            shift
209
+            ;;
210
+        -*)
211
+            echo "$usage" >&2
212
+            return 2
213
+            ;;
214
+        *)
215
+            break
216
+            ;;
217
+    esac done
218
+    Elem=$1; shift
219
+    case $Elem in
220
+        h1|h2|h3|p|ol|ul|pre)
221
+            true
222
+            ;;
223
+        *)
224
+            echo "$usage" >&2
225
+            return 2
226
+            ;;
227
+    esac
228
+    _mdfmt__fmttype "$@" \
229
+      | _mdfmt__quote \
230
+      | _mdfmt__indent
231
+}

+ 212
- 0
tests/mdfmt/TF_RUN View File

@@ -0,0 +1,212 @@
1
+#!/bin/bash
2
+
3
+. "$TF_DIR/include/subtest.sh"
4
+. "$TF_DIR/include/tools.sh"
5
+
6
+. "$(shellfu-get path)" || tf_exit_error "failed to init shellfu"
7
+export PRETTY=plain
8
+shellfu import mdfmt    || tf_exit_error "failed to import mdfmt"
9
+
10
+
11
+tf_enum_subtests() {
12
+
13
+    #
14
+    # Whole text as single argument (fragment)
15
+    #
16
+    echo "single_h1"
17
+    echo "single_h2"
18
+    echo "single_h3"
19
+    echo "single_p"
20
+    echo "single_ul"
21
+    echo "single_ol"
22
+    echo "single_pre"
23
+
24
+    #
25
+    # Each line as separate argument (fragment)
26
+    #
27
+    echo "args_h1"
28
+    echo "args_h2"
29
+    echo "args_h3"
30
+    echo "args_p"
31
+    echo "args_ul"
32
+    echo "args_ol"
33
+    echo "args_pre"
34
+
35
+    #
36
+    # Blockquoted elements (single argument)
37
+    #
38
+    echo "blockquoted_h1"
39
+    echo "blockquoted_h2"
40
+    echo "blockquoted_h3"
41
+    echo "blockquoted_p"
42
+    echo "blockquoted_ul"
43
+    echo "blockquoted_ol"
44
+    echo "blockquoted_pre"
45
+
46
+    #
47
+    # Pairs of element types
48
+    #
49
+    echo "pair_h1_h2"
50
+    echo "pair_h1_p"
51
+    echo "pair_p_ol"
52
+    echo "pair_p_ul"
53
+    echo "pair_p_pre"
54
+
55
+    #
56
+    # Nested pairs of element types
57
+    #
58
+    echo "nest_ol_ol"
59
+    echo "nest_ol_ul"
60
+    echo "nest_ol_p"
61
+    echo "nest_ol_pre"
62
+    echo "nest_ul_ol"
63
+    echo "nest_ul_ul"
64
+    echo "nest_ul_p"
65
+    echo "nest_ul_pre"
66
+
67
+    #
68
+    # A more full-fletched example
69
+    #
70
+    echo "doc_egg"
71
+
72
+}
73
+
74
+lipsum() {
75
+    case $elm in
76
+        p|ol|ul)
77
+            echo -n \
78
+                "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed" \
79
+                " do eiusmod tempor incididunt ut labore et dolore magna aliqua." \
80
+                " Ut enim ad minim veniam, quis nostrud exercitation ullamco" \
81
+                " laboris nisi ut aliquip ex ea commodo consequat. Duis aute" \
82
+                " irure dolor in reprehenderit in voluptate velit esse cillum" \
83
+                " dolore eu fugiat nulla pariatur. Excepteur sint occaecat" \
84
+                " cupidatat non proident, sunt in culpa qui officia deserunt" \
85
+                " mollit anim id est laborum."
86
+                ;;
87
+        h*)
88
+            echo "How did I grow my rhino nose"
89
+            ;;
90
+        pre)
91
+            echo 'found = False'
92
+            echo 'for x in sequence:'
93
+            echo '    if pred(x.n):'
94
+            echo '        found = True'
95
+            echo 'if found:'
96
+            echo '    ...'
97
+            ;;
98
+    esac
99
+}
100
+
101
+do_mdfmt() {
102
+    #
103
+    #
104
+    #
105
+    local elm=$1
106
+    local pass=$2
107
+    local nest=$3
108
+    local args=()
109
+    local frags=()
110
+    test -n "$nest" && args=( --nest "$nest" )
111
+    case $name in
112
+        blockquoted_*) args+=( --quote )
113
+    esac
114
+    case $pass in
115
+        line2frag)
116
+            IFS=$'\n' frags=( $(lipsum) )
117
+            ;;
118
+        single)
119
+            frags=("$(lipsum)")
120
+            ;;
121
+    esac
122
+    args+=( "$elm" "${frags[@]}")
123
+    mdfmt "${args[@]}"
124
+}
125
+
126
+
127
+mkresult() {
128
+    local elm elm1 elm2 elms
129
+    case $name in
130
+
131
+        single_*)
132
+            elm=${name#single_}
133
+            do_mdfmt "$elm" single
134
+            ;;
135
+
136
+        args_*)
137
+            elm=${name#args_}
138
+            do_mdfmt "$elm" line2frag
139
+            ;;
140
+
141
+        blockquoted_*)
142
+            elm=${name#blockquoted_}
143
+            do_mdfmt "$elm" single
144
+            ;;
145
+
146
+        pair_*)
147
+            local elms=${name#pair_}
148
+            local elm1=${elms%_*}
149
+            local elm2=${elms#*_}
150
+            do_mdfmt "$elm1" line2frag
151
+            do_mdfmt "$elm2" line2frag
152
+            ;;
153
+
154
+        nest_*)
155
+            local elms=${name#nest_}
156
+            local elm1=${elms%_*}
157
+            local elm2=${elms#*_}
158
+            do_mdfmt "$elm1" line2frag
159
+            do_mdfmt "$elm2" line2frag 1
160
+            ;;
161
+
162
+        doc_egg)
163
+            mdfmt h1 "how to boil an egg"
164
+            mdfmt p  "this tutorial shows you how to boil an egg" \
165
+                     "the best way possible"
166
+            mdfmt h2 "variant 1"
167
+            mdfmt ol "take egg"
168
+            mdfmt ol "put it in a pot full of water"
169
+            mdfmt ol "place pot onto stove"
170
+            mdfmt ol "turn on stove"
171
+            mdfmt ol "wait"
172
+            mdfmt --nest 1 ul "for soft-boiled, wait 3 minutes"
173
+            mdfmt --nest 2 ol "wait first minute"
174
+            mdfmt --nest 2 ol "wait second minute"
175
+            mdfmt --nest 2 ol "wait third minute"
176
+            mdfmt --nest 1 ul "for hard-boiled, wait 10 minutes"
177
+            mdfmt ol "turn off the stove"
178
+            mdfmt ol "replace water with cold water "
179
+            mdfmt ol "break and replace shell from the egg"
180
+            mdfmt h2 "variant 1"
181
+            mdfmt ol "start your favorite browser"
182
+            mdfmt ol "open youtube:"
183
+            mdfmt --nest 1 pre "https://www.youtube.com/"
184
+            mdfmt ol "enter following text in Search box:"
185
+            mdfmt --nest 1 pre "how to boil an egg"
186
+            mdfmt ol "watch at least 5 videos"
187
+            mdfmt ol "go to the closest restaurant and ask for" \
188
+                      "a boiled egg"
189
+            mdfmt h2 "conclusion"
190
+            mdfmt p  "We hope you enjoy the egg. Seriously."
191
+            mdfmt h2 "references"
192
+            mdfmt p "This is what fsumsal said about it:"
193
+            mdfmt -q p "OK.  I feel honored by inclusion in the test."
194
+            mdfmt p "A more thorough review by mr. knowitalmostall:"
195
+            mdfmt -q p "The egg was good, except"
196
+            mdfmt -q ul "the shell could have been softer,"
197
+            mdfmt -q ul "the yolk could have been harder,"
198
+            mdfmt -q ul "the white could have been yellower."
199
+            mdfmt -q p "Overall, I liked it."
200
+            mdfmt p "(It's worth noting that mr. knowitalmostall does not work" \
201
+                    "in the egg review business anymore.)"
202
+            ;;
203
+
204
+    esac
205
+}
206
+
207
+tf_do_subtest() {
208
+    local name=$1
209
+    tf_testflt -n "$name" -O "oracle/$name.stdout" "mkresult"
210
+}
211
+
212
+tf_do_subtests

+ 4
- 0
tests/mdfmt/oracle/args_h1.stdout View File

@@ -0,0 +1,4 @@
1
+
2
+
3
+How did I grow my rhino nose
4
+============================

+ 4
- 0
tests/mdfmt/oracle/args_h2.stdout View File

@@ -0,0 +1,4 @@
1
+
2
+
3
+How did I grow my rhino nose
4
+----------------------------

+ 3
- 0
tests/mdfmt/oracle/args_h3.stdout View File

@@ -0,0 +1,3 @@
1
+
2
+
3
+### How did I grow my rhino nose ###

+ 8
- 0
tests/mdfmt/oracle/args_ol.stdout View File

@@ -0,0 +1,8 @@
1
+
2
+ 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.

+ 8
- 0
tests/mdfmt/oracle/args_p.stdout View File

@@ -0,0 +1,8 @@
1
+
2
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip ex ea
5
+commodo consequat. Duis aute  irure dolor in reprehenderit in voluptate
6
+velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur sint
7
+occaecat  cupidatat non proident, sunt in culpa qui officia deserunt
8
+mollit anim id est laborum.

+ 7
- 0
tests/mdfmt/oracle/args_pre.stdout View File

@@ -0,0 +1,7 @@
1
+
2
+    found = False
3
+    for x in sequence:
4
+        if pred(x.n):
5
+            found = True
6
+    if found:
7
+        ...

+ 8
- 0
tests/mdfmt/oracle/args_ul.stdout View File

@@ -0,0 +1,8 @@
1
+
2
+ *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.

+ 4
- 0
tests/mdfmt/oracle/blockquoted_h1.stdout View File

@@ -0,0 +1,4 @@
1
+
2
+
3
+How did I grow my rhino nose
4
+============================

+ 4
- 0
tests/mdfmt/oracle/blockquoted_h2.stdout View File

@@ -0,0 +1,4 @@
1
+
2
+
3
+How did I grow my rhino nose
4
+----------------------------

+ 3
- 0
tests/mdfmt/oracle/blockquoted_h3.stdout View File

@@ -0,0 +1,3 @@
1
+
2
+
3
+### How did I grow my rhino nose ###

+ 8
- 0
tests/mdfmt/oracle/blockquoted_ol.stdout View File

@@ -0,0 +1,8 @@
1
+> 
2
+>  1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+>     tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+>     veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+>     ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+>     voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+>     sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+>     deserunt  mollit anim id est laborum.

+ 8
- 0
tests/mdfmt/oracle/blockquoted_p.stdout View File

@@ -0,0 +1,8 @@
1
+> 
2
+> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+> tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+> veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip ex ea
5
+> commodo consequat. Duis aute  irure dolor in reprehenderit in voluptate
6
+> velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur sint
7
+> occaecat  cupidatat non proident, sunt in culpa qui officia deserunt
8
+> mollit anim id est laborum.

+ 7
- 0
tests/mdfmt/oracle/blockquoted_pre.stdout View File

@@ -0,0 +1,7 @@
1
+> 
2
+>     found = False
3
+>     for x in sequence:
4
+>         if pred(x.n):
5
+>             found = True
6
+>     if found:
7
+>         ...

+ 8
- 0
tests/mdfmt/oracle/blockquoted_ul.stdout View File

@@ -0,0 +1,8 @@
1
+> 
2
+>  *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+>     tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+>     veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+>     ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+>     voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+>     sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+>     deserunt  mollit anim id est laborum.

+ 83
- 0
tests/mdfmt/oracle/doc_egg.stdout View File

@@ -0,0 +1,83 @@
1
+
2
+
3
+how to boil an egg
4
+==================
5
+
6
+this tutorial shows you how to boil an egg the best way possible
7
+
8
+
9
+variant 1
10
+---------
11
+
12
+ 1. take egg
13
+
14
+ 1. put it in a pot full of water
15
+
16
+ 1. place pot onto stove
17
+
18
+ 1. turn on stove
19
+
20
+ 1. wait
21
+    
22
+     *  for soft-boiled, wait 3 minutes
23
+        
24
+         1. wait first minute
25
+        
26
+         1. wait second minute
27
+        
28
+         1. wait third minute
29
+    
30
+     *  for hard-boiled, wait 10 minutes
31
+
32
+ 1. turn off the stove
33
+
34
+ 1. replace water with cold water
35
+
36
+ 1. break and replace shell from the egg
37
+
38
+
39
+variant 1
40
+---------
41
+
42
+ 1. start your favorite browser
43
+
44
+ 1. open youtube:
45
+    
46
+        https://www.youtube.com/
47
+
48
+ 1. enter following text in Search box:
49
+    
50
+        how to boil an egg
51
+
52
+ 1. watch at least 5 videos
53
+
54
+ 1. go to the closest restaurant and ask for a boiled egg
55
+
56
+
57
+conclusion
58
+----------
59
+
60
+We hope you enjoy the egg. Seriously.
61
+
62
+
63
+references
64
+----------
65
+
66
+This is what fsumsal said about it:
67
+> 
68
+> OK.  I feel honored by inclusion in the test.
69
+
70
+A more thorough review by mr. knowitalmostall:
71
+> 
72
+> The egg was good, except
73
+> 
74
+>  *  the shell could have been softer,
75
+> 
76
+>  *  the yolk could have been harder,
77
+> 
78
+>  *  the white could have been yellower.
79
+> 
80
+> Overall, I liked it.
81
+
82
+(It's worth noting that mr. knowitalmostall does not work in the egg
83
+review business anymore.)

+ 16
- 0
tests/mdfmt/oracle/nest_ol_ol.stdout View File

@@ -0,0 +1,16 @@
1
+
2
+ 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.
9
+    
10
+     1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do
11
+        eiusmod tempor incididunt ut labore et dolore magna aliqua.
12
+        Ut enim ad minim veniam, quis nostrud exercitation ullamco  laboris
13
+        nisi ut aliquip ex ea commodo consequat. Duis aute  irure dolor
14
+        in reprehenderit in voluptate velit esse cillum  dolore eu fugiat
15
+        nulla pariatur. Excepteur sint occaecat  cupidatat non proident,
16
+        sunt in culpa qui officia deserunt  mollit anim id est laborum.

+ 16
- 0
tests/mdfmt/oracle/nest_ol_p.stdout View File

@@ -0,0 +1,16 @@
1
+
2
+ 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.
9
+    
10
+    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
11
+    do eiusmod tempor incididunt ut labore et dolore magna aliqua.
12
+    Ut enim ad minim veniam, quis nostrud exercitation ullamco  laboris
13
+    nisi ut aliquip ex ea commodo consequat. Duis aute  irure dolor
14
+    in reprehenderit in voluptate velit esse cillum  dolore eu fugiat
15
+    nulla pariatur. Excepteur sint occaecat  cupidatat non proident,
16
+    sunt in culpa qui officia deserunt  mollit anim id est laborum.

+ 15
- 0
tests/mdfmt/oracle/nest_ol_pre.stdout View File

@@ -0,0 +1,15 @@
1
+
2
+ 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.
9
+    
10
+        found = False
11
+        for x in sequence:
12
+            if pred(x.n):
13
+                found = True
14
+        if found:
15
+            ...

+ 16
- 0
tests/mdfmt/oracle/nest_ol_ul.stdout View File

@@ -0,0 +1,16 @@
1
+
2
+ 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.
9
+    
10
+     *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do
11
+        eiusmod tempor incididunt ut labore et dolore magna aliqua.
12
+        Ut enim ad minim veniam, quis nostrud exercitation ullamco  laboris
13
+        nisi ut aliquip ex ea commodo consequat. Duis aute  irure dolor
14
+        in reprehenderit in voluptate velit esse cillum  dolore eu fugiat
15
+        nulla pariatur. Excepteur sint occaecat  cupidatat non proident,
16
+        sunt in culpa qui officia deserunt  mollit anim id est laborum.

+ 16
- 0
tests/mdfmt/oracle/nest_ul_ol.stdout View File

@@ -0,0 +1,16 @@
1
+
2
+ *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.
9
+    
10
+     1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do
11
+        eiusmod tempor incididunt ut labore et dolore magna aliqua.
12
+        Ut enim ad minim veniam, quis nostrud exercitation ullamco  laboris
13
+        nisi ut aliquip ex ea commodo consequat. Duis aute  irure dolor
14
+        in reprehenderit in voluptate velit esse cillum  dolore eu fugiat
15
+        nulla pariatur. Excepteur sint occaecat  cupidatat non proident,
16
+        sunt in culpa qui officia deserunt  mollit anim id est laborum.

+ 16
- 0
tests/mdfmt/oracle/nest_ul_p.stdout View File

@@ -0,0 +1,16 @@
1
+
2
+ *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.
9
+    
10
+    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
11
+    do eiusmod tempor incididunt ut labore et dolore magna aliqua.
12
+    Ut enim ad minim veniam, quis nostrud exercitation ullamco  laboris
13
+    nisi ut aliquip ex ea commodo consequat. Duis aute  irure dolor
14
+    in reprehenderit in voluptate velit esse cillum  dolore eu fugiat
15
+    nulla pariatur. Excepteur sint occaecat  cupidatat non proident,
16
+    sunt in culpa qui officia deserunt  mollit anim id est laborum.

+ 15
- 0
tests/mdfmt/oracle/nest_ul_pre.stdout View File

@@ -0,0 +1,15 @@
1
+
2
+ *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.
9
+    
10
+        found = False
11
+        for x in sequence:
12
+            if pred(x.n):
13
+                found = True
14
+        if found:
15
+            ...

+ 16
- 0
tests/mdfmt/oracle/nest_ul_ul.stdout View File

@@ -0,0 +1,16 @@
1
+
2
+ *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.
9
+    
10
+     *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do
11
+        eiusmod tempor incididunt ut labore et dolore magna aliqua.
12
+        Ut enim ad minim veniam, quis nostrud exercitation ullamco  laboris
13
+        nisi ut aliquip ex ea commodo consequat. Duis aute  irure dolor
14
+        in reprehenderit in voluptate velit esse cillum  dolore eu fugiat
15
+        nulla pariatur. Excepteur sint occaecat  cupidatat non proident,
16
+        sunt in culpa qui officia deserunt  mollit anim id est laborum.

+ 8
- 0
tests/mdfmt/oracle/pair_h1_h2.stdout View File

@@ -0,0 +1,8 @@
1
+
2
+
3
+How did I grow my rhino nose
4
+============================
5
+
6
+
7
+How did I grow my rhino nose
8
+----------------------------

+ 12
- 0
tests/mdfmt/oracle/pair_h1_p.stdout View File

@@ -0,0 +1,12 @@
1
+
2
+
3
+How did I grow my rhino nose
4
+============================
5
+
6
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
7
+tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
8
+veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip ex ea
9
+commodo consequat. Duis aute  irure dolor in reprehenderit in voluptate
10
+velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur sint
11
+occaecat  cupidatat non proident, sunt in culpa qui officia deserunt
12
+mollit anim id est laborum.

+ 16
- 0
tests/mdfmt/oracle/pair_p_ol.stdout View File

@@ -0,0 +1,16 @@
1
+
2
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip ex ea
5
+commodo consequat. Duis aute  irure dolor in reprehenderit in voluptate
6
+velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur sint
7
+occaecat  cupidatat non proident, sunt in culpa qui officia deserunt
8
+mollit anim id est laborum.
9
+
10
+ 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
11
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
12
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
13
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
14
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
15
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
16
+    deserunt  mollit anim id est laborum.

+ 15
- 0
tests/mdfmt/oracle/pair_p_pre.stdout View File

@@ -0,0 +1,15 @@
1
+
2
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip ex ea
5
+commodo consequat. Duis aute  irure dolor in reprehenderit in voluptate
6
+velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur sint
7
+occaecat  cupidatat non proident, sunt in culpa qui officia deserunt
8
+mollit anim id est laborum.
9
+
10
+    found = False
11
+    for x in sequence:
12
+        if pred(x.n):
13
+            found = True
14
+    if found:
15
+        ...

+ 16
- 0
tests/mdfmt/oracle/pair_p_ul.stdout View File

@@ -0,0 +1,16 @@
1
+
2
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip ex ea
5
+commodo consequat. Duis aute  irure dolor in reprehenderit in voluptate
6
+velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur sint
7
+occaecat  cupidatat non proident, sunt in culpa qui officia deserunt
8
+mollit anim id est laborum.
9
+
10
+ *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
11
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
12
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
13
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
14
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
15
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
16
+    deserunt  mollit anim id est laborum.

+ 4
- 0
tests/mdfmt/oracle/single_h1.stdout View File

@@ -0,0 +1,4 @@
1
+
2
+
3
+How did I grow my rhino nose
4
+============================

+ 4
- 0
tests/mdfmt/oracle/single_h2.stdout View File

@@ -0,0 +1,4 @@
1
+
2
+
3
+How did I grow my rhino nose
4
+----------------------------

+ 3
- 0
tests/mdfmt/oracle/single_h3.stdout View File

@@ -0,0 +1,3 @@
1
+
2
+
3
+### How did I grow my rhino nose ###

+ 8
- 0
tests/mdfmt/oracle/single_ol.stdout View File

@@ -0,0 +1,8 @@
1
+
2
+ 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.

+ 8
- 0
tests/mdfmt/oracle/single_p.stdout View File

@@ -0,0 +1,8 @@
1
+
2
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip ex ea
5
+commodo consequat. Duis aute  irure dolor in reprehenderit in voluptate
6
+velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur sint
7
+occaecat  cupidatat non proident, sunt in culpa qui officia deserunt
8
+mollit anim id est laborum.

+ 7
- 0
tests/mdfmt/oracle/single_pre.stdout View File

@@ -0,0 +1,7 @@
1
+
2
+    found = False
3
+    for x in sequence:
4
+        if pred(x.n):
5
+            found = True
6
+    if found:
7
+        ...

+ 8
- 0
tests/mdfmt/oracle/single_ul.stdout View File

@@ -0,0 +1,8 @@
1
+
2
+ *  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed  do eiusmod
3
+    tempor incididunt ut labore et dolore magna aliqua.  Ut enim ad minim
4
+    veniam, quis nostrud exercitation ullamco  laboris nisi ut aliquip
5
+    ex ea commodo consequat. Duis aute  irure dolor in reprehenderit in
6
+    voluptate velit esse cillum  dolore eu fugiat nulla pariatur. Excepteur
7
+    sint occaecat  cupidatat non proident, sunt in culpa qui officia
8
+    deserunt  mollit anim id est laborum.

+ 6
- 0
tests/shellfu_api/oracle/functions.stdout View File

@@ -42,6 +42,12 @@ inigrep._inigrep__fltsct
42 42
 inigrep._inigrep__query
43 43
 inigrep._inigrep__validate_ks
44 44
 inigrep.inigrep
45
+mdfmt._mdfmt__fmttype
46
+mdfmt._mdfmt__indent
47
+mdfmt._mdfmt__join
48
+mdfmt._mdfmt__quote
49
+mdfmt._mdfmt__width
50
+mdfmt.mdfmt
45 51
 pretty.__shellfu_pretty__init
46 52
 pretty._pretty__cat
47 53
 pretty._pretty__echo

+ 1
- 0
tests/shellfu_api/oracle/modules.stdout View File

@@ -6,6 +6,7 @@ _pretty_plain
6 6
 charmenu
7 7
 exit
8 8
 inigrep
9
+mdfmt
9 10
 pretty
10 11
 sync
11 12
 termcolors

+ 1
- 0
tests/shellfu_api/oracle/variables.stdout View File

@@ -10,6 +10,7 @@ exit.EXIT_NO
10 10
 exit.EXIT_OK
11 11
 exit.EXIT_PANIC
12 12
 exit.EXIT_USAGE
13
+mdfmt.MDFMT_WIDTH
13 14
 pretty.PRETTY
14 15
 pretty.PRETTY_DEBUG
15 16
 pretty.PRETTY_DEBUG_EXCLUDE