├── .gitattributes ├── .gitignore ├── Images └── oxyplot.svg ├── LICENSE ├── Markdig.Extensions.ScriptCs.ConsoleApp ├── App.config ├── Example output │ ├── modest.css │ ├── output.htm │ ├── output.pdf │ └── style.css ├── Markdig.Extensions.ScriptCs.ConsoleApp.csproj ├── Oxyplot.csx ├── Program.cs ├── Properties │ └── AssemblyInfo.cs ├── StringConstants.cs ├── input.md ├── modest.css ├── packages.config └── style.css ├── Markdig.Extensions.ScriptCs.sln ├── Markdig.Extensions.ScriptCs ├── Markdig.Extensions.ScriptCs.csproj ├── MarkdownDocument.cs ├── Properties │ └── AssemblyInfo.cs ├── ScriptCsBlock.cs ├── ScriptCsBlockParser.cs ├── ScriptCsBlockRenderer.cs ├── ScriptCsExtension.cs ├── ScriptCsInline.cs ├── ScriptCsInlineParser.cs ├── ScriptCsInlineRenderer.cs ├── ScriptCsOptions.cs ├── ScriptCsRenderer.cs ├── app.config └── packages.config └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # MSTest test Results 33 | [Tt]est[Rr]esult*/ 34 | [Bb]uild[Ll]og.* 35 | 36 | # NUNIT 37 | *.VisualState.xml 38 | TestResult.xml 39 | 40 | # Build Results of an ATL Project 41 | [Dd]ebugPS/ 42 | [Rr]eleasePS/ 43 | dlldata.c 44 | 45 | # .NET Core 46 | project.lock.json 47 | project.fragment.lock.json 48 | artifacts/ 49 | **/Properties/launchSettings.json 50 | 51 | *_i.c 52 | *_p.c 53 | *_i.h 54 | *.ilk 55 | *.meta 56 | *.obj 57 | *.pch 58 | *.pdb 59 | *.pgc 60 | *.pgd 61 | *.rsp 62 | *.sbr 63 | *.tlb 64 | *.tli 65 | *.tlh 66 | *.tmp 67 | *.tmp_proj 68 | *.log 69 | *.vspscc 70 | *.vssscc 71 | .builds 72 | *.pidb 73 | *.svclog 74 | *.scc 75 | 76 | # Chutzpah Test files 77 | _Chutzpah* 78 | 79 | # Visual C++ cache files 80 | ipch/ 81 | *.aps 82 | *.ncb 83 | *.opendb 84 | *.opensdf 85 | *.sdf 86 | *.cachefile 87 | *.VC.db 88 | *.VC.VC.opendb 89 | 90 | # Visual Studio profiler 91 | *.psess 92 | *.vsp 93 | *.vspx 94 | *.sap 95 | 96 | # TFS 2012 Local Workspace 97 | $tf/ 98 | 99 | # Guidance Automation Toolkit 100 | *.gpState 101 | 102 | # ReSharper is a .NET coding add-in 103 | _ReSharper*/ 104 | *.[Rr]e[Ss]harper 105 | *.DotSettings.user 106 | 107 | # JustCode is a .NET coding add-in 108 | .JustCode 109 | 110 | # TeamCity is a build add-in 111 | _TeamCity* 112 | 113 | # DotCover is a Code Coverage Tool 114 | *.dotCover 115 | 116 | # Visual Studio code coverage results 117 | *.coverage 118 | *.coveragexml 119 | 120 | # NCrunch 121 | _NCrunch_* 122 | .*crunch*.local.xml 123 | nCrunchTemp_* 124 | 125 | # MightyMoose 126 | *.mm.* 127 | AutoTest.Net/ 128 | 129 | # Web workbench (sass) 130 | .sass-cache/ 131 | 132 | # Installshield output folder 133 | [Ee]xpress/ 134 | 135 | # DocProject is a documentation generator add-in 136 | DocProject/buildhelp/ 137 | DocProject/Help/*.HxT 138 | DocProject/Help/*.HxC 139 | DocProject/Help/*.hhc 140 | DocProject/Help/*.hhk 141 | DocProject/Help/*.hhp 142 | DocProject/Help/Html2 143 | DocProject/Help/html 144 | 145 | # Click-Once directory 146 | publish/ 147 | 148 | # Publish Web Output 149 | *.[Pp]ublish.xml 150 | *.azurePubxml 151 | # TODO: Comment the next line if you want to checkin your web deploy settings 152 | # but database connection strings (with potential passwords) will be unencrypted 153 | *.pubxml 154 | *.publishproj 155 | 156 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 157 | # checkin your Azure Web App publish settings, but sensitive information contained 158 | # in these scripts will be unencrypted 159 | PublishScripts/ 160 | 161 | # NuGet Packages 162 | *.nupkg 163 | # The packages folder can be ignored because of Package Restore 164 | **/packages/* 165 | # except build/, which is used as an MSBuild target. 166 | !**/packages/build/ 167 | # Uncomment if necessary however generally it will be regenerated when needed 168 | #!**/packages/repositories.config 169 | # NuGet v3's project.json files produces more ignorable files 170 | *.nuget.props 171 | *.nuget.targets 172 | 173 | # Microsoft Azure Build Output 174 | csx/ 175 | *.build.csdef 176 | 177 | # Microsoft Azure Emulator 178 | ecf/ 179 | rcf/ 180 | 181 | # Windows Store app package directories and files 182 | AppPackages/ 183 | BundleArtifacts/ 184 | Package.StoreAssociation.xml 185 | _pkginfo.txt 186 | 187 | # Visual Studio cache files 188 | # files ending in .cache can be ignored 189 | *.[Cc]ache 190 | # but keep track of directories ending in .cache 191 | !*.[Cc]ache/ 192 | 193 | # Others 194 | ClientBin/ 195 | ~$* 196 | *~ 197 | *.dbmdl 198 | *.dbproj.schemaview 199 | *.jfm 200 | *.pfx 201 | *.publishsettings 202 | orleans.codegen.cs 203 | 204 | # Since there are multiple workflows, uncomment next line to ignore bower_components 205 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 206 | #bower_components/ 207 | 208 | # RIA/Silverlight projects 209 | Generated_Code/ 210 | 211 | # Backup & report files from converting an old project file 212 | # to a newer Visual Studio version. Backup files are not needed, 213 | # because we have git ;-) 214 | _UpgradeReport_Files/ 215 | Backup*/ 216 | UpgradeLog*.XML 217 | UpgradeLog*.htm 218 | 219 | # SQL Server files 220 | *.mdf 221 | *.ldf 222 | *.ndf 223 | 224 | # Business Intelligence projects 225 | *.rdl.data 226 | *.bim.layout 227 | *.bim_*.settings 228 | 229 | # Microsoft Fakes 230 | FakesAssemblies/ 231 | 232 | # GhostDoc plugin setting file 233 | *.GhostDoc.xml 234 | 235 | # Node.js Tools for Visual Studio 236 | .ntvs_analysis.dat 237 | node_modules/ 238 | 239 | # Typescript v1 declaration files 240 | typings/ 241 | 242 | # Visual Studio 6 build log 243 | *.plg 244 | 245 | # Visual Studio 6 workspace options file 246 | *.opt 247 | 248 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 249 | *.vbw 250 | 251 | # Visual Studio LightSwitch build output 252 | **/*.HTMLClient/GeneratedArtifacts 253 | **/*.DesktopClient/GeneratedArtifacts 254 | **/*.DesktopClient/ModelManifest.xml 255 | **/*.Server/GeneratedArtifacts 256 | **/*.Server/ModelManifest.xml 257 | _Pvt_Extensions 258 | 259 | # Paket dependency manager 260 | .paket/paket.exe 261 | paket-files/ 262 | 263 | # FAKE - F# Make 264 | .fake/ 265 | 266 | # JetBrains Rider 267 | .idea/ 268 | *.sln.iml 269 | 270 | # CodeRush 271 | .cr/ 272 | 273 | # Python Tools for Visual Studio (PTVS) 274 | __pycache__/ 275 | *.pyc 276 | 277 | # Cake - Uncomment if you are using it 278 | # tools/** 279 | # !tools/packages.config 280 | 281 | # Telerik's JustMock configuration file 282 | *.jmconfig 283 | 284 | # BizTalk build output 285 | *.btp.cs 286 | *.btm.cs 287 | *.odx.cs 288 | *.xsd.cs 289 | -------------------------------------------------------------------------------- /Images/oxyplot.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 0 62 | 1 63 | 2 64 | 3 65 | 4 66 | 5 67 | 6 68 | 7 69 | 8 70 | 9 71 | 10 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | -1 84 | -0.5 85 | 0 86 | 0.5 87 | 1 88 | 89 | 90 | 91 | 92 | 93 | 94 | Example 1 95 | 96 | 97 | cos(x) 98 | 99 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 macaba 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/Example output/modest.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | *, 3 | *:before, 4 | *:after { 5 | background: transparent !important; 6 | color: #000 !important; 7 | box-shadow: none !important; 8 | text-shadow: none !important; 9 | } 10 | 11 | a, 12 | a:visited { 13 | text-decoration: underline; 14 | } 15 | 16 | a[href]:after { 17 | content: " (" attr(href) ")"; 18 | } 19 | 20 | abbr[title]:after { 21 | content: " (" attr(title) ")"; 22 | } 23 | 24 | a[href^="#"]:after, 25 | a[href^="javascript:"]:after { 26 | content: ""; 27 | } 28 | 29 | pre, 30 | blockquote { 31 | border: 1px solid #999; 32 | page-break-inside: avoid; 33 | } 34 | 35 | thead { 36 | display: table-header-group; 37 | } 38 | 39 | tr, 40 | img { 41 | page-break-inside: avoid; 42 | } 43 | 44 | img { 45 | max-width: 100% !important; 46 | } 47 | 48 | p, 49 | h2, 50 | h3 { 51 | orphans: 3; 52 | widows: 3; 53 | } 54 | 55 | h2, 56 | h3 { 57 | page-break-after: avoid; 58 | } 59 | } 60 | 61 | pre, 62 | code { 63 | font-family: Menlo, Monaco, "Courier New", monospace; 64 | } 65 | 66 | pre { 67 | padding: .5rem; 68 | line-height: 1.25; 69 | overflow-x: scroll; 70 | } 71 | 72 | a, 73 | a:visited { 74 | color: #3498db; 75 | } 76 | 77 | a:hover, 78 | a:focus, 79 | a:active { 80 | color: #2980b9; 81 | } 82 | 83 | .modest-no-decoration { 84 | text-decoration: none; 85 | } 86 | 87 | html { 88 | font-size: 12px; 89 | } 90 | 91 | @media screen and (min-width: 32rem) and (max-width: 48rem) { 92 | html { 93 | font-size: 15px; 94 | } 95 | } 96 | 97 | @media screen and (min-width: 48rem) { 98 | html { 99 | font-size: 16px; 100 | } 101 | } 102 | 103 | body { 104 | line-height: 1.85; 105 | } 106 | 107 | p, 108 | .modest-p { 109 | font-size: 1rem; 110 | margin-bottom: 1.3rem; 111 | } 112 | 113 | h1, 114 | .modest-h1, 115 | h2, 116 | .modest-h2, 117 | h3, 118 | .modest-h3, 119 | h4, 120 | .modest-h4 { 121 | margin: 1.414rem 0 .5rem; 122 | font-weight: inherit; 123 | line-height: 1.42; 124 | } 125 | 126 | h1, 127 | .modest-h1 { 128 | margin-top: 0; 129 | font-size: 3.998rem; 130 | } 131 | 132 | h2, 133 | .modest-h2 { 134 | font-size: 2.827rem; 135 | } 136 | 137 | h3, 138 | .modest-h3 { 139 | font-size: 1.999rem; 140 | } 141 | 142 | h4, 143 | .modest-h4 { 144 | font-size: 1.414rem; 145 | } 146 | 147 | h5, 148 | .modest-h5 { 149 | font-size: 1.121rem; 150 | } 151 | 152 | h6, 153 | .modest-h6 { 154 | font-size: .88rem; 155 | } 156 | 157 | small, 158 | .modest-small { 159 | font-size: .707em; 160 | } 161 | 162 | /* https://github.com/mrmrs/fluidity */ 163 | 164 | img, 165 | canvas, 166 | iframe, 167 | video, 168 | svg, 169 | select, 170 | textarea { 171 | max-width: 100%; 172 | } 173 | 174 | @import url(http://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,300italic,700); 175 | 176 | @import url(http://fonts.googleapis.com/css?family=Arimo:700,700italic); 177 | 178 | html { 179 | font-size: 18px; 180 | max-width: 100%; 181 | } 182 | 183 | body { 184 | color: #444; 185 | font-family: 'Open Sans Condensed', sans-serif; 186 | font-weight: 300; 187 | margin: 0 auto; 188 | max-width: 48rem; 189 | line-height: 1.45; 190 | padding: .25rem; 191 | } 192 | 193 | h1, 194 | h2, 195 | h3, 196 | h4, 197 | h5, 198 | h6 { 199 | font-family: Arimo, Helvetica, sans-serif; 200 | } 201 | 202 | h1, 203 | h2, 204 | h3 { 205 | border-bottom: 2px solid #fafafa; 206 | margin-bottom: 1.15rem; 207 | padding-bottom: .5rem; 208 | text-align: center; 209 | } 210 | 211 | blockquote { 212 | border-left: 8px solid #fafafa; 213 | padding: 1rem; 214 | } 215 | 216 | pre, 217 | code { 218 | background-color: #fafafa; 219 | } -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/Example output/output.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Proof of concept 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 |

