docgen-tool 2.1.3 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/LICENSE +35 -33
  2. package/{docgen → dist/docgen.js} +13 -24
  3. package/{source → dist/source}/docgen.js +380 -357
  4. package/dist/source/require/docgen.css +138 -0
  5. package/dist/source/require/katexInjector.js +18 -0
  6. package/dist/source/require/print.css +26 -0
  7. package/{source → dist/source}/templates/main.html +93 -93
  8. package/package.json +50 -20
  9. package/.npmignore +0 -2
  10. package/docs/advanced-content.html +0 -239
  11. package/docs/commonmark.html +0 -225
  12. package/docs/docgen.pdf +0 -0
  13. package/docs/files/images/logo.png +0 -0
  14. package/docs/files/images/overview.png +0 -0
  15. package/docs/files/images/pdf.png +0 -0
  16. package/docs/files/images/svg/icon.svg +0 -845
  17. package/docs/files/images/svg/overview.svg +0 -1345
  18. package/docs/files/images/text.png +0 -0
  19. package/docs/files/images/web.png +0 -0
  20. package/docs/index.html +0 -333
  21. package/docs/installation.html +0 -121
  22. package/docs/ownership.html +0 -164
  23. package/docs/release-notes.html +0 -148
  24. package/docs/require/docgen.css +0 -131
  25. package/docs/require/katexInjector.js +0 -22
  26. package/docs/require/print.css +0 -19
  27. package/docs/running.html +0 -123
  28. package/docs/troubleshooting.html +0 -105
  29. package/docs/upgrading.html +0 -124
  30. package/docs/version-control.html +0 -102
  31. package/docs/writing-content.html +0 -305
  32. package/index.html +0 -10
  33. package/source/example/contents.json +0 -12
  34. package/source/example/files/images/logo.png +0 -0
  35. package/source/example/index.txt +0 -4
  36. package/source/example/parameters.json +0 -37
  37. package/source/example/release-notes.txt +0 -1
  38. package/source/optional/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
  39. package/source/optional/katex/fonts/KaTeX_Main-Bold.woff +0 -0
  40. package/source/optional/katex/fonts/KaTeX_Main-Italic.woff +0 -0
  41. package/source/optional/katex/fonts/KaTeX_Main-Regular.woff +0 -0
  42. package/source/optional/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  43. package/source/optional/katex/fonts/KaTeX_Math-Italic.woff +0 -0
  44. package/source/optional/katex/fonts/KaTeX_Math-Regular.woff +0 -0
  45. package/source/optional/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
  46. package/source/optional/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
  47. package/source/optional/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
  48. package/source/optional/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
  49. package/source/optional/katex/katex.min.css +0 -1
  50. package/source/optional/katex/katex.min.js +0 -6
  51. package/source/pdf-stylesheet.css +0 -53
  52. package/source/release-checklist.txt +0 -27
  53. package/source/require/docgen.css +0 -131
  54. package/source/require/katexInjector.js +0 -22
  55. package/source/require/print.css +0 -19
  56. package/source/require/webknife/fonts/DroidSansMono.woff +0 -0
  57. package/source/require/webknife/fonts/OpenSans.woff +0 -0
  58. package/source/require/webknife/fonts/OpenSansBold.woff +0 -0
  59. package/source/require/webknife/fonts/OpenSansBoldItalic.woff +0 -0
  60. package/source/require/webknife/fonts/OpenSansItalic.woff +0 -0
  61. package/source/require/webknife/framework.icons.js +0 -82
  62. package/source/require/webknife/framework.min.css +0 -3
  63. package/source/require/webknife/framework.min.js +0 -14
  64. package/source/require/webknife/highlight.min.css +0 -1
  65. package/source/require/webknife/highlight.min.js +0 -6
  66. package/source/user-guide/advanced-content.txt +0 -171
  67. package/source/user-guide/commonmark.txt +0 -156
  68. package/source/user-guide/contents.json +0 -57
  69. package/source/user-guide/files/images/logo.png +0 -0
  70. package/source/user-guide/files/images/overview.png +0 -0
  71. package/source/user-guide/files/images/pdf.png +0 -0
  72. package/source/user-guide/files/images/svg/icon.svg +0 -845
  73. package/source/user-guide/files/images/svg/overview.svg +0 -1345
  74. package/source/user-guide/files/images/text.png +0 -0
  75. package/source/user-guide/files/images/web.png +0 -0
  76. package/source/user-guide/index.txt +0 -245
  77. package/source/user-guide/installation.txt +0 -49
  78. package/source/user-guide/parameters.json +0 -37
  79. package/source/user-guide/release-notes.txt +0 -64
  80. package/source/user-guide/running.txt +0 -47
  81. package/source/user-guide/troubleshooting.txt +0 -32
  82. package/source/user-guide/upgrading.txt +0 -25
  83. package/source/user-guide/version-control.txt +0 -13
  84. package/source/user-guide/writing-content.txt +0 -269
  85. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_AMS-Regular.woff +0 -0
  86. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Main-Bold.woff +0 -0
  87. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Main-Italic.woff +0 -0
  88. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Main-Regular.woff +0 -0
  89. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  90. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Math-Italic.woff +0 -0
  91. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Math-Regular.woff +0 -0
  92. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Size1-Regular.woff +0 -0
  93. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Size2-Regular.woff +0 -0
  94. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Size3-Regular.woff +0 -0
  95. /package/{docs/require → dist/source/optional}/katex/fonts/KaTeX_Size4-Regular.woff +0 -0
  96. /package/{docs/require → dist/source/optional}/katex/katex.min.css +0 -0
  97. /package/{docs/require → dist/source/optional}/katex/katex.min.js +0 -0
  98. /package/{source → dist/source}/pdf-contents.xsl +0 -0
  99. /package/{docs → dist/source}/require/webknife/fonts/DroidSansMono.woff +0 -0
  100. /package/{docs → dist/source}/require/webknife/fonts/OpenSans.woff +0 -0
  101. /package/{docs → dist/source}/require/webknife/fonts/OpenSansBold.woff +0 -0
  102. /package/{docs → dist/source}/require/webknife/fonts/OpenSansBoldItalic.woff +0 -0
  103. /package/{docs → dist/source}/require/webknife/fonts/OpenSansItalic.woff +0 -0
  104. /package/{docs → dist/source}/require/webknife/framework.icons.js +0 -0
  105. /package/{docs → dist/source}/require/webknife/framework.min.css +0 -0
  106. /package/{docs → dist/source}/require/webknife/framework.min.js +0 -0
  107. /package/{docs → dist/source}/require/webknife/highlight.min.css +0 -0
  108. /package/{docs → dist/source}/require/webknife/highlight.min.js +0 -0
  109. /package/{source → dist/source}/templates/pdfCover.html +0 -0
  110. /package/{source → dist/source}/templates/pdfFooter.html +0 -0
  111. /package/{source → dist/source}/templates/pdfHeader.html +0 -0
  112. /package/{source → dist/source}/templates/redirect.html +0 -0
  113. /package/{source → dist/source}/templates/webCover.html +0 -0
