├── .gitattributes ├── .gitignore ├── Dockerfile ├── README.md ├── files ├── mdstructure │ └── markdown.md └── styles │ └── githubmd.css ├── main.js ├── package-lock.json └── package.json /.gitattributes: -------------------------------------------------------------------------------- 1 | * linguist-vendored 2 | *.js linguist-vendored=false 3 | Dockerfile linguist-vendored=false 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:latest 2 | RUN mkdir server 3 | WORKDIR /server 4 | 5 | COPY main.js /server/ 6 | RUN mkdir files 7 | COPY files /server/files/ 8 | COPY package.json /server/ 9 | COPY package-lock.json /server/ 10 | 11 | RUN npm install 12 | EXPOSE 80 443 13 | CMD npm start 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Markdown Webserver 📄 2 | 3 | A NodeJS Application that transcripts Markdown to HTML, supporting MathJax and with Github CSS Markdown like a style. Serving itself as a server. 4 | 5 | ### What does it do? 🤠 6 | This application serves has a Markdown Viewer. 7 | 8 | It's perfect for publishing fast websites, convert from Markdown to HTML and Custom CSS it or even post a website quickly, based on you application documentation. 9 | 10 | ### How is it build? 🔨 11 | This application is build using NodeJS, Express for easy hosting, ShowdownJS for the easy transcription. Github-markdown-css for the CSS like style, MathJax for Math support, and HighlightJS for code highlighting. 12 | 13 | 14 | [MathJax](https://github.com/mathjax/MathJax) 15 | 16 | [HighlightJS](https://github.com/highlightjs/highlight.js) 17 | 18 | [ExpressJS](https://github.com/expressjs/express) 19 | 20 | [ShowdownJS](https://github.com/showdownjs/showdown) 21 | 22 | [Github-Markdown-CSS](https://github.com/sindresorhus/github-markdown-css) 23 | 24 | ### Installation 📲 25 | 26 | __To install this repository simply:__ 27 | 1. Make sure you have npm (Node Package Manager) 28 | 2. Download the repository. 29 | 30 | `git clone https://github.com/joaoofreitas/markdown-webserver.git` 31 | 32 | 3. Enter to the folder in the terminal 33 | 34 | `cd markdown-webserver` 35 | 36 | 4. Install the dependencies: 37 | 38 | `npm install` 39 | 40 | 5. Run the server 41 | 42 | `npm start` 43 | 44 | 6. Visit the website in your browser in localhost 45 | 46 | ##### All done! 47 | 48 | ### Running your own Markdown 📟 49 | 50 | 1. Place your _.md_ file in _files/mdstructure/_ and rename it has __markdown.md__ . 51 | 2. Run the server with npm start 52 | 53 | > __NOTE:__ Make sure you are inside the repository before running __npm start__. Otherwise you will get an error. 54 | 55 | ### Docker 🐳 56 | 57 | This application has also a Docker image so you can run it and deploy it in a Docker Container. Or even building it with an Nginx Proxy and a Let's Encrypt Proxy Companion. 58 | 59 | For that you just need do build the docker image with docker build inside the program folder. 60 | 61 | __Example:__` 62 | 63 | ` user@localhost ~/markdown--webserver docker build -t .` 64 | 65 | To run the container: 66 | 67 | `docker run -p 80:80 ` 68 | -------------------------------------------------------------------------------- /files/mdstructure/markdown.md: -------------------------------------------------------------------------------- 1 | ## ESP32 Ultra Low Power Mode - Documentation 2 | #### João Freitas 3 | 4 | ### 1. What is ULP? 5 | 6 | ULP or _Ultra Low Power Mode_ is a feature of the ESP32 microcontroller. 7 | It allows the developer to power up the microcontroller with the least power needed for it to do a certain task. 8 | 9 | With it, it's possible to make a battery supplied project last way longer comparing to the regular mode. 10 | 11 | We can call this mode also by deep _sleep mode_. 12 | 13 | ### 2. What can the ESP32 do in _deep sleep_? 14 | 15 | 1. Read and Write pins 16 | 2. Read analog signals from 0 to 3.3V with a resolution of 12-bits (0-4095) 17 | 3. Comunicate via I2C 18 | 4. Wake up the main processor. 19 | 20 | ### 3. How does it work? 21 | 22 | ##### The architecture of the ESP32 23 | 24 | The ESP32 architecture is quite simple. 25 | It's composed by Wi-Fi and Bluetooth Modules for wireless comunication, a Radio that recieves and sends data using those communication interfaces. 26 | The cryptographic hardware acceleration. The embeed flash module. And the importante part here. The main core and memories of the ESP and the RTC and Low Power Subsystem. 27 | ![Architecture](mdstructure/arch.png) 28 | 29 | As you can see, in the _RTC and low-power subsystem_ theres 3 parts. 30 | 1. PMU (Phasor Mesurement Unit) 31 | 2. ULP co-processor 32 | 3. Recovery Memory 33 | 34 | For us to be able to use the _ULP mode_ we need to program this part of the ESP32. 35 | More specificaly the _ULP_ co-processor unit that we will use to control the points specified in the __Chapter 2__ and the 8KB memory that comes along with it. 36 | 37 | > _8KB of memory may not seem a lot, but it's more that enough for what we need._ _An Arduino Uno for example just has 2KB that is 4 times less that this recovery memory._ 38 | 39 | 40 | ### 4. Power Consumption in _Deep Sleep Mode_ 41 | 42 | Here's an example of power consumption used in a _sketch_ that powers up an LED in Active Mode and then goes to deep sleep in a cycle of 1 second each: 43 | 44 | > __Example of fluxogram:__ 45 | 46 | > START --> Turns on the LED with a delay of 1 second --> Turns off the LED and goes to sleep for one second --> RESTARTS 47 | 48 | - Current used by ESP32 during __Active Mode__: 50 mA 49 | - Current used by ESP32 during __Deep Sleep Mode__ : 0.01mA 50 | 51 | 52 | A normal _blink sketch_ in the ESP32 was giving me value of current of: 53 | 54 | > __Example of fluxogram:__ 55 | 56 | > START --> Turns on the LED with a delay of 1 second --> Turns off the LED with a delay of 1 second --> RESTART 57 | 58 | - Current used by ESP32 while the LED was __ON__: 50mA 59 | - Current used by ESP32 while the LED was __OFF__: 11.5mA 60 | 61 | 62 | Let's do an average since the time during both is the same 1 second. 63 | 64 | __Deep Sleep Mode Average Current__ 65 | 66 | $I=\frac{50mA + 0.01mA}{2}=25.0005mA$ 67 | 68 | This would be an average current of 25.0005 mA. 69 | 70 | __Active Mode Average Current__ 71 | 72 | $I=\frac{50mA + 11.5mA}{2}=30.75mA$ 73 | 74 | Comparing _Active Mode_ with the _Deep Sleep Mode_ we conclude that the _Deep Sleep Mode_ is definitly more energy eficient. In this case it may not seem a lot of difference but in a long term it can make the difference of days in battery life. Also this is an average of Half-Time in _Active Mode_ and the other Half in _Deep Sleep_ the difference will get even bigger depending on the time that the device stays in _ULP Mode_. 75 | 76 | __WARNING:__ This is just an Average and this values should not be used as reference. 77 | 78 | > This will depend on the development board aswell, since there's some models that feature more power consumption. 79 | 80 | > This values were taken with and Wemos LoLin without the embeed LED's. 81 | 82 | ### 5. Types of Operations 83 | This Topic is about types of operations with this _Deep Sleep Mode_. 84 | 85 | The subtopics are ordered by the most eficient modes to least eficient modes. 86 | 87 | ##### Sleepwalk Mode 88 | 89 | This mode uses only the Co-Processor to do everything. 90 | 91 | __Obs:__ It is only capable of doing basic tasks (mencioned in __Chapter 2__). 92 | 93 | It consists in running all the code in the _ULP Co-Processor_ and storing all variable data in the _RTC Memory_. Basically the main processor never wakes up. 94 | 95 | __Example:__ Blinking an LED periodically. 96 | 97 | 98 | ##### Sleppy Mode 99 | 100 | This mode uses both the Co-Processor and the main processor periodically. 101 | 102 | It consists in running basic tasks in the _Co-Processor_ and the more complex ones to the main processor. 103 | Basically it alternates between _Deep Sleep_ and Active Mode. 104 | 105 | __Example:__ Fetching an REST API data that contains a temperature info from the web using a __GET__ request. Saving the data in a variable and importing it to the _RTC Memory_, so it turns on an LED or sends an I2C packet to an actuator. 106 | 107 | ### 6. How to Program it? 108 | 109 | Programming the _Co-Processor_ is not a proper easy task. It requires non official librarys and a lack of programming documentation. 110 | 111 | ##### Libraries needed 112 | 113 | The first step is proceed with the instalation of'duff2013' ulptool that is avaliable in his github repository for free. 114 | In this readme file there's every step to install the libraries into your system. 115 | Check his github repository to proceed with the instalation. 116 | 117 | __WARNING:__ This is not a common library has the others since it has some different characteristics. 118 | __Check his documentation for more__ 119 | 120 | https://github.com/duff2013/ulptool 121 | 122 | ##### Files 123 | 124 | In the examples of 'duff2013' you can see that are 3 files instead of a single __.ino__ file. 125 | 126 | - The __.ino__ file is the file that we are going to use to write the code for the main processor of the microcontroller, and also the file we are going to upload. 127 | This file carrys not only his own code but also the _ULP Co-Processor_ code that will be in the __.s__ file. 128 | 129 | - The __.h__ alias _header_ file contains shared variables between the codes for each processor. 130 | 131 | - The __.s__ file is the file that as it's previous mencioned carries the code for the _Co-Processor_. The programming language used is Assembly. 132 | 133 | ###### Observations 134 | 135 | The Assembly file accepts just a certain types of instructions that are following: 136 | 137 | ![Accepted Commands](mdstructure/commands.png) 138 | 139 | ### 7. Examples of Programs 140 | 141 | Here I will print some documentation given by 'duff2013' where theres commented code explaining line by line. 142 | 143 | ##### Code Sample 144 | 145 | __main.ino__ 146 | 147 | ```cpp 148 | #include "esp32/ulp.h" 149 | // include ulp header you will create 150 | #include "ulp_main.h" 151 | // include ulptool binary load function 152 | #include "ulptool.h" 153 | 154 | // Unlike the esp-idf always use these binary blob names 155 | extern const uint8_t ulp_main_bin_start[] asm("_binary_ulp_main_bin_start"); 156 | extern const uint8_t ulp_main_bin_end[] asm("_binary_ulp_main_bin_end"); 157 | 158 | static void init_run_ulp(uint32_t usec); 159 | 160 | void setup() { 161 | Serial.begin(115200); 162 | delay(1000); 163 | init_run_ulp(100 * 1000); // 100 msec 164 | } 165 | 166 | void loop() { 167 | // ulp variables data is the lower 16 bits 168 | Serial.printf("ulp count: %u\n", ulp_count & 0xFFFF); 169 | delay(100); 170 | } 171 | 172 | //hash: 5c389934265d8016df226704091cd30a 173 | static void init_run_ulp(uint32_t usec) { 174 | // initialize ulp variable 175 | ulp_set_wakeup_period(0, usec); 176 | esp_err_t err = ulptool_load_binary(0, ulp_main_bin_start, (ulp_main_bin_end - ulp_main_bin_start) / sizeof(uint32_t)); 177 | 178 | // ulp coprocessor will run on its own now 179 | ulp_count = 0; 180 | err = ulp_run((&ulp_entry - RTC_SLOW_MEM) / sizeof(uint32_t)); 181 | 182 | if (err) Serial.println("Error Starting ULP Coprocessor"); 183 | } 184 | ``` 185 | 186 | __header.h__ 187 | ```cpp 188 | /* 189 | bals here you want visibility 190 | for your sketch. Add "ulp_" to the beginning 191 | of the variable name and must be size 'uint32_t' 192 | */ 193 | #include "Arduino.h" 194 | 195 | extern uint32_t ulp_entry; 196 | extern uint32_t ulp_count; 197 | Put your ULP globals here you want visibility 198 | for your sketch. Add "ulp_" to the beginning 199 | of the variable name and must be size 'uint32_t' 200 | */ 201 | ``` 202 | __ulp.s__ 203 | ```assembly 204 | /* Define variables, which go into .bss section (zero-initialized data) */ 205 | .data 206 | /* Store count value */ 207 | .global count 208 | count: 209 | .long 0 210 | /* Code goes into .text section */ 211 | .text 212 | .global entry 213 | entry: 214 | move r3, count 215 | ld r0, r3, 0 216 | add r0, r0, 1 217 | st r0, r3, 0 218 | halt 219 | ``` 220 | -------------------------------------------------------------------------------- /files/styles/githubmd.css: -------------------------------------------------------------------------------- 1 | .markdown-body .octicon { 2 | display: inline-block; 3 | fill: currentColor; 4 | vertical-align: text-bottom; 5 | } 6 | 7 | .markdown-body .anchor { 8 | float: left; 9 | line-height: 1; 10 | margin-left: -20px; 11 | padding-right: 4px; 12 | } 13 | 14 | .markdown-body .anchor:focus { 15 | outline: none; 16 | } 17 | 18 | .markdown-body h1 .octicon-link, 19 | .markdown-body h2 .octicon-link, 20 | .markdown-body h3 .octicon-link, 21 | .markdown-body h4 .octicon-link, 22 | .markdown-body h5 .octicon-link, 23 | .markdown-body h6 .octicon-link { 24 | color: #1b1f23; 25 | vertical-align: middle; 26 | visibility: hidden; 27 | } 28 | 29 | .markdown-body h1:hover .anchor, 30 | .markdown-body h2:hover .anchor, 31 | .markdown-body h3:hover .anchor, 32 | .markdown-body h4:hover .anchor, 33 | .markdown-body h5:hover .anchor, 34 | .markdown-body h6:hover .anchor { 35 | text-decoration: none; 36 | } 37 | 38 | .markdown-body h1:hover .anchor .octicon-link, 39 | .markdown-body h2:hover .anchor .octicon-link, 40 | .markdown-body h3:hover .anchor .octicon-link, 41 | .markdown-body h4:hover .anchor .octicon-link, 42 | .markdown-body h5:hover .anchor .octicon-link, 43 | .markdown-body h6:hover .anchor .octicon-link { 44 | visibility: visible; 45 | } 46 | 47 | .markdown-body h1:hover .anchor .octicon-link:before, 48 | .markdown-body h2:hover .anchor .octicon-link:before, 49 | .markdown-body h3:hover .anchor .octicon-link:before, 50 | .markdown-body h4:hover .anchor .octicon-link:before, 51 | .markdown-body h5:hover .anchor .octicon-link:before, 52 | .markdown-body h6:hover .anchor .octicon-link:before { 53 | width: 16px; 54 | height: 16px; 55 | content: ' '; 56 | display: inline-block; 57 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath fill-rule='evenodd' d='M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z'%3E%3C/path%3E%3C/svg%3E"); 58 | }.markdown-body { 59 | -ms-text-size-adjust: 100%; 60 | -webkit-text-size-adjust: 100%; 61 | line-height: 1.5; 62 | color: #24292e; 63 | font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji; 64 | font-size: 16px; 65 | line-height: 1.5; 66 | word-wrap: break-word; 67 | } 68 | 69 | .markdown-body details { 70 | display: block; 71 | } 72 | 73 | .markdown-body summary { 74 | display: list-item; 75 | } 76 | 77 | .markdown-body a { 78 | background-color: initial; 79 | } 80 | 81 | .markdown-body a:active, 82 | .markdown-body a:hover { 83 | outline-width: 0; 84 | } 85 | 86 | .markdown-body strong { 87 | font-weight: inherit; 88 | font-weight: bolder; 89 | } 90 | 91 | .markdown-body h1 { 92 | font-size: 2em; 93 | margin: .67em 0; 94 | } 95 | 96 | .markdown-body img { 97 | border-style: none; 98 | } 99 | 100 | .markdown-body code, 101 | .markdown-body kbd, 102 | .markdown-body pre { 103 | font-family: monospace,monospace; 104 | font-size: 1em; 105 | } 106 | 107 | .markdown-body hr { 108 | box-sizing: initial; 109 | height: 0; 110 | overflow: visible; 111 | } 112 | 113 | .markdown-body input { 114 | font: inherit; 115 | margin: 0; 116 | } 117 | 118 | .markdown-body input { 119 | overflow: visible; 120 | } 121 | 122 | .markdown-body [type=checkbox] { 123 | box-sizing: border-box; 124 | padding: 0; 125 | } 126 | 127 | .markdown-body * { 128 | box-sizing: border-box; 129 | } 130 | 131 | .markdown-body input { 132 | font-family: inherit; 133 | font-size: inherit; 134 | line-height: inherit; 135 | } 136 | 137 | .markdown-body a { 138 | color: #0366d6; 139 | text-decoration: none; 140 | } 141 | 142 | .markdown-body a:hover { 143 | text-decoration: underline; 144 | } 145 | 146 | .markdown-body strong { 147 | font-weight: 600; 148 | } 149 | 150 | .markdown-body hr { 151 | height: 0; 152 | margin: 15px 0; 153 | overflow: hidden; 154 | background: transparent; 155 | border: 0; 156 | border-bottom: 1px solid #dfe2e5; 157 | } 158 | 159 | .markdown-body hr:after, 160 | .markdown-body hr:before { 161 | display: table; 162 | content: ""; 163 | } 164 | 165 | .markdown-body hr:after { 166 | clear: both; 167 | } 168 | 169 | .markdown-body table { 170 | border-spacing: 0; 171 | border-collapse: collapse; 172 | } 173 | 174 | .markdown-body td, 175 | .markdown-body th { 176 | padding: 0; 177 | } 178 | 179 | .markdown-body details summary { 180 | cursor: pointer; 181 | } 182 | 183 | .markdown-body kbd { 184 | display: inline-block; 185 | padding: 3px 5px; 186 | font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace; 187 | line-height: 10px; 188 | color: #444d56; 189 | vertical-align: middle; 190 | background-color: #fafbfc; 191 | border: 1px solid #d1d5da; 192 | border-radius: 3px; 193 | box-shadow: inset 0 -1px 0 #d1d5da; 194 | } 195 | 196 | .markdown-body h1, 197 | .markdown-body h2, 198 | .markdown-body h3, 199 | .markdown-body h4, 200 | .markdown-body h5, 201 | .markdown-body h6 { 202 | margin-top: 0; 203 | margin-bottom: 0; 204 | } 205 | 206 | .markdown-body h1 { 207 | font-size: 32px; 208 | } 209 | 210 | .markdown-body h1, 211 | .markdown-body h2 { 212 | font-weight: 600; 213 | } 214 | 215 | .markdown-body h2 { 216 | font-size: 24px; 217 | } 218 | 219 | .markdown-body h3 { 220 | font-size: 20px; 221 | } 222 | 223 | .markdown-body h3, 224 | .markdown-body h4 { 225 | font-weight: 600; 226 | } 227 | 228 | .markdown-body h4 { 229 | font-size: 16px; 230 | } 231 | 232 | .markdown-body h5 { 233 | font-size: 14px; 234 | } 235 | 236 | .markdown-body h5, 237 | .markdown-body h6 { 238 | font-weight: 600; 239 | } 240 | 241 | .markdown-body h6 { 242 | font-size: 12px; 243 | } 244 | 245 | .markdown-body p { 246 | margin-top: 0; 247 | margin-bottom: 10px; 248 | } 249 | 250 | .markdown-body blockquote { 251 | margin: 0; 252 | } 253 | 254 | .markdown-body ol, 255 | .markdown-body ul { 256 | padding-left: 0; 257 | margin-top: 0; 258 | margin-bottom: 0; 259 | } 260 | 261 | .markdown-body ol ol, 262 | .markdown-body ul ol { 263 | list-style-type: lower-roman; 264 | } 265 | 266 | .markdown-body ol ol ol, 267 | .markdown-body ol ul ol, 268 | .markdown-body ul ol ol, 269 | .markdown-body ul ul ol { 270 | list-style-type: lower-alpha; 271 | } 272 | 273 | .markdown-body dd { 274 | margin-left: 0; 275 | } 276 | 277 | .markdown-body code, 278 | .markdown-body pre { 279 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace; 280 | font-size: 12px; 281 | } 282 | 283 | .markdown-body pre { 284 | margin-top: 0; 285 | margin-bottom: 0; 286 | } 287 | 288 | .markdown-body input::-webkit-inner-spin-button, 289 | .markdown-body input::-webkit-outer-spin-button { 290 | margin: 0; 291 | -webkit-appearance: none; 292 | appearance: none; 293 | } 294 | 295 | .markdown-body :checked+.radio-label { 296 | position: relative; 297 | z-index: 1; 298 | border-color: #0366d6; 299 | } 300 | 301 | .markdown-body .border { 302 | border: 1px solid #e1e4e8!important; 303 | } 304 | 305 | .markdown-body .border-0 { 306 | border: 0!important; 307 | } 308 | 309 | .markdown-body .border-bottom { 310 | border-bottom: 1px solid #e1e4e8!important; 311 | } 312 | 313 | .markdown-body .rounded-1 { 314 | border-radius: 3px!important; 315 | } 316 | 317 | .markdown-body .bg-white { 318 | background-color: #fff!important; 319 | } 320 | 321 | .markdown-body .bg-gray-light { 322 | background-color: #fafbfc!important; 323 | } 324 | 325 | .markdown-body .text-gray-light { 326 | color: #6a737d!important; 327 | } 328 | 329 | .markdown-body .mb-0 { 330 | margin-bottom: 0!important; 331 | } 332 | 333 | .markdown-body .my-2 { 334 | margin-top: 8px!important; 335 | margin-bottom: 8px!important; 336 | } 337 | 338 | .markdown-body .pl-0 { 339 | padding-left: 0!important; 340 | } 341 | 342 | .markdown-body .py-0 { 343 | padding-top: 0!important; 344 | padding-bottom: 0!important; 345 | } 346 | 347 | .markdown-body .pl-1 { 348 | padding-left: 4px!important; 349 | } 350 | 351 | .markdown-body .pl-2 { 352 | padding-left: 8px!important; 353 | } 354 | 355 | .markdown-body .py-2 { 356 | padding-top: 8px!important; 357 | padding-bottom: 8px!important; 358 | } 359 | 360 | .markdown-body .pl-3, 361 | .markdown-body .px-3 { 362 | padding-left: 16px!important; 363 | } 364 | 365 | .markdown-body .px-3 { 366 | padding-right: 16px!important; 367 | } 368 | 369 | .markdown-body .pl-4 { 370 | padding-left: 24px!important; 371 | } 372 | 373 | .markdown-body .pl-5 { 374 | padding-left: 32px!important; 375 | } 376 | 377 | .markdown-body .pl-6 { 378 | padding-left: 40px!important; 379 | } 380 | 381 | .markdown-body .f6 { 382 | font-size: 12px!important; 383 | } 384 | 385 | .markdown-body .lh-condensed { 386 | line-height: 1.25!important; 387 | } 388 | 389 | .markdown-body .text-bold { 390 | font-weight: 600!important; 391 | } 392 | 393 | .markdown-body .pl-c { 394 | color: #6a737d; 395 | } 396 | 397 | .markdown-body .pl-c1, 398 | .markdown-body .pl-s .pl-v { 399 | color: #005cc5; 400 | } 401 | 402 | .markdown-body .pl-e, 403 | .markdown-body .pl-en { 404 | color: #6f42c1; 405 | } 406 | 407 | .markdown-body .pl-s .pl-s1, 408 | .markdown-body .pl-smi { 409 | color: #24292e; 410 | } 411 | 412 | .markdown-body .pl-ent { 413 | color: #22863a; 414 | } 415 | 416 | .markdown-body .pl-k { 417 | color: #d73a49; 418 | } 419 | 420 | .markdown-body .pl-pds, 421 | .markdown-body .pl-s, 422 | .markdown-body .pl-s .pl-pse .pl-s1, 423 | .markdown-body .pl-sr, 424 | .markdown-body .pl-sr .pl-cce, 425 | .markdown-body .pl-sr .pl-sra, 426 | .markdown-body .pl-sr .pl-sre { 427 | color: #032f62; 428 | } 429 | 430 | .markdown-body .pl-smw, 431 | .markdown-body .pl-v { 432 | color: #e36209; 433 | } 434 | 435 | .markdown-body .pl-bu { 436 | color: #b31d28; 437 | } 438 | 439 | .markdown-body .pl-ii { 440 | color: #fafbfc; 441 | background-color: #b31d28; 442 | } 443 | 444 | .markdown-body .pl-c2 { 445 | color: #fafbfc; 446 | background-color: #d73a49; 447 | } 448 | 449 | .markdown-body .pl-c2:before { 450 | content: "^M"; 451 | } 452 | 453 | .markdown-body .pl-sr .pl-cce { 454 | font-weight: 700; 455 | color: #22863a; 456 | } 457 | 458 | .markdown-body .pl-ml { 459 | color: #735c0f; 460 | } 461 | 462 | .markdown-body .pl-mh, 463 | .markdown-body .pl-mh .pl-en, 464 | .markdown-body .pl-ms { 465 | font-weight: 700; 466 | color: #005cc5; 467 | } 468 | 469 | .markdown-body .pl-mi { 470 | font-style: italic; 471 | color: #24292e; 472 | } 473 | 474 | .markdown-body .pl-mb { 475 | font-weight: 700; 476 | color: #24292e; 477 | } 478 | 479 | .markdown-body .pl-md { 480 | color: #b31d28; 481 | background-color: #ffeef0; 482 | } 483 | 484 | .markdown-body .pl-mi1 { 485 | color: #22863a; 486 | background-color: #f0fff4; 487 | } 488 | 489 | .markdown-body .pl-mc { 490 | color: #e36209; 491 | background-color: #ffebda; 492 | } 493 | 494 | .markdown-body .pl-mi2 { 495 | color: #f6f8fa; 496 | background-color: #005cc5; 497 | } 498 | 499 | .markdown-body .pl-mdr { 500 | font-weight: 700; 501 | color: #6f42c1; 502 | } 503 | 504 | .markdown-body .pl-ba { 505 | color: #586069; 506 | } 507 | 508 | .markdown-body .pl-sg { 509 | color: #959da5; 510 | } 511 | 512 | .markdown-body .pl-corl { 513 | text-decoration: underline; 514 | color: #032f62; 515 | } 516 | 517 | .markdown-body .mb-0 { 518 | margin-bottom: 0!important; 519 | } 520 | 521 | .markdown-body .my-2 { 522 | margin-bottom: 8px!important; 523 | } 524 | 525 | .markdown-body .my-2 { 526 | margin-top: 8px!important; 527 | } 528 | 529 | .markdown-body .pl-0 { 530 | padding-left: 0!important; 531 | } 532 | 533 | .markdown-body .py-0 { 534 | padding-top: 0!important; 535 | padding-bottom: 0!important; 536 | } 537 | 538 | .markdown-body .pl-1 { 539 | padding-left: 4px!important; 540 | } 541 | 542 | .markdown-body .pl-2 { 543 | padding-left: 8px!important; 544 | } 545 | 546 | .markdown-body .py-2 { 547 | padding-top: 8px!important; 548 | padding-bottom: 8px!important; 549 | } 550 | 551 | .markdown-body .pl-3 { 552 | padding-left: 16px!important; 553 | } 554 | 555 | .markdown-body .pl-4 { 556 | padding-left: 24px!important; 557 | } 558 | 559 | .markdown-body .pl-5 { 560 | padding-left: 32px!important; 561 | } 562 | 563 | .markdown-body .pl-6 { 564 | padding-left: 40px!important; 565 | } 566 | 567 | .markdown-body .pl-7 { 568 | padding-left: 48px!important; 569 | } 570 | 571 | .markdown-body .pl-8 { 572 | padding-left: 64px!important; 573 | } 574 | 575 | .markdown-body .pl-9 { 576 | padding-left: 80px!important; 577 | } 578 | 579 | .markdown-body .pl-10 { 580 | padding-left: 96px!important; 581 | } 582 | 583 | .markdown-body .pl-11 { 584 | padding-left: 112px!important; 585 | } 586 | 587 | .markdown-body .pl-12 { 588 | padding-left: 128px!important; 589 | } 590 | 591 | .markdown-body hr { 592 | border-bottom-color: #eee; 593 | } 594 | 595 | .markdown-body kbd { 596 | display: inline-block; 597 | padding: 3px 5px; 598 | font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace; 599 | line-height: 10px; 600 | color: #444d56; 601 | vertical-align: middle; 602 | background-color: #fafbfc; 603 | border: 1px solid #d1d5da; 604 | border-radius: 3px; 605 | box-shadow: inset 0 -1px 0 #d1d5da; 606 | } 607 | 608 | .markdown-body:after, 609 | .markdown-body:before { 610 | display: table; 611 | content: ""; 612 | } 613 | 614 | .markdown-body:after { 615 | clear: both; 616 | } 617 | 618 | .markdown-body>:first-child { 619 | margin-top: 0!important; 620 | } 621 | 622 | .markdown-body>:last-child { 623 | margin-bottom: 0!important; 624 | } 625 | 626 | .markdown-body a:not([href]) { 627 | color: inherit; 628 | text-decoration: none; 629 | } 630 | 631 | .markdown-body blockquote, 632 | .markdown-body details, 633 | .markdown-body dl, 634 | .markdown-body ol, 635 | .markdown-body p, 636 | .markdown-body pre, 637 | .markdown-body table, 638 | .markdown-body ul { 639 | margin-top: 0; 640 | margin-bottom: 16px; 641 | } 642 | 643 | .markdown-body hr { 644 | height: .25em; 645 | padding: 0; 646 | margin: 24px 0; 647 | background-color: #e1e4e8; 648 | border: 0; 649 | } 650 | 651 | .markdown-body blockquote { 652 | padding: 0 1em; 653 | color: #6a737d; 654 | border-left: .25em solid #dfe2e5; 655 | } 656 | 657 | .markdown-body blockquote>:first-child { 658 | margin-top: 0; 659 | } 660 | 661 | .markdown-body blockquote>:last-child { 662 | margin-bottom: 0; 663 | } 664 | 665 | .markdown-body h1, 666 | .markdown-body h2, 667 | .markdown-body h3, 668 | .markdown-body h4, 669 | .markdown-body h5, 670 | .markdown-body h6 { 671 | margin-top: 24px; 672 | margin-bottom: 16px; 673 | font-weight: 600; 674 | line-height: 1.25; 675 | } 676 | 677 | .markdown-body h1 { 678 | font-size: 2em; 679 | } 680 | 681 | .markdown-body h1, 682 | .markdown-body h2 { 683 | padding-bottom: .3em; 684 | border-bottom: 1px solid #eaecef; 685 | } 686 | 687 | .markdown-body h2 { 688 | font-size: 1.5em; 689 | } 690 | 691 | .markdown-body h3 { 692 | font-size: 1.25em; 693 | } 694 | 695 | .markdown-body h4 { 696 | font-size: 1em; 697 | } 698 | 699 | .markdown-body h5 { 700 | font-size: .875em; 701 | } 702 | 703 | .markdown-body h6 { 704 | font-size: .85em; 705 | color: #6a737d; 706 | } 707 | 708 | .markdown-body ol, 709 | .markdown-body ul { 710 | padding-left: 2em; 711 | } 712 | 713 | .markdown-body ol ol, 714 | .markdown-body ol ul, 715 | .markdown-body ul ol, 716 | .markdown-body ul ul { 717 | margin-top: 0; 718 | margin-bottom: 0; 719 | } 720 | 721 | .markdown-body li { 722 | word-wrap: break-all; 723 | } 724 | 725 | .markdown-body li>p { 726 | margin-top: 16px; 727 | } 728 | 729 | .markdown-body li+li { 730 | margin-top: .25em; 731 | } 732 | 733 | .markdown-body dl { 734 | padding: 0; 735 | } 736 | 737 | .markdown-body dl dt { 738 | padding: 0; 739 | margin-top: 16px; 740 | font-size: 1em; 741 | font-style: italic; 742 | font-weight: 600; 743 | } 744 | 745 | .markdown-body dl dd { 746 | padding: 0 16px; 747 | margin-bottom: 16px; 748 | } 749 | 750 | .markdown-body table { 751 | display: block; 752 | width: 100%; 753 | overflow: auto; 754 | } 755 | 756 | .markdown-body table th { 757 | font-weight: 600; 758 | } 759 | 760 | .markdown-body table td, 761 | .markdown-body table th { 762 | padding: 6px 13px; 763 | border: 1px solid #dfe2e5; 764 | } 765 | 766 | .markdown-body table tr { 767 | background-color: #fff; 768 | border-top: 1px solid #c6cbd1; 769 | } 770 | 771 | .markdown-body table tr:nth-child(2n) { 772 | background-color: #f6f8fa; 773 | } 774 | 775 | .markdown-body img { 776 | max-width: 100%; 777 | box-sizing: initial; 778 | background-color: #fff; 779 | } 780 | 781 | .markdown-body img[align=right] { 782 | padding-left: 20px; 783 | } 784 | 785 | .markdown-body img[align=left] { 786 | padding-right: 20px; 787 | } 788 | 789 | .markdown-body code { 790 | padding: .2em .4em; 791 | margin: 0; 792 | font-size: 85%; 793 | background-color: rgba(27,31,35,.05); 794 | border-radius: 3px; 795 | } 796 | 797 | .markdown-body pre { 798 | word-wrap: normal; 799 | } 800 | 801 | .markdown-body pre>code { 802 | padding: 0; 803 | margin: 0; 804 | font-size: 100%; 805 | word-break: normal; 806 | white-space: pre; 807 | background: transparent; 808 | border: 0; 809 | } 810 | 811 | .markdown-body .highlight { 812 | margin-bottom: 16px; 813 | } 814 | 815 | .markdown-body .highlight pre { 816 | margin-bottom: 0; 817 | word-break: normal; 818 | } 819 | 820 | .markdown-body .highlight pre, 821 | .markdown-body pre { 822 | padding: 16px; 823 | overflow: auto; 824 | font-size: 85%; 825 | line-height: 1.45; 826 | background-color: #f6f8fa; 827 | border-radius: 3px; 828 | } 829 | 830 | .markdown-body pre code { 831 | display: inline; 832 | max-width: auto; 833 | padding: 0; 834 | margin: 0; 835 | overflow: visible; 836 | line-height: inherit; 837 | word-wrap: normal; 838 | background-color: initial; 839 | border: 0; 840 | } 841 | 842 | .markdown-body .commit-tease-sha { 843 | display: inline-block; 844 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace; 845 | font-size: 90%; 846 | color: #444d56; 847 | } 848 | 849 | .markdown-body .full-commit .btn-outline:not(:disabled):hover { 850 | color: #005cc5; 851 | border-color: #005cc5; 852 | } 853 | 854 | .markdown-body .blob-wrapper { 855 | overflow-x: auto; 856 | overflow-y: hidden; 857 | } 858 | 859 | .markdown-body .blob-wrapper-embedded { 860 | max-height: 240px; 861 | overflow-y: auto; 862 | } 863 | 864 | .markdown-body .blob-num { 865 | width: 1%; 866 | min-width: 50px; 867 | padding-right: 10px; 868 | padding-left: 10px; 869 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace; 870 | font-size: 12px; 871 | line-height: 20px; 872 | color: rgba(27,31,35,.3); 873 | text-align: right; 874 | white-space: nowrap; 875 | vertical-align: top; 876 | cursor: pointer; 877 | -webkit-user-select: none; 878 | -moz-user-select: none; 879 | -ms-user-select: none; 880 | user-select: none; 881 | } 882 | 883 | .markdown-body .blob-num:hover { 884 | color: rgba(27,31,35,.6); 885 | } 886 | 887 | .markdown-body .blob-num:before { 888 | content: attr(data-line-number); 889 | } 890 | 891 | .markdown-body .blob-code { 892 | position: relative; 893 | padding-right: 10px; 894 | padding-left: 10px; 895 | line-height: 20px; 896 | vertical-align: top; 897 | } 898 | 899 | .markdown-body .blob-code-inner { 900 | overflow: visible; 901 | font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace; 902 | font-size: 12px; 903 | color: #24292e; 904 | word-wrap: normal; 905 | white-space: pre; 906 | } 907 | 908 | .markdown-body .pl-token.active, 909 | .markdown-body .pl-token:hover { 910 | cursor: pointer; 911 | background: #ffea7f; 912 | } 913 | 914 | .markdown-body .tab-size[data-tab-size="1"] { 915 | -moz-tab-size: 1; 916 | tab-size: 1; 917 | } 918 | 919 | .markdown-body .tab-size[data-tab-size="2"] { 920 | -moz-tab-size: 2; 921 | tab-size: 2; 922 | } 923 | 924 | .markdown-body .tab-size[data-tab-size="3"] { 925 | -moz-tab-size: 3; 926 | tab-size: 3; 927 | } 928 | 929 | .markdown-body .tab-size[data-tab-size="4"] { 930 | -moz-tab-size: 4; 931 | tab-size: 4; 932 | } 933 | 934 | .markdown-body .tab-size[data-tab-size="5"] { 935 | -moz-tab-size: 5; 936 | tab-size: 5; 937 | } 938 | 939 | .markdown-body .tab-size[data-tab-size="6"] { 940 | -moz-tab-size: 6; 941 | tab-size: 6; 942 | } 943 | 944 | .markdown-body .tab-size[data-tab-size="7"] { 945 | -moz-tab-size: 7; 946 | tab-size: 7; 947 | } 948 | 949 | .markdown-body .tab-size[data-tab-size="8"] { 950 | -moz-tab-size: 8; 951 | tab-size: 8; 952 | } 953 | 954 | .markdown-body .tab-size[data-tab-size="9"] { 955 | -moz-tab-size: 9; 956 | tab-size: 9; 957 | } 958 | 959 | .markdown-body .tab-size[data-tab-size="10"] { 960 | -moz-tab-size: 10; 961 | tab-size: 10; 962 | } 963 | 964 | .markdown-body .tab-size[data-tab-size="11"] { 965 | -moz-tab-size: 11; 966 | tab-size: 11; 967 | } 968 | 969 | .markdown-body .tab-size[data-tab-size="12"] { 970 | -moz-tab-size: 12; 971 | tab-size: 12; 972 | } 973 | 974 | .markdown-body .task-list-item { 975 | list-style-type: none; 976 | } 977 | 978 | .markdown-body .task-list-item+.task-list-item { 979 | margin-top: 3px; 980 | } 981 | 982 | .markdown-body .task-list-item input { 983 | margin: 0 .2em .25em -1.6em; 984 | vertical-align: middle; 985 | } 986 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const showdown = require('showdown') 2 | const fs = require('fs') 3 | const EventEmitter = require("events").EventEmitter; 4 | 5 | const express = require('express') 6 | const app = express() 7 | 8 | var markdown = new EventEmitter(); 9 | var html = new EventEmitter(); 10 | 11 | showdown.setFlavor('github'); 12 | 13 | fs.readFile('files/mdstructure/markdown.md', 'utf8', (err, data) => { 14 | if (err) { 15 | console.log(err); 16 | } else { 17 | markdown.data = data; 18 | markdown.emit('markdownUpdate'); 19 | } 20 | }); 21 | 22 | markdown.on('markdownUpdate', () => { 23 | converter = new showdown.Converter(); 24 | conversion = converter.makeHtml(markdown.data); 25 | html.data = conversion; 26 | html.emit('htmlUpdate'); 27 | }); 28 | 29 | html.on('htmlUpdate', () => { 30 | let logCount = 0; 31 | 32 | app.use(express.static(__dirname + '/files')); 33 | app.get('/', (req, res) => { 34 | console.log(`=========================Requests Logs nº ${logCount}================================`); 35 | console.log(req); 36 | logCount++; 37 | res.send(` 38 | 39 | 40 | 42 | 43 | 44 | 45 | 55 | 56 | 145 | 146 |
147 | ${html.data} 148 |
149 | `); 150 | }); 151 | }); 152 | 153 | app.listen(80); 154 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "markdown-webserver", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "ansi-regex": { 17 | "version": "4.1.0", 18 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 19 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 20 | }, 21 | "ansi-styles": { 22 | "version": "3.2.1", 23 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 24 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 25 | "requires": { 26 | "color-convert": "^1.9.0" 27 | } 28 | }, 29 | "array-flatten": { 30 | "version": "1.1.1", 31 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 32 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 33 | }, 34 | "body-parser": { 35 | "version": "1.19.0", 36 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 37 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 38 | "requires": { 39 | "bytes": "3.1.0", 40 | "content-type": "~1.0.4", 41 | "debug": "2.6.9", 42 | "depd": "~1.1.2", 43 | "http-errors": "1.7.2", 44 | "iconv-lite": "0.4.24", 45 | "on-finished": "~2.3.0", 46 | "qs": "6.7.0", 47 | "raw-body": "2.4.0", 48 | "type-is": "~1.6.17" 49 | } 50 | }, 51 | "bytes": { 52 | "version": "3.1.0", 53 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 54 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 55 | }, 56 | "camelcase": { 57 | "version": "5.3.1", 58 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 59 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 60 | }, 61 | "cliui": { 62 | "version": "5.0.0", 63 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 64 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 65 | "requires": { 66 | "string-width": "^3.1.0", 67 | "strip-ansi": "^5.2.0", 68 | "wrap-ansi": "^5.1.0" 69 | } 70 | }, 71 | "color-convert": { 72 | "version": "1.9.3", 73 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 74 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 75 | "requires": { 76 | "color-name": "1.1.3" 77 | } 78 | }, 79 | "color-name": { 80 | "version": "1.1.3", 81 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 82 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 83 | }, 84 | "content-disposition": { 85 | "version": "0.5.3", 86 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 87 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 88 | "requires": { 89 | "safe-buffer": "5.1.2" 90 | } 91 | }, 92 | "content-type": { 93 | "version": "1.0.4", 94 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 95 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 96 | }, 97 | "cookie": { 98 | "version": "0.4.0", 99 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 100 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 101 | }, 102 | "cookie-signature": { 103 | "version": "1.0.6", 104 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 105 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 106 | }, 107 | "debug": { 108 | "version": "2.6.9", 109 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 110 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 111 | "requires": { 112 | "ms": "2.0.0" 113 | } 114 | }, 115 | "decamelize": { 116 | "version": "1.2.0", 117 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 118 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 119 | }, 120 | "depd": { 121 | "version": "1.1.2", 122 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 123 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 124 | }, 125 | "destroy": { 126 | "version": "1.0.4", 127 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 128 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 129 | }, 130 | "ee-first": { 131 | "version": "1.1.1", 132 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 133 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 134 | }, 135 | "emoji-regex": { 136 | "version": "7.0.3", 137 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 138 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 139 | }, 140 | "encodeurl": { 141 | "version": "1.0.2", 142 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 143 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 144 | }, 145 | "escape-html": { 146 | "version": "1.0.3", 147 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 148 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 149 | }, 150 | "etag": { 151 | "version": "1.8.1", 152 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 153 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 154 | }, 155 | "express": { 156 | "version": "4.17.1", 157 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 158 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 159 | "requires": { 160 | "accepts": "~1.3.7", 161 | "array-flatten": "1.1.1", 162 | "body-parser": "1.19.0", 163 | "content-disposition": "0.5.3", 164 | "content-type": "~1.0.4", 165 | "cookie": "0.4.0", 166 | "cookie-signature": "1.0.6", 167 | "debug": "2.6.9", 168 | "depd": "~1.1.2", 169 | "encodeurl": "~1.0.2", 170 | "escape-html": "~1.0.3", 171 | "etag": "~1.8.1", 172 | "finalhandler": "~1.1.2", 173 | "fresh": "0.5.2", 174 | "merge-descriptors": "1.0.1", 175 | "methods": "~1.1.2", 176 | "on-finished": "~2.3.0", 177 | "parseurl": "~1.3.3", 178 | "path-to-regexp": "0.1.7", 179 | "proxy-addr": "~2.0.5", 180 | "qs": "6.7.0", 181 | "range-parser": "~1.2.1", 182 | "safe-buffer": "5.1.2", 183 | "send": "0.17.1", 184 | "serve-static": "1.14.1", 185 | "setprototypeof": "1.1.1", 186 | "statuses": "~1.5.0", 187 | "type-is": "~1.6.18", 188 | "utils-merge": "1.0.1", 189 | "vary": "~1.1.2" 190 | } 191 | }, 192 | "finalhandler": { 193 | "version": "1.1.2", 194 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 195 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 196 | "requires": { 197 | "debug": "2.6.9", 198 | "encodeurl": "~1.0.2", 199 | "escape-html": "~1.0.3", 200 | "on-finished": "~2.3.0", 201 | "parseurl": "~1.3.3", 202 | "statuses": "~1.5.0", 203 | "unpipe": "~1.0.0" 204 | } 205 | }, 206 | "find-up": { 207 | "version": "3.0.0", 208 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 209 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 210 | "requires": { 211 | "locate-path": "^3.0.0" 212 | } 213 | }, 214 | "forwarded": { 215 | "version": "0.1.2", 216 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 217 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 218 | }, 219 | "fresh": { 220 | "version": "0.5.2", 221 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 222 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 223 | }, 224 | "get-caller-file": { 225 | "version": "2.0.5", 226 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 227 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 228 | }, 229 | "http-errors": { 230 | "version": "1.7.2", 231 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 232 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 233 | "requires": { 234 | "depd": "~1.1.2", 235 | "inherits": "2.0.3", 236 | "setprototypeof": "1.1.1", 237 | "statuses": ">= 1.5.0 < 2", 238 | "toidentifier": "1.0.0" 239 | } 240 | }, 241 | "iconv-lite": { 242 | "version": "0.4.24", 243 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 244 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 245 | "requires": { 246 | "safer-buffer": ">= 2.1.2 < 3" 247 | } 248 | }, 249 | "inherits": { 250 | "version": "2.0.3", 251 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 252 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 253 | }, 254 | "ipaddr.js": { 255 | "version": "1.9.1", 256 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 257 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 258 | }, 259 | "is-fullwidth-code-point": { 260 | "version": "2.0.0", 261 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 262 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 263 | }, 264 | "locate-path": { 265 | "version": "3.0.0", 266 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 267 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 268 | "requires": { 269 | "p-locate": "^3.0.0", 270 | "path-exists": "^3.0.0" 271 | } 272 | }, 273 | "media-typer": { 274 | "version": "0.3.0", 275 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 276 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 277 | }, 278 | "merge-descriptors": { 279 | "version": "1.0.1", 280 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 281 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 282 | }, 283 | "methods": { 284 | "version": "1.1.2", 285 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 286 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 287 | }, 288 | "mime": { 289 | "version": "1.6.0", 290 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 291 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 292 | }, 293 | "mime-db": { 294 | "version": "1.44.0", 295 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 296 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 297 | }, 298 | "mime-types": { 299 | "version": "2.1.27", 300 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 301 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 302 | "requires": { 303 | "mime-db": "1.44.0" 304 | } 305 | }, 306 | "ms": { 307 | "version": "2.0.0", 308 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 309 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 310 | }, 311 | "negotiator": { 312 | "version": "0.6.2", 313 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 314 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 315 | }, 316 | "on-finished": { 317 | "version": "2.3.0", 318 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 319 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 320 | "requires": { 321 | "ee-first": "1.1.1" 322 | } 323 | }, 324 | "p-limit": { 325 | "version": "2.3.0", 326 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 327 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 328 | "requires": { 329 | "p-try": "^2.0.0" 330 | } 331 | }, 332 | "p-locate": { 333 | "version": "3.0.0", 334 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 335 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 336 | "requires": { 337 | "p-limit": "^2.0.0" 338 | } 339 | }, 340 | "p-try": { 341 | "version": "2.2.0", 342 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 343 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 344 | }, 345 | "parseurl": { 346 | "version": "1.3.3", 347 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 348 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 349 | }, 350 | "path-exists": { 351 | "version": "3.0.0", 352 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 353 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 354 | }, 355 | "path-to-regexp": { 356 | "version": "0.1.7", 357 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 358 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 359 | }, 360 | "proxy-addr": { 361 | "version": "2.0.6", 362 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 363 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 364 | "requires": { 365 | "forwarded": "~0.1.2", 366 | "ipaddr.js": "1.9.1" 367 | } 368 | }, 369 | "qs": { 370 | "version": "6.7.0", 371 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 372 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 373 | }, 374 | "range-parser": { 375 | "version": "1.2.1", 376 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 377 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 378 | }, 379 | "raw-body": { 380 | "version": "2.4.0", 381 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 382 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 383 | "requires": { 384 | "bytes": "3.1.0", 385 | "http-errors": "1.7.2", 386 | "iconv-lite": "0.4.24", 387 | "unpipe": "1.0.0" 388 | } 389 | }, 390 | "require-directory": { 391 | "version": "2.1.1", 392 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 393 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 394 | }, 395 | "require-main-filename": { 396 | "version": "2.0.0", 397 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 398 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 399 | }, 400 | "safe-buffer": { 401 | "version": "5.1.2", 402 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 403 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 404 | }, 405 | "safer-buffer": { 406 | "version": "2.1.2", 407 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 408 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 409 | }, 410 | "send": { 411 | "version": "0.17.1", 412 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 413 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 414 | "requires": { 415 | "debug": "2.6.9", 416 | "depd": "~1.1.2", 417 | "destroy": "~1.0.4", 418 | "encodeurl": "~1.0.2", 419 | "escape-html": "~1.0.3", 420 | "etag": "~1.8.1", 421 | "fresh": "0.5.2", 422 | "http-errors": "~1.7.2", 423 | "mime": "1.6.0", 424 | "ms": "2.1.1", 425 | "on-finished": "~2.3.0", 426 | "range-parser": "~1.2.1", 427 | "statuses": "~1.5.0" 428 | }, 429 | "dependencies": { 430 | "ms": { 431 | "version": "2.1.1", 432 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 433 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 434 | } 435 | } 436 | }, 437 | "serve-static": { 438 | "version": "1.14.1", 439 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 440 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 441 | "requires": { 442 | "encodeurl": "~1.0.2", 443 | "escape-html": "~1.0.3", 444 | "parseurl": "~1.3.3", 445 | "send": "0.17.1" 446 | } 447 | }, 448 | "set-blocking": { 449 | "version": "2.0.0", 450 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 451 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 452 | }, 453 | "setprototypeof": { 454 | "version": "1.1.1", 455 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 456 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 457 | }, 458 | "showdown": { 459 | "version": "1.9.1", 460 | "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", 461 | "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", 462 | "requires": { 463 | "yargs": "^14.2" 464 | } 465 | }, 466 | "statuses": { 467 | "version": "1.5.0", 468 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 469 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 470 | }, 471 | "string-width": { 472 | "version": "3.1.0", 473 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 474 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 475 | "requires": { 476 | "emoji-regex": "^7.0.1", 477 | "is-fullwidth-code-point": "^2.0.0", 478 | "strip-ansi": "^5.1.0" 479 | } 480 | }, 481 | "strip-ansi": { 482 | "version": "5.2.0", 483 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 484 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 485 | "requires": { 486 | "ansi-regex": "^4.1.0" 487 | } 488 | }, 489 | "toidentifier": { 490 | "version": "1.0.0", 491 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 492 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 493 | }, 494 | "type-is": { 495 | "version": "1.6.18", 496 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 497 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 498 | "requires": { 499 | "media-typer": "0.3.0", 500 | "mime-types": "~2.1.24" 501 | } 502 | }, 503 | "unpipe": { 504 | "version": "1.0.0", 505 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 506 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 507 | }, 508 | "utils-merge": { 509 | "version": "1.0.1", 510 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 511 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 512 | }, 513 | "vary": { 514 | "version": "1.1.2", 515 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 516 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 517 | }, 518 | "which-module": { 519 | "version": "2.0.0", 520 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 521 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 522 | }, 523 | "wrap-ansi": { 524 | "version": "5.1.0", 525 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 526 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 527 | "requires": { 528 | "ansi-styles": "^3.2.0", 529 | "string-width": "^3.0.0", 530 | "strip-ansi": "^5.0.0" 531 | } 532 | }, 533 | "y18n": { 534 | "version": "4.0.1", 535 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", 536 | "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" 537 | }, 538 | "yargs": { 539 | "version": "14.2.3", 540 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", 541 | "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", 542 | "requires": { 543 | "cliui": "^5.0.0", 544 | "decamelize": "^1.2.0", 545 | "find-up": "^3.0.0", 546 | "get-caller-file": "^2.0.1", 547 | "require-directory": "^2.1.1", 548 | "require-main-filename": "^2.0.0", 549 | "set-blocking": "^2.0.0", 550 | "string-width": "^3.0.0", 551 | "which-module": "^2.0.0", 552 | "y18n": "^4.0.0", 553 | "yargs-parser": "^15.0.1" 554 | } 555 | }, 556 | "yargs-parser": { 557 | "version": "15.0.1", 558 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", 559 | "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", 560 | "requires": { 561 | "camelcase": "^5.0.0", 562 | "decamelize": "^1.2.0" 563 | } 564 | } 565 | } 566 | } 567 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "markdown-webserver", 3 | "version": "1.0.0", 4 | "description": "A NodeJS Application that transcripts Markdown to HTML, supporting MathJax and with Github CSS Markdown like a style. Serving itself has a server.", 5 | "main": "main.js", 6 | "scripts": { 7 | "start": "node main.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/joaoofreitas/markdown-webserver.git" 12 | }, 13 | "author": "João Freitas", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/joaoofreitas/markdown-webserver/issues" 17 | }, 18 | "homepage": "https://github.com/joaoofreitas/markdown-webserver#readme", 19 | "dependencies": { 20 | "express": "^4.17.1", 21 | "showdown": "^1.9.1" 22 | } 23 | } 24 | --------------------------------------------------------------------------------