Report

17 |

Prerequisites

18 |

Instantiate the Markdig.Extensions.ScriptCs into the scripting runtime:

19 |
 20 | ```ScriptCs
 21 | #r Markdig.Extensions.ScriptCs.dll
 22 | using Markdig.Extensions.ScriptCs;
 23 | ```
 24 | 
25 |
26 |

This only needs to be done once in your document.

27 |

Html

28 |

This generates some simple HTML from ScriptCs

29 |

Code

30 |
 31 | MarkdownDocument.Instance.InsertHtml("<p>Hello World!</p>");
 32 | 
33 |
34 |

Output

35 |

Hello World!

Markdown

36 |

This generates some simple Markdown from ScriptCs (which is then processed into HTML)

37 |

Code

38 |
 39 | MarkdownDocument.Instance.InsertMarkdown("Hello World!");
 40 | 
41 |
42 |

Output

43 |

Hello World!

44 |

Inline

45 |

This uses inline code tags to generate some markdown.

46 |

Code

47 |
This is some `ScriptCs MarkdownDocument.Instance.InsertMarkdown("_italic_");` text.
 48 | 
49 |

Output

50 |

This is some italic text.

51 |

Code

52 |
This is some `ScriptCs MarkdownDocument.Instance.InsertHtml("<em>italic</em>");` text.
 53 | 
54 |

Output

55 |

This is some italic text.

56 |

Exception Handling

57 |

This generates a ScriptCs exception by using invalid code.

58 |

Code

59 |
 60 | var fakeModel = new FakeModel { Title = "Test" };
 61 | 
62 |
63 |

Output

64 |
ScriptCs exception:
 65 | (1,21): error CS0246: The type or namespace name 'FakeModel' could not be found (are you missing a using directive or an assembly reference?)
 66 | 
67 |

Bootstrap Layout

68 |

Simple content

69 |
70 |

Left

71 |
72 |

Middle

73 |
74 |

Right

75 |
76 |
77 |

Content from ScriptCs

78 |
79 |

Left half

80 |
81 |

Right half

82 |
83 |
84 |

OxyPlot

85 |

Code

86 |
 87 | #r OxyPlot.dll
 88 | #r System.Runtime.dll
 89 | using OxyPlot;
 90 | using OxyPlot.Series;
 91 | var myModel = new PlotModel { Title = "Example 1" };
 92 | myModel.Series.Add(new FunctionSeries(Math.Cos, 0, 10, 0.1, "cos(x)"));
 93 | var exporter = new SvgExporter { Width = 800, Height = 400 };
 94 | MarkdownDocument.Instance.InsertHtml(exporter.ExportToString(myModel));
 95 | 
96 |
97 |

Output

98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 0 159 | 1 160 | 2 161 | 3 162 | 4 163 | 5 164 | 6 165 | 7 166 | 8 167 | 9 168 | 10 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | -1 181 | -0.5 182 | 0 183 | 0.5 184 | 1 185 | 186 | 187 | 188 | 189 | 190 | 191 | Example 1 192 | 193 | 194 | cos(x) 195 | 196 |

Ipsum Lorem

197 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae fermentum dui. Morbi eu scelerisque ligula. Vivamus placerat erat urna, nec dictum lacus varius eu. Ut eu enim quis elit tempor congue quis eu tortor. Duis sed finibus erat. Curabitur venenatis, est quis consectetur porta, eros lacus gravida augue, vitae consequat nibh dui ut urna. Cras at orci quis felis congue volutpat non in mauris. Donec posuere risus felis, et egestas sapien ultrices in. Aliquam elementum imperdiet est, ullamcorper fermentum mauris imperdiet ornare.

198 |

Phasellus erat ex, egestas faucibus tellus vel, volutpat feugiat est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce ornare metus ut risus viverra, ut vulputate nisl ullamcorper. Pellentesque auctor volutpat dictum. Sed vel justo massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce consectetur sit amet est quis aliquam. Cras fermentum blandit justo, sed sagittis felis pharetra at. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque id felis est. Curabitur ac massa at arcu laoreet gravida. Quisque pretium sagittis dignissim. Curabitur consequat eget purus et sollicitudin. Vivamus hendrerit sodales egestas. Ut pretium dui id erat interdum bibendum. Nulla vitae ligula in sem congue pulvinar id in libero.

199 |

Donec efficitur sollicitudin pulvinar. Sed quis diam a nibh scelerisque luctus. Aenean varius ullamcorper vulputate. Pellentesque facilisis rutrum lacus, ut bibendum magna dignissim non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse porttitor mauris quis rhoncus blandit. Aliquam ac imperdiet risus. Vestibulum imperdiet dolor eu tortor consectetur sollicitudin. Maecenas malesuada accumsan volutpat. Quisque et elementum ligula.

200 |