@@ -0,0 +1,138 @@
1
+ pre {
2
+ font-size: 12px; /*todo - move to webknife*/
3
+ }
4
+
5
+ section blockquote p,
6
+ section li p {
7
+ margin: 0;
8
+ }
9
+
10
+ .w-table {
11
+ width: 100%;
12
+ }
13
+
14
+ /******************************** TABLE OF CONTENTS ****************************/
15
+
16
+ /*Table of contents button to initiate show/hide*/
17
+ #dg-navigator {
18
+ float: right;
19
+ background-color: #4d4d4d;
20
+ color: white;
21
+ text-align: right;
22
+ padding: 10px 20px 10px 20px;
23
+ margin-right: 200px;
24
+ border-radius: 0 0 10px 10px;
25
+ cursor: pointer;
26
+ font-weight: bold;
27
+ }
28
+
29
+ /*Table of contents container*/
30
+ #dg-toc {
31
+ color: white;
32
+ background-color: #4d4d4d;
33
+ }
34
+
35
+ #dg-toc table {
36
+ table-layout: auto;
37
+ width: 100%;
38
+ }
39
+
40
+ #dg-toc div {
41
+ padding: 15px 0 15px 0;
42
+ }
43
+
44
+ /*Columns in table of contents*/
45
+
46
+ #dg-toc td {
47
+ border-right: 1px solid #666;
48
+ vertical-align: top;
49
+ text-align: left;
50
+ padding: 0 20px 0 20px;
51
+ }
52
+
53
+ #dg-toc ul {
54
+ padding: 0;
55
+ list-style-type: none;
56
+ }
57
+
58
+ #dg-toc li {
59
+ font-weight: bold;
60
+ }
61
+
62
+ #dg-toc table td a {
63
+ color: white;
64
+ font-weight: normal;
65
+ text-decoration: none;
66
+ margin-left: 10px;
67
+ }
68
+
69
+ #dg-toc table td a:hover {
70
+ text-decoration: underline;
71
+ }
72
+
73
+ #dg-tocFixedColumn {
74
+ border-right: none;
75
+ }
76
+
77
+ #dg-toc table #dg-tocFixedColumn a {
78
+ vertical-align: middle;
79
+ margin-left: 4px;
80
+ }
81
+
82
+ .dg-tocGroup {
83
+ width: 22%;
84
+ }
85
+
86
+ .dg-tocHeading {
87
+ font-size: 16px;
88
+ }
89
+
90
+ .dg-tocIcon {
91
+ width: 18px;
92
+ height: 18px;
93
+ float: left;
94
+ }
95
+ .dg-tocIcon svg {
96
+ fill: white;
97
+ }
98
+
99
+ /*
100
+ Page table of contents
101
+ */
102
+
103
+ .dg-pageToc {
104
+ list-style: none;
105
+ padding: 10px;
106
+ border: 1px solid #999;
107
+ background-color: #eee;
108
+ }
109
+
110
+ /*
111
+ Class to make a heading look invisible in web page, but still appear in the PDF table of contents
112
+ - display:none, visibily: hidden, zero dimensions, and offscreen positioning don't work
113
+ - so instead take it out of the flow and make it small and translucent
114
+ */
115
+
116
+ .dg-hiddenTitle {
117
+ display: block;
118
+ border: none;
119
+ margin: 0;
120
+ padding: 0;
121
+ width: 1px;
122
+ height: 1px;
123
+ overflow: hidden;
124
+ position: absolute;
125
+ background-color: transparent;
126
+ }
127
+
128
+ .dg-fakeHeading {
129
+ /*todo - move to webknife*/
130
+ text-decoration: none;
131
+ font-weight: bold;
132
+ color: #385691;
133
+ padding-bottom: 5px;
134
+ border-bottom: 1px solid #999;
135
+ margin: 20px 0 20px 0;
136
+ font-size: 16px;
137
+ padding-bottom: 4px;
138
+ }
@@ -0,0 +1,18 @@
1
+ $(document).ready(function () {
2
+ //mathematical expressions using katex, if enabled
3
+ $('.dg-katexMath').each(function () {
4
+ var texTxt = $(this).text();
5
+
6
+ el = $(this).get(0);
7
+ if (el.tagName == 'DIV') {
8
+ addDisp = '\\displaystyle';
9
+ } else {
10
+ addDisp = '';
11
+ }
12
+ try {
13
+ katex.render(addDisp + texTxt, el);
14
+ } catch (err) {
15
+ $(this).html("<span class='err'>" + err);
16
+ }
17
+ });
18
+ });
@@ -0,0 +1,26 @@
1
+ html {
2
+ background-color: white; /*otherwise background artefacts appear as a feint outline in PDF*/
3
+ }
4
+
5
+ .dg-pageToc {
6
+ display: none;
7
+ }
8
+
9
+ #dg-toc,
10
+ #dg-navigator,
11
+ header,
12
+ footer {
13
+ display: none;
14
+ }
15
+
16
+ .dg-avoidBreak,
17
+ #dg-content th,
18
+ #dg-content tr,
19
+ #dg-content blockquote,
20
+ #dg-content pre {
21
+ page-break-inside: avoid;
22
+ }
23
+
24
+ .dg-forceBreak {
25
+ page-break-after: always;
26
+ }
@@ -1,93 +1,93 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta http-equiv="X-UA-Compatible" content="IE=edge" ><!--Prevent IE using compatibility mode on local or intranet pages. Do not put scripts before this line.-->
5
- <meta name="viewport" content="width=device-width, user-scalable=yes"><!--Mobile device scaling-->
6
- <meta charset="UTF-8">
7
- <title></title>
8
-
9
- <!--load stylesheets first (rationale: https://developers.google.com/speed/docs/best-practices/rtt#PutStylesBeforeScripts)-->
10
- <link rel="stylesheet" href="require/webknife/framework.min.css" type="text/css" />
11
- <link rel="stylesheet" href="require/webknife/highlight.min.css" type="text/css" />
12
- <link rel="stylesheet" href="require/docgen.css" type="text/css" />
13
- <link rel="stylesheet" href="require/print.css" media="print" />
14
-
15
- <!--load scripts second-->
16
-
17
- <script src="require/webknife/framework.min.js"></script>
18
- <script src="require/webknife/framework.icons.js"></script>
19
- <script src="require/webknife/highlight.min.js"></script>
20
-
21
- <!--inline scripts last-->
22
-
23
- <script type="text/javascript">
24
-
25
- $(document).ready( function () {
26
- $("#dg-toc").hide(); //hide the table of contents
27
-
28
- //instantiate an svg injector to show SVG icons
29
- var injector = new svgInject();
30
- injector.inject();
31
-
32
- //code syntax highlighting
33
- $('pre code, .w-inline-code').each(function(i, block) {
34
- hljs.highlightBlock(block);
35
- });
36
-
37
- //toggle visibility of table of contents
38
- $("#dg-navigator").click(function()
39
- {
40
- $("#dg-toc").slideToggle("fast");
41
- $(this).toggleClass("active");
42
- });
43
-
44
- });
45
- </script>
46
-
47
- <script type="text/x-mathjax-config">
48
- //MathJax configuration is the same as used by math.stackexchange.com
49
- MathJax.Hub.Config({"HTML-CSS": { preferredFont: "TeX", availableFonts: ["STIX","TeX"], linebreaks: { automatic:true }, EqnChunk: (MathJax.Hub.Browser.isMobile ? 10 : 50) },
50
- tex2jax: { inlineMath: [ ["$", "$"], ["\\\\(","\\\\)"] ], displayMath: [ ["$$","$$"], ["\\[", "\\]"] ], processEscapes: true, ignoreClass: "tex2jax_ignore|dno" },
51
- TeX: { noUndefined: { attributes: { mathcolor: "red", mathbackground: "#FFEEEE", mathsize: "90%" } }, Macros: { href: "{}" } },
52
- messageStyle: "none"
53
- });
54
- </script>
55
-
56
- </head>
57
-
58
- <body>
59
-
60
- <div id="dg-toc"></div>
61
- <div id="dg-navigator">Table of contents</div>
62
-
63
- <header>
64
- <div class="w-fixed-width">
65
- <a id="dg-homelink" href="">
66
- <div id="dg-logo">
67
- <span id="dg-title"></span> <span id="dg-web-title-version" style="font-weight:normal;"></span>
68
- </div>
69
- </a>
70
- <div>
71
- <span id="dg-backlink"></span>
72
- </div>
73
- </div>
74
- </header>
75
-
76
- <section id="dg-content">
77
-
78
- </section>
79
-
80
- <footer>
81
- <div><p class="w-fixed-width"><span id="dg-web-footer">.</p></div>
82
- <div class="w-fixed-width">
83
- <p><span id="dg-copyright"></span></p>
84
- <p>
85
- <span id="dg-marking"></span>
86
- <span id="dg-legalese"></span>
87
- <span id="dg-attribution"></span>
88
- </p>
89
- </div>
90
- </footer>
91
-
92
- </body>
93
- </html>
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" ><!--Prevent IE using compatibility mode on local or intranet pages. Do not put scripts before this line.-->
5
+ <meta name="viewport" content="width=device-width, user-scalable=yes"><!--Mobile device scaling-->
6
+ <meta charset="UTF-8">
7
+ <title></title>
8
+
9
+ <!--load stylesheets first (rationale: https://developers.google.com/speed/docs/best-practices/rtt#PutStylesBeforeScripts)-->
10
+ <link rel="stylesheet" href="require/webknife/framework.min.css" type="text/css" />
11
+ <link rel="stylesheet" href="require/webknife/highlight.min.css" type="text/css" />
12
+ <link rel="stylesheet" href="require/docgen.css" type="text/css" />
13
+ <link rel="stylesheet" href="require/print.css" media="print" />
14
+
15
+ <!--load scripts second-->
16
+
17
+ <script src="require/webknife/framework.min.js"></script>
18
+ <script src="require/webknife/framework.icons.js"></script>
19
+ <script src="require/webknife/highlight.min.js"></script>
20
+
21
+ <!--inline scripts last-->
22
+
23
+ <script type="text/javascript">
24
+
25
+ $(document).ready( function () {
26
+ $("#dg-toc").hide(); //hide the table of contents
27
+
28
+ //instantiate an svg injector to show SVG icons
29
+ var injector = new svgInject();
30
+ injector.inject();
31
+
32
+ //code syntax highlighting
33
+ $('pre code, .w-inline-code').each(function(i, block) {
34
+ hljs.highlightBlock(block);
35
+ });
36
+
37
+ //toggle visibility of table of contents
38
+ $("#dg-navigator").click(function()
39
+ {
40
+ $("#dg-toc").slideToggle("fast");
41
+ $(this).toggleClass("active");
42
+ });
43
+
44
+ });
45
+ </script>
46
+
47
+ <script type="text/x-mathjax-config">
48
+ //MathJax configuration is the same as used by math.stackexchange.com
49
+ MathJax.Hub.Config({"HTML-CSS": { preferredFont: "TeX", availableFonts: ["STIX","TeX"], linebreaks: { automatic:true }, EqnChunk: (MathJax.Hub.Browser.isMobile ? 10 : 50) },
50
+ tex2jax: { inlineMath: [ ["$", "$"], ["\\\\(","\\\\)"] ], displayMath: [ ["$$","$$"], ["\\[", "\\]"] ], processEscapes: true, ignoreClass: "tex2jax_ignore|dno" },
51
+ TeX: { noUndefined: { attributes: { mathcolor: "red", mathbackground: "#FFEEEE", mathsize: "90%" } }, Macros: { href: "{}" } },
52
+ messageStyle: "none"
53
+ });
54
+ </script>
55
+
56
+ </head>
57
+
58
+ <body>
59
+
60
+ <div id="dg-toc"></div>
61
+ <div id="dg-navigator">Table of contents</div>
62
+
63
+ <header>
64
+ <div class="w-fixed-width">
65
+ <a id="dg-homelink" href="">
66
+ <div id="dg-logo">
67
+ <span id="dg-title"></span> <span id="dg-web-title-version" style="font-weight:normal;"></span>
68
+ </div>
69
+ </a>
70
+ <div>
71
+ <span id="dg-backlink"></span>
72
+ </div>
73
+ </div>
74
+ </header>
75
+
76
+ <section id="dg-content">
77
+
78
+ </section>
79
+
80
+ <footer>
81
+ <div><p class="w-fixed-width"><span id="dg-web-footer">.</p></div>
82
+ <div class="w-fixed-width">
83
+ <p><span id="dg-copyright"></span></p>
84
+ <p>
85
+ <span id="dg-marking"></span>
86
+ <span id="dg-legalese"></span>
87
+ <span id="dg-attribution"></span>
88
+ </p>
89
+ </div>
90
+ </footer>
91
+
92
+ </body>
93
+ </html>
package/package.json CHANGED
@@ -1,35 +1,65 @@
1
1
  {
2
2
  "name": "docgen-tool",
3
- "version": "2.1.3",
3
+ "version": "3.0.1",
4
4
  "description": "A tool for creating HTML and PDF documentation",
5
- "main": "docgen",
6
- "bin" : { "docgen" : "./docgen" },
5
+ "main": "dist/docgen.js",
6
+ "bin": {
7
+ "docgen": "dist/docgen.js"
8
+ },
9
+ "files": [
10
+ "dist/*"
11
+ ],
12
+ "scripts": {
13
+ "dev": "ts-node docgen.js run",
14
+ "build": "tsc -p tsconfig.json",
15
+ "run:build": "dist/docgen.js",
16
+ "build:docs": "ts-node docgen.js run -i ./source/user-guide -o ./docs -p -m -n -d 40000",
17
+ "test": "npm run prettier:check",
18
+ "test:run": "ts-node docgen.js run -i ./source/__test__/test-run -o ./source/__test__/test-run-output",
19
+ "prettier:check": "prettier --check 'docgen.js' '*.{js,json,css,less}'",
20
+ "prettier:fix": "prettier --write 'docgen.js' '*.{js,json,css,less}'"
21
+ },
22
+ "husky": {
23
+ "hooks": {
24
+ "pre-commit": "lint-staged"
25
+ }
26
+ },
27
+ "lint-staged": {
28
+ "*.{js,json,css,less}": "prettier --write",
29
+ "docgen": "prettier --write"
30
+ },
7
31
  "dependencies": {
8
- "rsvp": "3.0.18",
9
- "commander": "2.8.1",
10
- "cheerio": "0.19.0",
11
- "markdown-it": "4.2.1",
12
- "moment" : "2.10.3",
13
- "z-schema": "3.10.2",
14
- "chalk": "1.0.0",
15
- "spawn-args": "0.1.0",
16
- "cli-spinner": "0.2.1",
17
- "image-size": "0.3.5",
18
- "fs-extra": "0.18.4"
32
+ "chalk": "^4.1.0",
33
+ "cheerio": "^1.0.0-rc.12",
34
+ "cli-spinner": "^0.2.10",
35
+ "commander": "^11.0.0",
36
+ "fs-extra": "^11.1.1",
37
+ "husky": "^4.3.0",
38
+ "image-size": "^1.0.2",
39
+ "lint-staged": "^10.5.1",
40
+ "markdown-it": "^13.0.1",
41
+ "moment": "^2.29.4",
42
+ "rsvp": "^4.8.5",
43
+ "spawn-args": "^0.2.0",
44
+ "z-schema": "^6.0.1"
19
45
  },
20
46
  "devDependencies": {
21
- },
22
- "scripts": {
23
- "test": "echo \"Error: no test specified\" && exit 1"
47
+ "@types/node": "^20.3.1",
48
+ "eslint": "^8.43.0",
49
+ "eslint-config-prettier": "^8.8.0",
50
+ "prettier": "^2.1.2",
51
+ "ts-node": "^10.9.1",
52
+ "tslib": "^2.5.3",
53
+ "typescript": "^5.1.3"
24
54
  },
25
55
  "repository": {
26
56
  "type": "git",
27
57
  "url": "https://github.com/mtmacdonald/docgen"
28
58
  },
29
- "author": "Mark Macdonald",
59
+ "author": "Inkit Inc. and contributors",
30
60
  "license": "MIT",
31
61
  "bugs": {
32
62
  "url": "https://github.com/mtmacdonald/docgen/issues"
33
63
  },
34
- "homepage": "https://github.com/mtmacdonald/docgen"
35
- }
64
+ "homepage": "http://mtmacdonald.github.io/docgen/docs/index.html"
65
+ }
package/.npmignore DELETED
@@ -1,2 +0,0 @@
1
- node_modules
2
- example/output