Nullam augue odio, facilisis in enim id, tincidunt dapibus metus. Quisque sed faucibus ex. Suspendisse lacus libero, porta sed metus vel, tempor mattis magna. Vivamus vulputate mi vel purus fringilla ultricies. Fusce vitae consequat odio, eu porttitor nulla. Nunc nec maximus massa. Praesent porttitor porta dignissim. Nunc lacinia tempus convallis.

201 |

Nunc at metus eleifend, luctus ligula eu, vehicula leo. Fusce ultrices dui at ante laoreet auctor. Fusce non augue vel erat ultrices tristique a et sem. Pellentesque at elementum est. Quisque consectetur commodo metus, non molestie felis gravida a. Nam molestie feugiat aliquet. Pellentesque augue odio, tristique id arcu ac, rhoncus dapibus quam. Integer congue a lectus at congue. Donec accumsan elementum tempor. Praesent auctor bibendum ipsum quis ultricies. Pellentesque congue malesuada ligula, id mattis turpis ullamcorper pulvinar. Cras mi tellus, porttitor eu mauris eget, elementum dapibus nulla.

202 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae fermentum dui. Morbi eu scelerisque ligula. Vivamus placerat erat urna, nec dictum lacus varius eu. Ut eu enim quis elit tempor congue quis eu tortor. Duis sed finibus erat. Curabitur venenatis, est quis consectetur porta, eros lacus gravida augue, vitae consequat nibh dui ut urna. Cras at orci quis felis congue volutpat non in mauris. Donec posuere risus felis, et egestas sapien ultrices in. Aliquam elementum imperdiet est, ullamcorper fermentum mauris imperdiet ornare.

203 |

Phasellus erat ex, egestas faucibus tellus vel, volutpat feugiat est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce ornare metus ut risus viverra, ut vulputate nisl ullamcorper. Pellentesque auctor volutpat dictum. Sed vel justo massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce consectetur sit amet est quis aliquam. Cras fermentum blandit justo, sed sagittis felis pharetra at. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque id felis est. Curabitur ac massa at arcu laoreet gravida. Quisque pretium sagittis dignissim. Curabitur consequat eget purus et sollicitudin. Vivamus hendrerit sodales egestas. Ut pretium dui id erat interdum bibendum. Nulla vitae ligula in sem congue pulvinar id in libero.

204 |

Donec efficitur sollicitudin pulvinar. Sed quis diam a nibh scelerisque luctus. Aenean varius ullamcorper vulputate. Pellentesque facilisis rutrum lacus, ut bibendum magna dignissim non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse porttitor mauris quis rhoncus blandit. Aliquam ac imperdiet risus. Vestibulum imperdiet dolor eu tortor consectetur sollicitudin. Maecenas malesuada accumsan volutpat. Quisque et elementum ligula.

205 |

Nullam augue odio, facilisis in enim id, tincidunt dapibus metus. Quisque sed faucibus ex. Suspendisse lacus libero, porta sed metus vel, tempor mattis magna. Vivamus vulputate mi vel purus fringilla ultricies. Fusce vitae consequat odio, eu porttitor nulla. Nunc nec maximus massa. Praesent porttitor porta dignissim. Nunc lacinia tempus convallis.

206 |

Nunc at metus eleifend, luctus ligula eu, vehicula leo. Fusce ultrices dui at ante laoreet auctor. Fusce non augue vel erat ultrices tristique a et sem. Pellentesque at elementum est. Quisque consectetur commodo metus, non molestie felis gravida a. Nam molestie feugiat aliquet. Pellentesque augue odio, tristique id arcu ac, rhoncus dapibus quam. Integer congue a lectus at congue. Donec accumsan elementum tempor. Praesent auctor bibendum ipsum quis ultricies. Pellentesque congue malesuada ligula, id mattis turpis ullamcorper pulvinar. Cras mi tellus, porttitor eu mauris eget, elementum dapibus nulla.

207 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae fermentum dui. Morbi eu scelerisque ligula. Vivamus placerat erat urna, nec dictum lacus varius eu. Ut eu enim quis elit tempor congue quis eu tortor. Duis sed finibus erat. Curabitur venenatis, est quis consectetur porta, eros lacus gravida augue, vitae consequat nibh dui ut urna. Cras at orci quis felis congue volutpat non in mauris. Donec posuere risus felis, et egestas sapien ultrices in. Aliquam elementum imperdiet est, ullamcorper fermentum mauris imperdiet ornare.

208 |

Phasellus erat ex, egestas faucibus tellus vel, volutpat feugiat est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce ornare metus ut risus viverra, ut vulputate nisl ullamcorper. Pellentesque auctor volutpat dictum. Sed vel justo massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce consectetur sit amet est quis aliquam. Cras fermentum blandit justo, sed sagittis felis pharetra at. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque id felis est. Curabitur ac massa at arcu laoreet gravida. Quisque pretium sagittis dignissim. Curabitur consequat eget purus et sollicitudin. Vivamus hendrerit sodales egestas. Ut pretium dui id erat interdum bibendum. Nulla vitae ligula in sem congue pulvinar id in libero.

209 |

Donec efficitur sollicitudin pulvinar. Sed quis diam a nibh scelerisque luctus. Aenean varius ullamcorper vulputate. Pellentesque facilisis rutrum lacus, ut bibendum magna dignissim non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse porttitor mauris quis rhoncus blandit. Aliquam ac imperdiet risus. Vestibulum imperdiet dolor eu tortor consectetur sollicitudin. Maecenas malesuada accumsan volutpat. Quisque et elementum ligula.

210 |

Nullam augue odio, facilisis in enim id, tincidunt dapibus metus. Quisque sed faucibus ex. Suspendisse lacus libero, porta sed metus vel, tempor mattis magna. Vivamus vulputate mi vel purus fringilla ultricies. Fusce vitae consequat odio, eu porttitor nulla. Nunc nec maximus massa. Praesent porttitor porta dignissim. Nunc lacinia tempus convallis.

211 |

Nunc at metus eleifend, luctus ligula eu, vehicula leo. Fusce ultrices dui at ante laoreet auctor. Fusce non augue vel erat ultrices tristique a et sem. Pellentesque at elementum est. Quisque consectetur commodo metus, non molestie felis gravida a. Nam molestie feugiat aliquet. Pellentesque augue odio, tristique id arcu ac, rhoncus dapibus quam. Integer congue a lectus at congue. Donec accumsan elementum tempor. Praesent auctor bibendum ipsum quis ultricies. Pellentesque congue malesuada ligula, id mattis turpis ullamcorper pulvinar. Cras mi tellus, porttitor eu mauris eget, elementum dapibus nulla.

212 |

Misc

213 |

DateTime.UtcNow

214 |

The current UTC date-time is:

215 | 05/02/2018 12:32:52
216 | 217 | 218 | 219 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/Example output/output.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/macaba/Markdig.Extensions.ScriptCs/5f4cdec0311088076d874117e25a7fe4f8717788/Markdig.Extensions.ScriptCs.ConsoleApp/Example output/output.pdf -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/Example output/style.css: -------------------------------------------------------------------------------- 1 | /* Page Breaks */ 2 | 3 | /***Always insert a page break before the element***/ 4 | .pb_before { 5 | page-break-before: always !important; 6 | } 7 | 8 | /***Always insert a page break after the element***/ 9 | .pb_after { 10 | page-break-after: always !important; 11 | } 12 | 13 | /***Avoid page break before the element (if possible)***/ 14 | .pb_before_avoid { 15 | page-break-before: avoid !important; 16 | } 17 | 18 | /***Avoid page break after the element (if possible)***/ 19 | .pb_after_avoid { 20 | page-break-after: avoid !important; 21 | } 22 | 23 | /* Avoid page break inside the element (if possible) */ 24 | .pbi_avoid { 25 | page-break-inside: avoid !important; 26 | } 27 | 28 | h1, 29 | h2, 30 | h3 { 31 | border-bottom: 2px solid #e8e8e8; 32 | margin-bottom: 1.15rem; 33 | padding-bottom: .5rem; 34 | text-align: center; 35 | } 36 | 37 | pre { 38 | white-space: pre-wrap; /* css-3 */ 39 | white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ 40 | white-space: -pre-wrap; /* Opera 4-6 */ 41 | white-space: -o-pre-wrap; /* Opera 7 */ 42 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 43 | overflow: hidden; 44 | } -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/Markdig.Extensions.ScriptCs.ConsoleApp.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {14454E3C-BDBE-418C-A60B-C05DF882D85C} 8 | Exe 9 | Properties 10 | Markdig.Extensions.ScriptCs.ConsoleApp 11 | Markdig.Extensions.ScriptCs.ConsoleApp 12 | v4.6.2 13 | 512 14 | true 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | 37 | ..\packages\ColorCode.Portable.1.0.3\lib\portable45-net45+win8+wp8+wpa81\ColorCode.dll 38 | True 39 | 40 | 41 | ..\packages\Markdig.0.14.9\lib\net40\Markdig.dll 42 | True 43 | 44 | 45 | ..\packages\Markdig.SyntaxHighlighting.1.1.5\lib\portable45-net45+win8+wp8+wpa81\Markdig.SyntaxHighlighting.dll 46 | True 47 | 48 | 49 | ..\packages\OxyPlot.Core.1.0.0\lib\net45\OxyPlot.dll 50 | True 51 | 52 | 53 | 54 | 55 | 56 | ..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll 57 | True 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | Always 75 | 76 | 77 | Always 78 | 79 | 80 | 81 | 82 | 83 | {427f33e4-28a8-46db-96a1-5cc3028a5321} 84 | Markdig.Extensions.ScriptCs 85 | 86 | 87 | 88 | 89 | Always 90 | 91 | 92 | Always 93 | 94 | 95 | 96 | 103 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/Oxyplot.csx: -------------------------------------------------------------------------------- 1 | #r OxyPlot.dll 2 | #r System.Runtime.dll 3 | using OxyPlot; 4 | using OxyPlot.Series; 5 | 6 | public void RenderChart() 7 | { 8 | var myModel = new PlotModel { Title = "Example 1" }; 9 | myModel.Series.Add(new FunctionSeries(Math.Cos, 0, 10, 0.1, "cos(x)")); 10 | var exporter = new SvgExporter { Width = 800, Height = 400 }; 11 | MarkdownDocument.Instance.InsertHtml(exporter.ExportToString(myModel)); 12 | } -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using OxyPlot; 7 | 8 | using Markdig; 9 | using Markdig.Extensions.ScriptCs; 10 | using Markdig.SyntaxHighlighting; 11 | 12 | namespace Markdig.Extensions.ScriptCs.ConsoleApp 13 | { 14 | class Program 15 | { 16 | static void Main(string[] args) 17 | { 18 | string markdownText = System.IO.File.ReadAllText("input.md"); 19 | var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().UseSyntaxHighlighting().UseScriptCs(new ScriptCsOptions() { ExceptionStackTrace = false }).Build(); 20 | string html = Markdown.ToHtml(markdownText, pipeline); 21 | System.IO.File.WriteAllText("output.htm", StringConstants.Header + html + StringConstants.Footer); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Markdig.Extensions.ScriptCs.ConsoleApp")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Markdig.Extensions.ScriptCs.ConsoleApp")] 13 | [assembly: AssemblyCopyright("Copyright © 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("14454e3c-bdbe-418c-a60b-c05df882d85c")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/StringConstants.cs: -------------------------------------------------------------------------------- 1 | namespace Markdig.Extensions.ScriptCs.ConsoleApp 2 | { 3 | public static class StringConstants 4 | { 5 | public static string Header { get { return @" 6 | 7 | 8 | 9 | Proof of concept 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 20 |
"; } } 21 | 22 | public static string Footer { get { return @"
23 | 24 | 25 | 26 | "; } } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/input.md: -------------------------------------------------------------------------------- 1 | # Report 2 | 3 | ## Prerequisites 4 | 5 | Instantiate the Markdig.Extensions.ScriptCs into the scripting runtime: 6 | 7 | ````C# 8 | ```ScriptCs 9 | #r Markdig.Extensions.ScriptCs.dll 10 | using Markdig.Extensions.ScriptCs; 11 | ``` 12 | ```` 13 | 14 | This only needs to be done once in your document. 15 | 16 | ```ScriptCs 17 | #r Markdig.Extensions.ScriptCs.dll 18 | using Markdig.Extensions.ScriptCs; 19 | ``` 20 | 21 | ## Html {.pb_before} 22 | This generates some simple HTML from ScriptCs 23 | 24 | #### Code 25 | ```C# 26 | MarkdownDocument.Instance.InsertHtml("

Hello World!

"); 27 | ``` 28 | 29 | #### Output 30 | ```ScriptCs 31 | MarkdownDocument.Instance.InsertHtml("

Hello World!

"); 32 | ``` 33 | 34 | ## Markdown {.pb_before} 35 | This generates some simple Markdown from ScriptCs (which is then processed into HTML) 36 | 37 | #### Code 38 | ```C# 39 | MarkdownDocument.Instance.InsertMarkdown("Hello World!"); 40 | ``` 41 | 42 | #### Output 43 | ```ScriptCs 44 | MarkdownDocument.Instance.InsertMarkdown("Hello World!"); 45 | ``` 46 | 47 | ## Inline {.pb_before} 48 | This uses inline code tags to generate some markdown. 49 | 50 | #### Code 51 | ``` 52 | This is some `ScriptCs MarkdownDocument.Instance.InsertMarkdown("_italic_");` text. 53 | ``` 54 | 55 | #### Output 56 | This is some `ScriptCs MarkdownDocument.Instance.InsertMarkdown("_italic_");` text. 57 | 58 | #### Code 59 | ``` 60 | This is some `ScriptCs MarkdownDocument.Instance.InsertHtml("italic");` text. 61 | ``` 62 | 63 | #### Output 64 | This is some `ScriptCs MarkdownDocument.Instance.InsertHtml("italic");` text. 65 | 66 | ## Exception Handling {.pb_before} 67 | This generates a ScriptCs exception by using invalid code. 68 | 69 | #### Code 70 | ```C# 71 | var fakeModel = new FakeModel { Title = "Test" }; 72 | ``` 73 | 74 | #### Output 75 | ```ScriptCs 76 | var fakeModel = new FakeModel { Title = "Test" }; 77 | ``` 78 | 79 | This generates an exception by referring to a missing DLL. 80 | 81 | #### Code 82 | ```C# 83 | #r Missing.dll 84 | MarkdownDocument.Instance.InsertMarkdown("This code block will not complete, but subsequent ones will."); 85 | ``` 86 | 87 | #### Output 88 | ```ScriptCs 89 | #r Missing.dll 90 | MarkdownDocument.Instance.InsertMarkdown("This code block will not complete, but subsequent ones will."); 91 | ``` 92 | 93 | ## Bootstrap Layout {.pb_before} 94 | 95 | #### Simple content 96 | ::::{.row} 97 | :::{.col-md-4} 98 | Left{.text-center} 99 | ::: 100 | :::{.col-md-4} 101 | Middle{.text-center} 102 | ::: 103 | :::{.col-md-4} 104 | Right{.text-center} 105 | ::: 106 | :::: 107 | 108 | #### Content from ScriptCs 109 | ::::{.row} 110 | :::{.col-md-6} 111 | ```ScriptCs 112 | MarkdownDocument.Instance.InsertMarkdown("Left half{.text-center}"); 113 | ``` 114 | ::: 115 | :::{.col-md-6} 116 | ```ScriptCs 117 | MarkdownDocument.Instance.InsertMarkdown("Right half{.text-center}"); 118 | ``` 119 | ::: 120 | :::: 121 | 122 | ## OxyPlot {.pb_before} 123 | 124 | #### Code 125 | ```C# 126 | #r OxyPlot.dll 127 | #r System.Runtime.dll 128 | using OxyPlot; 129 | using OxyPlot.Series; 130 | var myModel = new PlotModel { Title = "Example 1" }; 131 | myModel.Series.Add(new FunctionSeries(Math.Cos, 0, 10, 0.1, "cos(x)")); 132 | var exporter = new SvgExporter { Width = 800, Height = 400 }; 133 | MarkdownDocument.Instance.InsertHtml(exporter.ExportToString(myModel)); 134 | ``` 135 | 136 | #### Output 137 | ```ScriptCs 138 | #r OxyPlot.dll 139 | #r System.Runtime.dll 140 | using OxyPlot; 141 | using OxyPlot.Series; 142 | var myModel = new PlotModel { Title = "Example 1" }; 143 | myModel.Series.Add(new FunctionSeries(Math.Cos, 0, 10, 0.1, "cos(x)")); 144 | var exporter = new SvgExporter { Width = 800, Height = 400 }; 145 | MarkdownDocument.Instance.InsertHtml(exporter.ExportToString(myModel)); 146 | ``` 147 | 148 | ```ScriptCs 149 | #load OxyPlot.csx 150 | RenderChart(); 151 | ``` 152 | 153 | ## Ipsum Lorem {.pb_before} 154 | 155 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae fermentum dui. Morbi eu scelerisque ligula. Vivamus placerat erat urna, nec dictum lacus varius eu. Ut eu enim quis elit tempor congue quis eu tortor. Duis sed finibus erat. Curabitur venenatis, est quis consectetur porta, eros lacus gravida augue, vitae consequat nibh dui ut urna. Cras at orci quis felis congue volutpat non in mauris. Donec posuere risus felis, et egestas sapien ultrices in. Aliquam elementum imperdiet est, ullamcorper fermentum mauris imperdiet ornare. 156 | 157 | Phasellus erat ex, egestas faucibus tellus vel, volutpat feugiat est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce ornare metus ut risus viverra, ut vulputate nisl ullamcorper. Pellentesque auctor volutpat dictum. Sed vel justo massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce consectetur sit amet est quis aliquam. Cras fermentum blandit justo, sed sagittis felis pharetra at. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque id felis est. Curabitur ac massa at arcu laoreet gravida. Quisque pretium sagittis dignissim. Curabitur consequat eget purus et sollicitudin. Vivamus hendrerit sodales egestas. Ut pretium dui id erat interdum bibendum. Nulla vitae ligula in sem congue pulvinar id in libero. 158 | 159 | Donec efficitur sollicitudin pulvinar. Sed quis diam a nibh scelerisque luctus. Aenean varius ullamcorper vulputate. Pellentesque facilisis rutrum lacus, ut bibendum magna dignissim non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse porttitor mauris quis rhoncus blandit. Aliquam ac imperdiet risus. Vestibulum imperdiet dolor eu tortor consectetur sollicitudin. Maecenas malesuada accumsan volutpat. Quisque et elementum ligula. 160 | 161 | Nullam augue odio, facilisis in enim id, tincidunt dapibus metus. Quisque sed faucibus ex. Suspendisse lacus libero, porta sed metus vel, tempor mattis magna. Vivamus vulputate mi vel purus fringilla ultricies. Fusce vitae consequat odio, eu porttitor nulla. Nunc nec maximus massa. Praesent porttitor porta dignissim. Nunc lacinia tempus convallis. 162 | 163 | Nunc at metus eleifend, luctus ligula eu, vehicula leo. Fusce ultrices dui at ante laoreet auctor. Fusce non augue vel erat ultrices tristique a et sem. Pellentesque at elementum est. Quisque consectetur commodo metus, non molestie felis gravida a. Nam molestie feugiat aliquet. Pellentesque augue odio, tristique id arcu ac, rhoncus dapibus quam. Integer congue a lectus at congue. Donec accumsan elementum tempor. Praesent auctor bibendum ipsum quis ultricies. Pellentesque congue malesuada ligula, id mattis turpis ullamcorper pulvinar. Cras mi tellus, porttitor eu mauris eget, elementum dapibus nulla. 164 | 165 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae fermentum dui. Morbi eu scelerisque ligula. Vivamus placerat erat urna, nec dictum lacus varius eu. Ut eu enim quis elit tempor congue quis eu tortor. Duis sed finibus erat. Curabitur venenatis, est quis consectetur porta, eros lacus gravida augue, vitae consequat nibh dui ut urna. Cras at orci quis felis congue volutpat non in mauris. Donec posuere risus felis, et egestas sapien ultrices in. Aliquam elementum imperdiet est, ullamcorper fermentum mauris imperdiet ornare. 166 | 167 | Phasellus erat ex, egestas faucibus tellus vel, volutpat feugiat est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce ornare metus ut risus viverra, ut vulputate nisl ullamcorper. Pellentesque auctor volutpat dictum. Sed vel justo massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce consectetur sit amet est quis aliquam. Cras fermentum blandit justo, sed sagittis felis pharetra at. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque id felis est. Curabitur ac massa at arcu laoreet gravida. Quisque pretium sagittis dignissim. Curabitur consequat eget purus et sollicitudin. Vivamus hendrerit sodales egestas. Ut pretium dui id erat interdum bibendum. Nulla vitae ligula in sem congue pulvinar id in libero. 168 | 169 | Donec efficitur sollicitudin pulvinar. Sed quis diam a nibh scelerisque luctus. Aenean varius ullamcorper vulputate. Pellentesque facilisis rutrum lacus, ut bibendum magna dignissim non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse porttitor mauris quis rhoncus blandit. Aliquam ac imperdiet risus. Vestibulum imperdiet dolor eu tortor consectetur sollicitudin. Maecenas malesuada accumsan volutpat. Quisque et elementum ligula. 170 | 171 | Nullam augue odio, facilisis in enim id, tincidunt dapibus metus. Quisque sed faucibus ex. Suspendisse lacus libero, porta sed metus vel, tempor mattis magna. Vivamus vulputate mi vel purus fringilla ultricies. Fusce vitae consequat odio, eu porttitor nulla. Nunc nec maximus massa. Praesent porttitor porta dignissim. Nunc lacinia tempus convallis. 172 | 173 | Nunc at metus eleifend, luctus ligula eu, vehicula leo. Fusce ultrices dui at ante laoreet auctor. Fusce non augue vel erat ultrices tristique a et sem. Pellentesque at elementum est. Quisque consectetur commodo metus, non molestie felis gravida a. Nam molestie feugiat aliquet. Pellentesque augue odio, tristique id arcu ac, rhoncus dapibus quam. Integer congue a lectus at congue. Donec accumsan elementum tempor. Praesent auctor bibendum ipsum quis ultricies. Pellentesque congue malesuada ligula, id mattis turpis ullamcorper pulvinar. Cras mi tellus, porttitor eu mauris eget, elementum dapibus nulla. 174 | 175 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae fermentum dui. Morbi eu scelerisque ligula. Vivamus placerat erat urna, nec dictum lacus varius eu. Ut eu enim quis elit tempor congue quis eu tortor. Duis sed finibus erat. Curabitur venenatis, est quis consectetur porta, eros lacus gravida augue, vitae consequat nibh dui ut urna. Cras at orci quis felis congue volutpat non in mauris. Donec posuere risus felis, et egestas sapien ultrices in. Aliquam elementum imperdiet est, ullamcorper fermentum mauris imperdiet ornare. 176 | 177 | Phasellus erat ex, egestas faucibus tellus vel, volutpat feugiat est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce ornare metus ut risus viverra, ut vulputate nisl ullamcorper. Pellentesque auctor volutpat dictum. Sed vel justo massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce consectetur sit amet est quis aliquam. Cras fermentum blandit justo, sed sagittis felis pharetra at. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque id felis est. Curabitur ac massa at arcu laoreet gravida. Quisque pretium sagittis dignissim. Curabitur consequat eget purus et sollicitudin. Vivamus hendrerit sodales egestas. Ut pretium dui id erat interdum bibendum. Nulla vitae ligula in sem congue pulvinar id in libero. 178 | 179 | Donec efficitur sollicitudin pulvinar. Sed quis diam a nibh scelerisque luctus. Aenean varius ullamcorper vulputate. Pellentesque facilisis rutrum lacus, ut bibendum magna dignissim non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse porttitor mauris quis rhoncus blandit. Aliquam ac imperdiet risus. Vestibulum imperdiet dolor eu tortor consectetur sollicitudin. Maecenas malesuada accumsan volutpat. Quisque et elementum ligula. 180 | 181 | Nullam augue odio, facilisis in enim id, tincidunt dapibus metus. Quisque sed faucibus ex. Suspendisse lacus libero, porta sed metus vel, tempor mattis magna. Vivamus vulputate mi vel purus fringilla ultricies. Fusce vitae consequat odio, eu porttitor nulla. Nunc nec maximus massa. Praesent porttitor porta dignissim. Nunc lacinia tempus convallis. 182 | 183 | Nunc at metus eleifend, luctus ligula eu, vehicula leo. Fusce ultrices dui at ante laoreet auctor. Fusce non augue vel erat ultrices tristique a et sem. Pellentesque at elementum est. Quisque consectetur commodo metus, non molestie felis gravida a. Nam molestie feugiat aliquet. Pellentesque augue odio, tristique id arcu ac, rhoncus dapibus quam. Integer congue a lectus at congue. Donec accumsan elementum tempor. Praesent auctor bibendum ipsum quis ultricies. Pellentesque congue malesuada ligula, id mattis turpis ullamcorper pulvinar. Cras mi tellus, porttitor eu mauris eget, elementum dapibus nulla. 184 | 185 | ## Misc {.pb_before} 186 | 187 | #### DateTime.UtcNow 188 | The current UTC date-time is: 189 | ```ScriptCs 190 | MarkdownDocument.Instance.InsertHtml(DateTime.UtcNow.ToString()); 191 | ``` -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/modest.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | *, 3 | *:before, 4 | *:after { 5 | background: transparent !important; 6 | color: #000 !important; 7 | box-shadow: none !important; 8 | text-shadow: none !important; 9 | } 10 | 11 | a, 12 | a:visited { 13 | text-decoration: underline; 14 | } 15 | 16 | a[href]:after { 17 | content: " (" attr(href) ")"; 18 | } 19 | 20 | abbr[title]:after { 21 | content: " (" attr(title) ")"; 22 | } 23 | 24 | a[href^="#"]:after, 25 | a[href^="javascript:"]:after { 26 | content: ""; 27 | } 28 | 29 | pre, 30 | blockquote { 31 | border: 1px solid #999; 32 | page-break-inside: avoid; 33 | } 34 | 35 | thead { 36 | display: table-header-group; 37 | } 38 | 39 | tr, 40 | img { 41 | page-break-inside: avoid; 42 | } 43 | 44 | img { 45 | max-width: 100% !important; 46 | } 47 | 48 | p, 49 | h2, 50 | h3 { 51 | orphans: 3; 52 | widows: 3; 53 | } 54 | 55 | h2, 56 | h3 { 57 | page-break-after: avoid; 58 | } 59 | } 60 | 61 | pre, 62 | code { 63 | font-family: Menlo, Monaco, "Courier New", monospace; 64 | } 65 | 66 | pre { 67 | padding: .5rem; 68 | line-height: 1.25; 69 | overflow-x: scroll; 70 | } 71 | 72 | a, 73 | a:visited { 74 | color: #3498db; 75 | } 76 | 77 | a:hover, 78 | a:focus, 79 | a:active { 80 | color: #2980b9; 81 | } 82 | 83 | .modest-no-decoration { 84 | text-decoration: none; 85 | } 86 | 87 | html { 88 | font-size: 12px; 89 | } 90 | 91 | @media screen and (min-width: 32rem) and (max-width: 48rem) { 92 | html { 93 | font-size: 15px; 94 | } 95 | } 96 | 97 | @media screen and (min-width: 48rem) { 98 | html { 99 | font-size: 16px; 100 | } 101 | } 102 | 103 | body { 104 | line-height: 1.85; 105 | } 106 | 107 | p, 108 | .modest-p { 109 | font-size: 1rem; 110 | margin-bottom: 1.3rem; 111 | } 112 | 113 | h1, 114 | .modest-h1, 115 | h2, 116 | .modest-h2, 117 | h3, 118 | .modest-h3, 119 | h4, 120 | .modest-h4 { 121 | margin: 1.414rem 0 .5rem; 122 | font-weight: inherit; 123 | line-height: 1.42; 124 | } 125 | 126 | h1, 127 | .modest-h1 { 128 | margin-top: 0; 129 | font-size: 3.998rem; 130 | } 131 | 132 | h2, 133 | .modest-h2 { 134 | font-size: 2.827rem; 135 | } 136 | 137 | h3, 138 | .modest-h3 { 139 | font-size: 1.999rem; 140 | } 141 | 142 | h4, 143 | .modest-h4 { 144 | font-size: 1.414rem; 145 | } 146 | 147 | h5, 148 | .modest-h5 { 149 | font-size: 1.121rem; 150 | } 151 | 152 | h6, 153 | .modest-h6 { 154 | font-size: .88rem; 155 | } 156 | 157 | small, 158 | .modest-small { 159 | font-size: .707em; 160 | } 161 | 162 | /* https://github.com/mrmrs/fluidity */ 163 | 164 | img, 165 | canvas, 166 | iframe, 167 | video, 168 | svg, 169 | select, 170 | textarea { 171 | max-width: 100%; 172 | } 173 | 174 | @import url(http://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,300italic,700); 175 | 176 | @import url(http://fonts.googleapis.com/css?family=Arimo:700,700italic); 177 | 178 | html { 179 | font-size: 18px; 180 | max-width: 100%; 181 | } 182 | 183 | body { 184 | color: #444; 185 | font-family: 'Open Sans Condensed', sans-serif; 186 | font-weight: 300; 187 | margin: 0 auto; 188 | max-width: 48rem; 189 | line-height: 1.45; 190 | padding: .25rem; 191 | } 192 | 193 | h1, 194 | h2, 195 | h3, 196 | h4, 197 | h5, 198 | h6 { 199 | font-family: Arimo, Helvetica, sans-serif; 200 | } 201 | 202 | h1, 203 | h2, 204 | h3 { 205 | border-bottom: 2px solid #fafafa; 206 | margin-bottom: 1.15rem; 207 | padding-bottom: .5rem; 208 | text-align: center; 209 | } 210 | 211 | blockquote { 212 | border-left: 8px solid #fafafa; 213 | padding: 1rem; 214 | } 215 | 216 | pre, 217 | code { 218 | background-color: #fafafa; 219 | } -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.ConsoleApp/style.css: -------------------------------------------------------------------------------- 1 | /* Page Breaks */ 2 | 3 | /***Always insert a page break before the element***/ 4 | .pb_before { 5 | page-break-before: always !important; 6 | } 7 | 8 | /***Always insert a page break after the element***/ 9 | .pb_after { 10 | page-break-after: always !important; 11 | } 12 | 13 | /***Avoid page break before the element (if possible)***/ 14 | .pb_before_avoid { 15 | page-break-before: avoid !important; 16 | } 17 | 18 | /***Avoid page break after the element (if possible)***/ 19 | .pb_after_avoid { 20 | page-break-after: avoid !important; 21 | } 22 | 23 | /* Avoid page break inside the element (if possible) */ 24 | .pbi_avoid { 25 | page-break-inside: avoid !important; 26 | } 27 | 28 | h1, 29 | h2, 30 | h3 { 31 | border-bottom: 2px solid #e8e8e8; 32 | margin-bottom: 1.15rem; 33 | padding-bottom: .5rem; 34 | text-align: center; 35 | } 36 | 37 | pre { 38 | white-space: pre-wrap; /* css-3 */ 39 | white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ 40 | white-space: -pre-wrap; /* Opera 4-6 */ 41 | white-space: -o-pre-wrap; /* Opera 7 */ 42 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 43 | overflow: hidden; 44 | } -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.24720.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Markdig.Extensions.ScriptCs", "Markdig.Extensions.ScriptCs\Markdig.Extensions.ScriptCs.csproj", "{427F33E4-28A8-46DB-96A1-5CC3028A5321}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Markdig.Extensions.ScriptCs.ConsoleApp", "Markdig.Extensions.ScriptCs.ConsoleApp\Markdig.Extensions.ScriptCs.ConsoleApp.csproj", "{14454E3C-BDBE-418C-A60B-C05DF882D85C}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {427F33E4-28A8-46DB-96A1-5CC3028A5321}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {427F33E4-28A8-46DB-96A1-5CC3028A5321}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {427F33E4-28A8-46DB-96A1-5CC3028A5321}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {427F33E4-28A8-46DB-96A1-5CC3028A5321}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {14454E3C-BDBE-418C-A60B-C05DF882D85C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {14454E3C-BDBE-418C-A60B-C05DF882D85C}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {14454E3C-BDBE-418C-A60B-C05DF882D85C}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {14454E3C-BDBE-418C-A60B-C05DF882D85C}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/Markdig.Extensions.ScriptCs.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {427F33E4-28A8-46DB-96A1-5CC3028A5321} 8 | Library 9 | Properties 10 | Markdig.Extensions.ScriptCs 11 | Markdig.Extensions.ScriptCs 12 | v4.6.2 13 | 512 14 | 15 | 16 | true 17 | full 18 | false 19 | bin\Debug\ 20 | DEBUG;TRACE 21 | prompt 22 | 4 23 | 24 | 25 | pdbonly 26 | true 27 | bin\Release\ 28 | TRACE 29 | prompt 30 | 4 31 | 32 | 33 | 34 | ..\packages\Autofac.3.3.1\lib\net40\Autofac.dll 35 | True 36 | 37 | 38 | ..\packages\Autofac.Mef.3.0.3\lib\net40\Autofac.Integration.Mef.dll 39 | True 40 | 41 | 42 | ..\packages\Markdig.0.14.9\lib\net40\Markdig.dll 43 | True 44 | 45 | 46 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\Microsoft.CodeAnalysis.dll 47 | True 48 | 49 | 50 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll 51 | True 52 | 53 | 54 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Desktop.dll 55 | True 56 | 57 | 58 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\Microsoft.CodeAnalysis.Desktop.dll 59 | True 60 | 61 | 62 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\Microsoft.CodeAnalysis.Scripting.dll 63 | True 64 | 65 | 66 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\Microsoft.CodeAnalysis.Scripting.CSharp.dll 67 | True 68 | 69 | 70 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\Microsoft.CodeAnalysis.Scripting.VisualBasic.dll 71 | True 72 | 73 | 74 | ..\packages\Microsoft.Web.Xdt.2.1.1\lib\net40\Microsoft.Web.XmlTransform.dll 75 | True 76 | 77 | 78 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll 79 | True 80 | 81 | 82 | ..\packages\NuGet.Core.2.14.0\lib\net40-Client\NuGet.Core.dll 83 | True 84 | 85 | 86 | ..\packages\ScriptCs.Contracts.0.17.1\lib\net45\ScriptCs.Contracts.dll 87 | True 88 | 89 | 90 | ..\packages\ScriptCs.Core.0.17.1\lib\net45\ScriptCs.Core.dll 91 | True 92 | 93 | 94 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\ScriptCs.Engine.Roslyn.dll 95 | True 96 | 97 | 98 | ..\packages\ScriptCs.Hosting.0.17.1\lib\net45\ScriptCs.Hosting.dll 99 | True 100 | 101 | 102 | 103 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\System.Collections.Immutable.dll 104 | True 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | ..\packages\ScriptCs.Engine.Roslyn.0.17.1\lib\net45\System.Reflection.Metadata.dll 113 | True 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 148 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/MarkdownDocument.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace Markdig.Extensions.ScriptCs 8 | { 9 | public class HtmlReportObject 10 | { 11 | public string Html { get; set; } 12 | } 13 | 14 | public class MarkdownReportObject 15 | { 16 | public string Markdown { get; set; } 17 | } 18 | 19 | public class MarkdownDocument 20 | { 21 | private static readonly Lazy lazy = new Lazy(() => new MarkdownDocument()); 22 | 23 | public static MarkdownDocument Instance { get { return lazy.Value; } } 24 | 25 | private MarkdownDocument() { } 26 | 27 | public object ReportObject { get; private set; } 28 | 29 | public void InsertHtml(string html) 30 | { 31 | ReportObject = new HtmlReportObject() { Html = html }; 32 | } 33 | 34 | public void InsertMarkdown(string markdown) 35 | { 36 | ReportObject = new MarkdownReportObject() { Markdown = markdown }; 37 | } 38 | 39 | public void Reset() 40 | { 41 | ReportObject = null; 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Markdig.Extensions.ScriptCs")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Markdig.Extensions.ScriptCs")] 13 | [assembly: AssemblyCopyright("Copyright © 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("427f33e4-28a8-46db-96a1-5cc3028a5321")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsBlock.cs: -------------------------------------------------------------------------------- 1 | using Markdig.Parsers; 2 | using Markdig.Syntax; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | 9 | namespace Markdig.Extensions.ScriptCs 10 | { 11 | public class ScriptCsBlock : FencedCodeBlock 12 | { 13 | public ScriptCsBlock(BlockParser parser) : base(parser) 14 | { 15 | } 16 | 17 | public string GetScript() 18 | { 19 | if (Lines.Count > 0) 20 | { 21 | return string.Join(Environment.NewLine, Lines); 22 | } 23 | else 24 | return ""; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsBlockParser.cs: -------------------------------------------------------------------------------- 1 | using Markdig.Helpers; 2 | using Markdig.Parsers; 3 | using Markdig.Syntax; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace Markdig.Extensions.ScriptCs 11 | { 12 | public class ScriptCsBlockParser : FencedBlockParserBase 13 | { 14 | public ScriptCsBlockParser() 15 | { 16 | OpeningCharacters = new[] { '`' }; 17 | InfoPrefix = "ScriptCs"; 18 | InfoParser = ScriptCsInfoParser; 19 | } 20 | 21 | protected override ScriptCsBlock CreateFencedBlock(BlockProcessor processor) 22 | { 23 | var block = new ScriptCsBlock(this); 24 | return block; 25 | } 26 | 27 | public static bool ScriptCsInfoParser(BlockProcessor state, ref StringSlice line, IFencedBlock fenced) 28 | { 29 | string infoString; 30 | string argString = null; 31 | 32 | var c = line.CurrentChar; 33 | // An info string cannot contain any backsticks 34 | int firstSpace = -1; 35 | for (int i = line.Start; i <= line.End; i++) 36 | { 37 | c = line.Text[i]; 38 | if (c == '`') 39 | { 40 | return false; 41 | } 42 | 43 | if (firstSpace < 0 && c.IsSpaceOrTab()) 44 | { 45 | firstSpace = i; 46 | } 47 | } 48 | 49 | if (firstSpace > 0) 50 | { 51 | infoString = line.Text.Substring(line.Start, firstSpace - line.Start).Trim(); 52 | 53 | // Skip any spaces after info string 54 | firstSpace++; 55 | while (true) 56 | { 57 | c = line[firstSpace]; 58 | if (c.IsSpaceOrTab()) 59 | { 60 | firstSpace++; 61 | } 62 | else 63 | { 64 | break; 65 | } 66 | } 67 | 68 | argString = line.Text.Substring(firstSpace, line.End - firstSpace + 1).Trim(); 69 | } 70 | else 71 | { 72 | infoString = line.ToString().Trim(); 73 | } 74 | 75 | if (infoString != "ScriptCs") 76 | return false; 77 | 78 | fenced.Info = HtmlHelper.Unescape(infoString); 79 | fenced.Arguments = HtmlHelper.Unescape(argString); 80 | 81 | return true; 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsBlockRenderer.cs: -------------------------------------------------------------------------------- 1 | using Markdig.Renderers; 2 | using Markdig.Renderers.Html; 3 | using Markdig.Syntax; 4 | using ScriptCs; 5 | using System; 6 | using System.Collections.Generic; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | 11 | namespace Markdig.Extensions.ScriptCs 12 | { 13 | public class ScriptCsBlockRenderer : HtmlObjectRenderer 14 | { 15 | private ScriptCsRenderer scriptCsRenderer; 16 | 17 | public ScriptCsBlockRenderer(ScriptExecutor scriptExecutor, MarkdownPipeline pipeline, ScriptCsOptions options) 18 | { 19 | scriptCsRenderer = new ScriptCsRenderer(scriptExecutor, pipeline, options); 20 | } 21 | 22 | protected override void Write(HtmlRenderer renderer, ScriptCsBlock obj) 23 | { 24 | scriptCsRenderer.Write(renderer, obj.GetScript(), false); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsExtension.cs: -------------------------------------------------------------------------------- 1 | using Markdig; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using Markdig.Renderers; 8 | using Markdig.Syntax; 9 | using Markdig.Renderers.Html; 10 | 11 | using ScriptCs; 12 | using ScriptCs.Contracts; 13 | using ScriptCs.Hosting; 14 | //using ScriptCs.Engine.Mono; 15 | using ScriptCs.Engine.Roslyn; 16 | using Markdig.Parsers; 17 | using Markdig.Helpers; 18 | using Markdig.Extensions.GenericAttributes; 19 | 20 | namespace Markdig.Extensions.ScriptCs 21 | { 22 | public class ScriptCsExtension : IMarkdownExtension 23 | { 24 | private readonly ScriptCsOptions options; 25 | private readonly ScriptServices scriptServices; 26 | private readonly ScriptExecutor scriptExecutor; 27 | 28 | public ScriptCsExtension(ScriptCsOptions options) 29 | { 30 | this.options = options; 31 | 32 | var console = (IConsole)new ScriptConsole(); 33 | var logProvider = new ColoredConsoleLogProvider(LogLevel.Info, console); 34 | 35 | var builder = new ScriptServicesBuilder(console, logProvider); 36 | 37 | //var useMono = Type.GetType("Mono.Runtime") != null; 38 | //if (useMono) 39 | //{ 40 | // builder.ScriptEngine(); 41 | //} 42 | //else { 43 | builder.ScriptEngine(); 44 | //} 45 | 46 | scriptServices = builder.Build(); 47 | 48 | scriptExecutor = (ScriptExecutor)scriptServices.Executor; 49 | scriptExecutor.Initialize(Enumerable.Empty(), Enumerable.Empty()); 50 | } 51 | 52 | public void Setup(MarkdownPipelineBuilder pipeline) 53 | { 54 | // Adds the inline parser 55 | if (!pipeline.InlineParsers.Contains()) 56 | { 57 | pipeline.InlineParsers.Insert(0, new ScriptCsInlineParser()); 58 | } 59 | 60 | // Adds the block parser 61 | if (!pipeline.BlockParsers.Contains()) 62 | { 63 | pipeline.BlockParsers.Insert(0, new ScriptCsBlockParser()); 64 | } 65 | } 66 | 67 | public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer) 68 | { 69 | HtmlRenderer htmlRenderer; 70 | ObjectRendererCollection renderers; 71 | 72 | htmlRenderer = renderer as HtmlRenderer; 73 | renderers = htmlRenderer?.ObjectRenderers; 74 | 75 | if (renderers != null && !renderers.Contains()) 76 | { 77 | renderers.Insert(0, new ScriptCsInlineRenderer(scriptExecutor, pipeline, options)); 78 | } 79 | 80 | if (renderers != null && !renderers.Contains()) 81 | { 82 | renderers.Insert(0, new ScriptCsBlockRenderer(scriptExecutor, pipeline, options)); 83 | } 84 | } 85 | } 86 | 87 | /// 88 | /// Add a extension method to add the extension to the pipeline 89 | /// 90 | public static class ScriptCsExtensionFunctions 91 | { 92 | public static MarkdownPipelineBuilder UseScriptCs(this MarkdownPipelineBuilder pipeline, ScriptCsOptions options) 93 | { 94 | if (!pipeline.Extensions.Contains()) 95 | { 96 | pipeline.Extensions.Add(new ScriptCsExtension(options)); 97 | } 98 | return pipeline; 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsInline.cs: -------------------------------------------------------------------------------- 1 | using Markdig.Syntax.Inlines; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace Markdig.Extensions.ScriptCs 9 | { 10 | public class ScriptCsInline : LeafInline 11 | { 12 | public string Script { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsInlineParser.cs: -------------------------------------------------------------------------------- 1 | using Markdig.Helpers; 2 | using Markdig.Parsers; 3 | using Markdig.Syntax; 4 | using Newtonsoft.Json; 5 | using System; 6 | using System.Collections.Generic; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | 11 | namespace Markdig.Extensions.ScriptCs 12 | { 13 | public class ScriptCsInlineParser : InlineParser 14 | { 15 | public ScriptCsInlineParser() 16 | { 17 | OpeningCharacters = "`".ToCharArray(); 18 | } 19 | 20 | 21 | public override bool Match(InlineProcessor processor, ref StringSlice slice) 22 | { 23 | if (slice.PeekCharExtra(1) != 'S' || 24 | slice.PeekCharExtra(2) != 'c' || 25 | slice.PeekCharExtra(3) != 'r' || 26 | slice.PeekCharExtra(4) != 'i' || 27 | slice.PeekCharExtra(5) != 'p' || 28 | slice.PeekCharExtra(6) != 't' || 29 | slice.PeekCharExtra(7) != 'C' || 30 | slice.PeekCharExtra(8) != 's' || 31 | slice.PeekCharExtra(9) != ' ') 32 | { 33 | return false; 34 | } 35 | 36 | var content = String.Empty; 37 | var issue = String.Empty; 38 | char current; 39 | int counter = 1; //Account for the ` 40 | bool loop = true; 41 | 42 | for (int i = 0; i < slice.End && loop; i++) 43 | { 44 | current = slice.NextChar(); 45 | counter++; 46 | 47 | if (current == '`') 48 | { 49 | loop = false; 50 | } 51 | else 52 | { 53 | content += current; 54 | } 55 | } 56 | slice.NextChar(); 57 | counter++; 58 | int line; 59 | int column; 60 | processor.Inline = new ScriptCsInline() { Script = content.Substring(9) }; 61 | processor.Inline.Span = new SourceSpan() { Start = processor.GetSourcePosition(slice.Start, out line, out column) }; 62 | processor.Inline.Line = line; 63 | processor.Inline.Span.End = processor.Inline.Span.Start + counter; 64 | return true; 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsInlineRenderer.cs: -------------------------------------------------------------------------------- 1 | using Markdig.Renderers; 2 | using Markdig.Renderers.Html; 3 | using ScriptCs; 4 | using System; 5 | 6 | namespace Markdig.Extensions.ScriptCs 7 | { 8 | public class ScriptCsInlineRenderer : HtmlObjectRenderer 9 | { 10 | private ScriptCsRenderer scriptCsRenderer; 11 | 12 | public ScriptCsInlineRenderer(ScriptExecutor scriptExecutor, MarkdownPipeline pipeline, ScriptCsOptions options) 13 | { 14 | scriptCsRenderer = new ScriptCsRenderer(scriptExecutor, pipeline, options); 15 | } 16 | 17 | protected override void Write(HtmlRenderer renderer, ScriptCsInline obj) 18 | { 19 | scriptCsRenderer.Write(renderer, obj.Script, true); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsOptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace Markdig.Extensions.ScriptCs 8 | { 9 | public class ScriptCsOptions 10 | { 11 | public bool ExceptionStackTrace { get; set; } 12 | 13 | public ScriptCsOptions() 14 | { 15 | ExceptionStackTrace = true; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/ScriptCsRenderer.cs: -------------------------------------------------------------------------------- 1 | using Markdig.Renderers; 2 | using ScriptCs; 3 | using ScriptCs.Contracts; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | 11 | namespace Markdig.Extensions.ScriptCs 12 | { 13 | public class ScriptCsRenderer 14 | { 15 | private ScriptExecutor scriptExecutor; 16 | private MarkdownPipeline pipeline; 17 | private ScriptCsOptions options; 18 | 19 | public ScriptCsRenderer(ScriptExecutor scriptExecutor, MarkdownPipeline pipeline, ScriptCsOptions options) 20 | { 21 | this.scriptExecutor = scriptExecutor; 22 | this.pipeline = pipeline; 23 | this.options = options; 24 | } 25 | 26 | public void Write(HtmlRenderer renderer, string script, bool inline) 27 | { 28 | if (!string.IsNullOrWhiteSpace(script)) 29 | { 30 | if (renderer.EnableHtmlForInline || !inline) 31 | { 32 | var fullScript = script; 33 | ScriptResult result = null; 34 | try 35 | { 36 | result = scriptExecutor.ExecuteScript(fullScript); 37 | if (result.CompileExceptionInfo != null) 38 | { 39 | renderer.Write(Markdown.ToHtml(BuildMarkdownExceptionMessage(result.CompileExceptionInfo.SourceException, options.ExceptionStackTrace), pipeline)); 40 | } 41 | 42 | if (MarkdownDocument.Instance.ReportObject != null) 43 | { 44 | if (MarkdownDocument.Instance.ReportObject is HtmlReportObject) 45 | { 46 | renderer.Write(((HtmlReportObject)MarkdownDocument.Instance.ReportObject).Html); 47 | } 48 | else if (MarkdownDocument.Instance.ReportObject is MarkdownReportObject) 49 | { 50 | var markdown = Markdown.ToHtml(((MarkdownReportObject)MarkdownDocument.Instance.ReportObject).Markdown, pipeline); 51 | if (inline) 52 | { 53 | if (markdown.StartsWith("

")) 54 | markdown = markdown.Substring(3); 55 | if (markdown.EndsWith("

\n")) 56 | markdown = markdown.Substring(0, markdown.Length - 5); 57 | } 58 | 59 | renderer.Write(markdown); 60 | } 61 | } 62 | MarkdownDocument.Instance.Reset(); 63 | } 64 | catch (Exception ex) 65 | { 66 | renderer.Write(Markdown.ToHtml(BuildMarkdownExceptionMessage(ex, options.ExceptionStackTrace), pipeline)); 67 | } 68 | } 69 | else 70 | { 71 | renderer.Write(script); 72 | } 73 | } 74 | } 75 | 76 | public string BuildMarkdownExceptionMessage(Exception exception, bool stackTrace) 77 | { 78 | string message = "```" + Environment.NewLine + "ScriptCs exception:" + Environment.NewLine + exception.Message; 79 | if (exception is FileNotFoundException) 80 | { 81 | message += " (" + ((FileNotFoundException)exception).FileName + ")"; 82 | } 83 | if (stackTrace) 84 | { 85 | message = message + Environment.NewLine; 86 | message = message + exception.StackTrace; 87 | } 88 | message = message + Environment.NewLine + "```" + Environment.NewLine; 89 | return message; 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/app.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Markdig.Extensions.ScriptCs/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Markdig.Extensions.ScriptCs 2 | 3 | This is an extension for Markdig that allows C# scripting to generate markdown or HTML content. 4 | 5 | ## Prerequisites 6 | 7 | Instantiate Markdig.Extensions.ScriptCs into the scripting runtime: 8 | 9 | ````C# 10 | ```ScriptCs 11 | #r Markdig.Extensions.ScriptCs.dll 12 | using Markdig.Extensions.ScriptCs; 13 | ``` 14 | ```` 15 | 16 | This only needs to be done once in your document. This gives access to `MarkdownDocument.Instance`. 17 | 18 | ## Inline 19 | 20 | ##### Markdown: 21 | 22 | ``` 23 | This is some `ScriptCs MarkdownDocument.Instance.InsertMarkdown("_italic_");` text. 24 | ``` 25 | 26 | ##### Output: 27 | 28 | This is some _italic_ text. 29 | 30 | ##### Markdown: 31 | 32 | ``` 33 | This is some `ScriptCs MarkdownDocument.Instance.InsertHtml("italic");` text. 34 | ``` 35 | 36 | ##### Output: 37 | 38 | This is some _italic_ text. 39 | 40 | ## Code Block 41 | 42 | ##### Markdown: 43 | 44 | ```` 45 | ```ScriptCs 46 | MarkdownDocument.Instance.InsertMarkdown("Hello World!"); 47 | ``` 48 | ```` 49 | 50 | ##### Output: 51 | 52 | Hello World! 53 | 54 | ##### Markdown: 55 | 56 | ```` 57 | ```ScriptCs 58 | MarkdownDocument.Instance.InsertHtml("

Hello World!

"); 59 | ``` 60 | ```` 61 | 62 | ##### Output: 63 | 64 | Hello World! 65 | 66 | ## OxyPlot 67 | 68 | ##### Markdown: 69 | ```` 70 | ```ScriptCs 71 | #r OxyPlot.dll 72 | #r System.Runtime.dll 73 | using OxyPlot; 74 | using OxyPlot.Series; 75 | var myModel = new PlotModel { Title = "Example 1" }; 76 | myModel.Series.Add(new FunctionSeries(Math.Cos, 0, 10, 0.1, "cos(x)")); 77 | var exporter = new SvgExporter { Width = 800, Height = 400 }; 78 | MarkdownDocument.Instance.InsertHtml(exporter.ExportToString(myModel)); 79 | ``` 80 | ```` 81 | 82 | ##### Output: 83 | ![./Images/oxyplot.svg](./Images/oxyplot.svg) 84 | 85 | ## Separation of code from content 86 | 87 | It is possible to separate large amounts of code into `csx` files which can be referenced in the markdown. The `csx` file must be located in the bin directory. 88 | 89 | ##### Markdown: 90 | ```` 91 | ```ScriptCs 92 | #load OxyPlot.csx 93 | RenderChart(); 94 | ``` 95 | ```` 96 | 97 | ##### OxyPlot.csx: 98 | ``` 99 | #r OxyPlot.dll 100 | #r System.Runtime.dll 101 | using OxyPlot; 102 | using OxyPlot.Series; 103 | 104 | public void RenderChart() 105 | { 106 | var myModel = new PlotModel { Title = "Example 1" }; 107 | myModel.Series.Add(new FunctionSeries(Math.Cos, 0, 10, 0.1, "cos(x)")); 108 | var exporter = new SvgExporter { Width = 800, Height = 400 }; 109 | MarkdownDocument.Instance.InsertHtml(exporter.ExportToString(myModel)); 110 | } 111 | ``` 112 | 113 | ## Exception handling 114 | 115 | ##### Markdown: 116 | 117 | ```` 118 | ```ScriptCs 119 | var fakeModel = new FakeModel { Title = "Test" }; 120 | ``` 121 | ```` 122 | 123 | ##### Output: 124 | 125 | ``` 126 | ScriptCs exception: 127 | (1,21): error CS0246: The type or namespace name 'FakeModel' could not be found (are you missing a using directive or an assembly reference?) 128 | ``` 129 | 130 | ## More examples 131 | 132 | This PDF was generated by the Chrome print dialog from the HTML generated by Markdig using input.md as the source. It coincidentally shows the use of CSS to get page breaks in the PDF output. 133 | https://github.com/macaba/Markdig.Extensions.ScriptCs/blob/master/Markdig.Extensions.ScriptCs.ConsoleApp/Example%20output/output.pdf 134 | --------------------------------------------------------------------------------