@mryhryki/markdown-preview 0.3.11 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.editorconfig ADDED
@@ -0,0 +1,7 @@
1
+ [{*.html, *.css, *.scss, *.cjs, *.js, *.jsx, *.json, *.ts, *.tsx}]
2
+ end_of_line = lf
3
+ trim_trailing_whitespace = true
4
+ insert_final_newline = true
5
+ charset = utf-8
6
+ indent_style = space
7
+ indent_size = 2
package/.eslintrc.yaml ADDED
@@ -0,0 +1,34 @@
1
+ extends:
2
+ - plugin:@typescript-eslint/recommended
3
+ - plugin:react/recommended
4
+ - plugin:react-hooks/recommended
5
+ - prettier
6
+ plugins:
7
+ - jest
8
+ - "@typescript-eslint"
9
+ - prettier
10
+ - react
11
+ - unused-imports
12
+ env:
13
+ browser: true
14
+ commonjs: true
15
+ es2020: true
16
+ jest/globals: true
17
+ node: true
18
+ globals:
19
+ Atomics: readonly
20
+ SharedArrayBuffer: readonly
21
+ parser: "@typescript-eslint/parser"
22
+ parserOptions:
23
+ ecmaFeatures:
24
+ jsx: true
25
+ ecmaVersion: 11
26
+ sourceType: module
27
+ rules:
28
+ prettier/prettier: error
29
+ react/prop-types: 'off'
30
+ 'react-hooks/exhaustive-deps': 'off'
31
+ '@typescript-eslint/no-var-requires': 'off'
32
+ settings:
33
+ react:
34
+ version: detect
@@ -0,0 +1,15 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: "/"
5
+ schedule:
6
+ interval: monthly
7
+ timezone: Asia/Tokyo
8
+ target-branch: main
9
+ reviewers:
10
+ - mryhryki
11
+ assignees:
12
+ - mryhryki
13
+ labels:
14
+ - dependencies
15
+
@@ -0,0 +1,32 @@
1
+ name: check
2
+ env:
3
+ TZ: "Asia/Tokyo"
4
+
5
+ on:
6
+ push:
7
+ branches:
8
+ - "main"
9
+ pull_request:
10
+ branches:
11
+ - "*"
12
+
13
+ jobs:
14
+ check_branch:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v3
19
+ with:
20
+ ref: ${{ github.event.pull_request.head.sha }}
21
+ - name: Setup Node
22
+ uses: actions/setup-node@v3
23
+ with:
24
+ node-version: 16
25
+ - name: Update npm
26
+ run: npm install -g npm
27
+ - name: install packages
28
+ run: npm ci
29
+ - name: lint
30
+ run: npm run lint
31
+ - name: test
32
+ run: npm test
@@ -0,0 +1,35 @@
1
+ name: update_packages
2
+ env:
3
+ TZ: "Asia/Tokyo"
4
+
5
+ on:
6
+ schedule:
7
+ - cron: "15 11 20 * *" # UTC
8
+ workflow_dispatch:
9
+
10
+ jobs:
11
+ check_branch:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v3
16
+ with:
17
+ ref: ${{ github.event.pull_request.head.sha }}
18
+ - name: Setup Node
19
+ uses: actions/setup-node@v3
20
+ with:
21
+ node-version: 16
22
+ - name: Update packages
23
+ run: |
24
+ npm i -g npm
25
+ npm exec -- npm-check-updates -u
26
+ npm install
27
+ - name: Create Pull Request
28
+ uses: peter-evans/create-pull-request@v4
29
+ with:
30
+ title: "Update package.json"
31
+ commit-message: "Update package.json"
32
+ branch: "update-packages"
33
+ delete-branch: true
34
+ branch-suffix: timestamp
35
+ reviewers: mryhryki
@@ -0,0 +1,3 @@
1
+ {
2
+ "printWidth": 120
3
+ }
package/CODEOWNERS ADDED
@@ -0,0 +1 @@
1
+ * @mryhryki
package/README.md CHANGED
@@ -4,59 +4,65 @@ Markdown realtime preview on browser with your favorite editor.
4
4
 
5
5
  ## Demo
6
6
 
7
- ![DEMO](https://github.com/mryhryki/markdown-preview/raw/master/gif/demo.gif)
7
+ ![DEMO](./gif/demo.gif)
8
8
 
9
9
  ## Usage
10
10
 
11
11
  ### npx
12
12
 
13
- ```
14
- $ npx @mryhryki/markdown-preview --port 34567 --file README.md
15
-
13
+ ```shell
14
+ $ npx @mryhryki/markdown-preview --file README.md --template default --port 34567 --log-level info --no-opener
16
15
  Root Directory : /current/dir
17
16
  Default File : README.md
18
- Preview URL : http://localhost:34567/
17
+ Extensions : md, markdown
18
+ Template File : /path/to/template/default.html
19
+ Preview URL : http://localhost:34567
19
20
  ```
20
21
 
21
22
  ### npm / yarn
22
23
 
23
- ```
24
+ ```shell
24
25
  $ npm install -g @mryhryki/markdown-preview
25
26
  # or
26
27
  $ yarn install -g @mryhryki/markdown-preview
27
28
 
28
- $ markdown-preview --port 34567 --file README.md
29
-
29
+ $ markdown-preview --file README.md --template default --port 34567 --log-level info --no-opener
30
30
  Root Directory : /current/dir
31
31
  Default File : README.md
32
- Preview URL : http://localhost:34567/
32
+ Extensions : md, markdown
33
+ Template File : /path/to/template/default.html
34
+ Preview URL : http://localhost:34567
33
35
  ```
34
36
 
35
37
  ## Parameter
36
38
 
37
- | short | long | environment variable | parameter | required | default |
38
- |-------|-------------|----------------------------|------------------------------------------|----------|-----------|
39
- | -f | --file | MARKDOWN_PREVIEW_FILE | `relative` file path | no | README.md |
40
- | -t | --template | MARKDOWN_PREVIEW_TEMPLATE | template name(*1) | no | default |
41
- | -p | --port | MARKDOWN_PREVIEW_PORT | port number | no | 34567 |
42
- | | --log-level | MARKDOWN_PREVIEW_LOG_LEVEL | trace, debug, info<br>warn, error, fatal | no | info |
43
- | | --no-opener | MARKDOWN_PREVIEW_NO_OPENER | true (only env var) | no | |
44
- | -v | --version | | | no | |
45
- | -h | --help | | | no | |
39
+ | short | long | environment variable | parameter | required | default |
40
+ |-------|-------------|----------------------------|-------------------------------------------------------|----------|-----------|
41
+ | -f | --file | MARKDOWN_PREVIEW_FILE | ***relative*** file path | no | README.md |
42
+ | -t | --template | MARKDOWN_PREVIEW_TEMPLATE | defined template name (*1) or template file path (*2) | no | default |
43
+ | -p | --port | MARKDOWN_PREVIEW_PORT | port number | no | 34567 |
44
+ | | --log-level | MARKDOWN_PREVIEW_LOG_LEVEL | trace, debug, info<br>warn, error, fatal | no | info |
45
+ | | --no-opener | MARKDOWN_PREVIEW_NO_OPENER | true (only env var) | no | |
46
+ | -v | --version | | | no | |
47
+ | -h | --help | | | no | |
48
+
49
+ ### *1: Defined Template Names
46
50
 
47
- *1: defined template name or html file path.
51
+ - `default`
52
+ - `default-dark`
48
53
 
49
- ### Defined Template Names
54
+ ### *2: How to create a template file
50
55
 
51
- * `default`
56
+ Creating a template file is easy.
57
+ At a minimum, all you need to do is load `/markdown-preview-websocket.js` and pass a callback function with the necessary processing to `connectMarkdownPreview`.
52
58
 
53
- ## Minimum Customized Template
59
+ Sample code is presented below.
54
60
 
55
61
  ```html
56
62
  <!doctype html>
57
63
  <html>
58
64
  <head>
59
- <title>Minimum Customized Template</title>
65
+ <title>Minimum Template Sample</title>
60
66
  </head>
61
67
  <body>
62
68
  <pre id="raw-markdown"></pre>
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';
2
+ "use strict";
3
3
 
4
- require('./src/index');
4
+ require("./src/index");
package/package.json CHANGED
@@ -1,48 +1,51 @@
1
1
  {
2
2
  "name": "@mryhryki/markdown-preview",
3
- "version": "0.3.11",
4
3
  "description": "Markdown realtime preview on browser",
5
- "main": "index.js",
6
- "engines": {
7
- "node": ">=12.0.0",
8
- "npm": ">=6.0.0"
9
- },
10
- "bin": {
11
- "markdown-preview": "index.js"
12
- },
13
- "scripts": {
14
- "start": "nodemon --watch ./src/ index.js --no-opener --log-level debug",
15
- "test": "jest",
16
- "test:watch": "jest --watchAll"
17
- },
18
- "repository": {
19
- "type": "git",
20
- "url": "git+https://github.com/mryhryki/markdown-preview.git"
21
- },
4
+ "version": "0.4.1",
22
5
  "author": "mryhryki",
23
6
  "license": "MIT",
24
- "publishConfdddig": {
7
+ "publishConfig": {
25
8
  "access": "public"
26
9
  },
27
- "bugs": {
28
- "url": "https://github.com/mryhryki/markdown-preview/issues"
29
- },
30
- "homepage": "https://github.com/mryhryki/markdown-preview#readme",
31
10
  "keywords": [
32
11
  "markdown",
33
12
  "preview"
34
13
  ],
14
+ "homepage": "https://github.com/mryhryki/markdown-preview#readme",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/mryhryki/markdown-preview.git"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/mryhryki/markdown-preview/issues"
21
+ },
22
+ "engines": {
23
+ "node": ">=12.0.0",
24
+ "npm": ">=6.0.0"
25
+ },
26
+ "main": "index.js",
27
+ "bin": {
28
+ "markdown-preview": "index.js"
29
+ },
35
30
  "dependencies": {
36
- "express": "^4.17.2",
31
+ "express": "^4.18.2",
37
32
  "express-ws": "^5.0.2",
38
- "log4js": "^6.3.0",
33
+ "log4js": "^6.9.1",
39
34
  "opener": "^1.5.2",
40
- "requires": "^1.0.2",
41
35
  "serve-index": "^1.9.1",
42
- "ws": "^8.4.0"
36
+ "ws": "^8.13.0"
43
37
  },
44
38
  "devDependencies": {
45
- "jest": "^27.4.5",
46
- "nodemon": "^2.0.15"
39
+ "@mryhryki/lint": "^0.0.12",
40
+ "jest": "^29.5.0",
41
+ "nodemon": "^2.0.21"
42
+ },
43
+ "scripts": {
44
+ "start": "node ./index.js",
45
+ "dev": "nodemon --watch ./src/ index.js --no-opener --log-level debug",
46
+ "lint": "mryhryki-lint",
47
+ "lint:fix": "mryhryki-lint --fix",
48
+ "test": "jest",
49
+ "test:watch": "jest --watchAll"
47
50
  }
48
51
  }
package/src/index.js CHANGED
@@ -1,47 +1,46 @@
1
- 'use strict'
1
+ "use strict";
2
2
 
3
- const express = require('express')
4
- const expressWs = require('express-ws')
5
- const serveIndex = require('serve-index')
6
- const opener = require('opener')
7
- const getLogger = require('./lib/logger')
8
- const { showUsage, showVersion } = require('./lib/show')
9
- const MarkdownHandler = require('./markdown')
10
- const WebSocketHandler = require('./websocket')
11
- const { rootDir, staticDir } = require('./lib/directory')
12
- const Params = require('./lib/params')
3
+ const express = require("express");
4
+ const expressWs = require("express-ws");
5
+ const serveIndex = require("serve-index");
6
+ const opener = require("opener");
7
+ const getLogger = require("./lib/logger");
8
+ const { showUsage, showVersion } = require("./lib/show");
9
+ const MarkdownHandler = require("./markdown");
10
+ const WebSocketHandler = require("./websocket");
11
+ const { rootDir, staticDir } = require("./lib/directory");
12
+ const Params = require("./lib/params");
13
13
 
14
14
  try {
15
- const params = new Params(process.env, process.argv.slice(2))
16
- if (params.help) showUsage()
17
- if (params.version) showVersion()
15
+ const params = new Params(process.env, process.argv.slice(2));
16
+ if (params.help) showUsage();
17
+ if (params.version) showVersion();
18
18
 
19
- const logger = getLogger(params.logLevel)
20
- const previewUrl = `http://localhost:${params.port}`
19
+ const logger = getLogger(params.logLevel);
20
+ const previewUrl = `http://localhost:${params.port}`;
21
21
 
22
- console.log('Root Directory :', rootDir)
23
- console.log('Default File :', params.filepath)
24
- console.log('Extensions :', params.extensions.join(', '))
25
- console.log('Template File :', params.template)
26
- console.log(`Preview URL : ${previewUrl}`)
22
+ console.log("Root Directory :", rootDir);
23
+ console.log("Default File :", params.filepath);
24
+ console.log("Extensions :", params.extensions.join(", "));
25
+ console.log("Template File :", params.template);
26
+ console.log(`Preview URL : ${previewUrl}`);
27
27
 
28
- const app = express()
29
- expressWs(app)
30
- app.get('/', (_req, res) => res.redirect(params.filepath))
31
- app.ws('/ws', WebSocketHandler(logger))
28
+ const app = express();
29
+ expressWs(app);
30
+ app.get("/", (_req, res) => res.redirect(params.filepath));
31
+ app.ws("/ws", WebSocketHandler(logger));
32
32
  params.extensions.forEach((ext) => {
33
- app.get(new RegExp(`^/.+\.${ext}$`), MarkdownHandler(params.template))
34
- })
35
- app.use(express.static(rootDir, { index: false }))
36
- app.use(express.static(staticDir, { index: false }))
37
- app.use(serveIndex(rootDir, { icons: true, view: 'details' }))
38
- app.listen(params.port)
33
+ app.get(new RegExp(`^/.+\.${ext}$`), MarkdownHandler(params.template));
34
+ });
35
+ app.use(express.static(rootDir, { index: false }));
36
+ app.use(express.static(staticDir, { index: false }));
37
+ app.use(serveIndex(rootDir, { icons: true, view: "details" }));
38
+ app.listen(params.port);
39
39
 
40
40
  if (!params.noOpener) {
41
- opener(previewUrl)
41
+ opener(previewUrl);
42
42
  }
43
-
44
43
  } catch (err) {
45
- console.error(err.message)
46
- showUsage(true)
44
+ console.error(err.message);
45
+ showUsage(true);
47
46
  }
@@ -1,11 +1,11 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
- const path = require('path');
3
+ const path = require("path");
4
4
 
5
5
  const rootDir = process.cwd();
6
- const projectDir = path.resolve(__dirname, '..', '..');
7
- const staticDir = path.resolve(projectDir, 'static');
8
- const templateDir = path.resolve(projectDir, 'template');
6
+ const projectDir = path.resolve(__dirname, "..", "..");
7
+ const staticDir = path.resolve(projectDir, "static");
8
+ const templateDir = path.resolve(projectDir, "template");
9
9
 
10
10
  module.exports = {
11
11
  rootDir,
package/src/lib/file.js CHANGED
@@ -1,6 +1,6 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
- const fs = require('fs');
3
+ const fs = require("fs");
4
4
 
5
5
  const existsFile = (filepath) => {
6
6
  try {
@@ -1,59 +1,59 @@
1
- 'use strict'
1
+ "use strict";
2
2
 
3
- const fs = require('fs')
4
- const path = require('path')
5
- const { rootDir } = require('./directory')
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const { rootDir } = require("./directory");
6
6
 
7
7
  class FileWatcher {
8
- constructor (logger) {
9
- this.logger = logger
10
- this._target = {}
8
+ constructor(logger) {
9
+ this.logger = logger;
10
+ this._target = {};
11
11
  setInterval(() => {
12
12
  Object.keys(this._target).forEach((filepath) => {
13
13
  try {
14
- const fileinfo = this._target[filepath]
15
- const currentLastModified = this.getFileLastModified(filepath)
14
+ const fileinfo = this._target[filepath];
15
+ const currentLastModified = this.getFileLastModified(filepath);
16
16
  if (fileinfo.lastModified !== currentLastModified) {
17
- this.logger.info('File update:', path.resolve(rootDir, filepath))
18
- fileinfo.lastModified = currentLastModified
17
+ this.logger.info("File update:", path.resolve(rootDir, filepath));
18
+ fileinfo.lastModified = currentLastModified;
19
19
  if (this._onFileChanged != null) {
20
- this._onFileChanged(this.getFileInfo(filepath))
20
+ this._onFileChanged(this.getFileInfo(filepath));
21
21
  }
22
22
  }
23
23
  } catch (err) {
24
- console.error(err)
24
+ console.error(err);
25
25
  }
26
- })
27
- }, 250)
26
+ });
27
+ }, 250 /* check 4 times per second */);
28
28
  }
29
29
 
30
- onFileChanged (callback) {
31
- this._onFileChanged = callback
30
+ onFileChanged(callback) {
31
+ this._onFileChanged = callback;
32
32
  }
33
33
 
34
- addTargetFile (filepath) {
35
- if (this._target[filepath] != null) return
36
- this.logger.debug('Add watch target:', filepath)
34
+ addTargetFile(filepath) {
35
+ if (this._target[filepath] != null) return;
36
+ this.logger.debug("Add watch target:", filepath);
37
37
  this._target[filepath] = {
38
38
  lastModified: this.getFileLastModified(filepath),
39
- }
39
+ };
40
40
  }
41
41
 
42
- removeTargetFile (filepath) {
43
- if (this._target[filepath] == null) return
44
- this.logger.debug('Remove watch target:', filepath)
45
- delete this._target[filepath]
42
+ removeTargetFile(filepath) {
43
+ if (this._target[filepath] == null) return;
44
+ this.logger.debug("Remove watch target:", filepath);
45
+ delete this._target[filepath];
46
46
  }
47
47
 
48
- getFileLastModified (filepath) {
49
- return fs.statSync(path.resolve(rootDir, filepath)).mtimeMs
48
+ getFileLastModified(filepath) {
49
+ return fs.statSync(path.resolve(rootDir, filepath)).mtimeMs;
50
50
  }
51
51
 
52
- getFileInfo (filepath) {
53
- const absolutePath = path.resolve(rootDir, filepath)
54
- const markdown = fs.readFileSync(absolutePath, 'utf-8')
55
- return { filepath, markdown }
52
+ getFileInfo(filepath) {
53
+ const absolutePath = path.resolve(rootDir, filepath);
54
+ const markdown = fs.readFileSync(absolutePath, "utf-8");
55
+ return { filepath, markdown };
56
56
  }
57
57
  }
58
58
 
59
- module.exports = FileWatcher
59
+ module.exports = FileWatcher;
package/src/lib/logger.js CHANGED
@@ -1,18 +1,18 @@
1
- const log4js = require('log4js');
1
+ const log4js = require("log4js");
2
2
 
3
3
  const getLogger = (logLevel) => {
4
4
  log4js.configure({
5
5
  appenders: {
6
6
  console: {
7
- type: 'console',
7
+ type: "console",
8
8
  layout: {
9
- type: 'basic',
9
+ type: "basic",
10
10
  },
11
11
  },
12
12
  },
13
13
  categories: {
14
14
  default: {
15
- appenders: ['console'],
15
+ appenders: ["console"],
16
16
  level: logLevel,
17
17
  },
18
18
  },
package/src/lib/params.js CHANGED
@@ -1,8 +1,8 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
- const path = require('path');
4
- const { rootDir, templateDir } = require('./directory');
5
- const { existsFile } = require('./file');
3
+ const path = require("path");
4
+ const { rootDir, templateDir } = require("./directory");
5
+ const { existsFile } = require("./file");
6
6
 
7
7
  class Params {
8
8
  constructor(env, argv) {
@@ -21,11 +21,11 @@ class Params {
21
21
 
22
22
  getDefaultParams() {
23
23
  return {
24
- filepath: 'README.md',
25
- extensions: 'md, markdown',
26
- template: 'default',
24
+ filepath: "README.md",
25
+ extensions: "md, markdown",
26
+ template: "default",
27
27
  port: 34567,
28
- logLevel: 'info',
28
+ logLevel: "info",
29
29
  noOpener: false,
30
30
  version: false,
31
31
  help: false,
@@ -47,7 +47,7 @@ class Params {
47
47
  params.port = env.MARKDOWN_PREVIEW_PORT;
48
48
  }
49
49
  if (env.MARKDOWN_PREVIEW_NO_OPENER) {
50
- params.noOpener = env.MARKDOWN_PREVIEW_NO_OPENER === 'true';
50
+ params.noOpener = env.MARKDOWN_PREVIEW_NO_OPENER === "true";
51
51
  }
52
52
  if (env.MARKDOWN_PREVIEW_LOG_LEVEL) {
53
53
  params.logLevel = env.MARKDOWN_PREVIEW_LOG_LEVEL;
@@ -59,40 +59,40 @@ class Params {
59
59
  const params = {};
60
60
  for (let i = 0; i < argv.length; i++) {
61
61
  switch (argv[i]) {
62
- case '-f':
63
- case '--file':
62
+ case "-f":
63
+ case "--file":
64
64
  params.filepath = argv[i + 1];
65
65
  i++;
66
66
  break;
67
- case '-e':
68
- case '--extensions':
67
+ case "-e":
68
+ case "--extensions":
69
69
  params.extensions = argv[i + 1];
70
70
  i++;
71
71
  break;
72
- case '-t':
73
- case '--template':
72
+ case "-t":
73
+ case "--template":
74
74
  params.template = argv[i + 1];
75
75
  i++;
76
76
  break;
77
- case '-p':
78
- case '--port':
77
+ case "-p":
78
+ case "--port":
79
79
  params.port = argv[i + 1];
80
80
  i++;
81
81
  break;
82
- case '-l':
83
- case '--log-level':
82
+ case "-l":
83
+ case "--log-level":
84
84
  params.logLevel = argv[i + 1];
85
85
  i++;
86
86
  break;
87
- case '--no-opener':
87
+ case "--no-opener":
88
88
  params.noOpener = true;
89
89
  break;
90
- case '-v':
91
- case '--version':
90
+ case "-v":
91
+ case "--version":
92
92
  params.version = true;
93
93
  break;
94
- case '-h':
95
- case '--help':
94
+ case "-h":
95
+ case "--help":
96
96
  params.help = true;
97
97
  break;
98
98
  default:
@@ -102,7 +102,6 @@ class Params {
102
102
  return params;
103
103
  }
104
104
 
105
-
106
105
  checkFilepath(filepath) {
107
106
  if (path.isAbsolute(filepath)) {
108
107
  throw new Error(`Absolute path is prohibited: ${filepath}`);
@@ -117,7 +116,7 @@ class Params {
117
116
  }
118
117
 
119
118
  checkExtensions(extensions) {
120
- const extensionList = extensions.split(',').map(ext => ext.trim());
119
+ const extensionList = extensions.split(",").map((ext) => ext.trim());
121
120
  if (extensionList.length === 0) {
122
121
  throw new Error(`Extensions is empty: ${extensions}`);
123
122
  }
@@ -139,11 +138,10 @@ class Params {
139
138
  return intPort;
140
139
  }
141
140
  throw new Error(`Invalid port: ${port}`);
142
- };
143
-
141
+ }
144
142
 
145
143
  checkLogLevel(logLevel) {
146
- if (['trace', 'debug', 'info', 'warn', 'error', 'fatal'].includes(logLevel)) {
144
+ if (["trace", "debug", "info", "warn", "error", "fatal"].includes(logLevel)) {
147
145
  return logLevel;
148
146
  }
149
147
  throw new Error(`Invalid log level: ${logLevel}`);
@@ -1,39 +1,43 @@
1
- const path = require('path');
2
- const { projectDir } = require('./directory');
3
- const Params = require('./params');
1
+ const path = require("path");
2
+ const { projectDir } = require("./directory");
3
+ const Params = require("./params");
4
4
 
5
5
  const DEFAULT_VALUES = {
6
- filepath: 'README.md',
7
- extensions: ['md', 'markdown'],
8
- template: path.resolve(projectDir, 'template/default.html'),
6
+ filepath: "README.md",
7
+ extensions: ["md", "markdown"],
8
+ template: path.resolve(projectDir, "template/default.html"),
9
9
  port: 34567,
10
- logLevel: 'info',
10
+ logLevel: "info",
11
11
  noOpener: false,
12
12
  version: false,
13
13
  help: false,
14
14
  };
15
15
 
16
- describe('Params', () => {
17
- it('not specify', () => {
16
+ describe("Params", () => {
17
+ it("not specify", () => {
18
18
  const params = new Params({}, []);
19
19
  expect(params._params).toEqual(DEFAULT_VALUES);
20
20
  });
21
21
 
22
- it('specify all short argument', () => {
22
+ it("specify all short argument", () => {
23
23
  const argv = [
24
- '-f', 'test/markdown/markdown1.md',
25
- '-e', 'ext1,ext2',
26
- '-t', 'test/template/template1.html',
27
- '-p', '100',
28
- '-v',
29
- '-h',
24
+ "-f",
25
+ "test/markdown/markdown1.md",
26
+ "-e",
27
+ "ext1,ext2",
28
+ "-t",
29
+ "test/template/template1.html",
30
+ "-p",
31
+ "100",
32
+ "-v",
33
+ "-h",
30
34
  ];
31
35
  const expectParams = {
32
- filepath: 'test/markdown/markdown1.md',
33
- extensions: ['ext1', 'ext2'],
34
- template: path.resolve(projectDir, 'test/template/template1.html'),
36
+ filepath: "test/markdown/markdown1.md",
37
+ extensions: ["ext1", "ext2"],
38
+ template: path.resolve(projectDir, "test/template/template1.html"),
35
39
  port: 100,
36
- logLevel: 'info',
40
+ logLevel: "info",
37
41
  noOpener: false,
38
42
  version: true,
39
43
  help: true,
@@ -42,23 +46,28 @@ describe('Params', () => {
42
46
  expect(params._params).toEqual(expectParams);
43
47
  });
44
48
 
45
- it('specify all long argument', () => {
49
+ it("specify all long argument", () => {
46
50
  const argv = [
47
- '--file', 'test/markdown/markdown1.md',
48
- '--extensions', 'ext1,ext2',
49
- '--template', 'test/template/template1.html',
50
- '--port', '100',
51
- '--log-level', 'trace',
52
- '--no-opener',
53
- '--version',
54
- '--help',
51
+ "--file",
52
+ "test/markdown/markdown1.md",
53
+ "--extensions",
54
+ "ext1,ext2",
55
+ "--template",
56
+ "test/template/template1.html",
57
+ "--port",
58
+ "100",
59
+ "--log-level",
60
+ "trace",
61
+ "--no-opener",
62
+ "--version",
63
+ "--help",
55
64
  ];
56
65
  const expectParams = {
57
- filepath: 'test/markdown/markdown1.md',
58
- extensions: ['ext1', 'ext2'],
59
- template: path.resolve(projectDir, 'test/template/template1.html'),
66
+ filepath: "test/markdown/markdown1.md",
67
+ extensions: ["ext1", "ext2"],
68
+ template: path.resolve(projectDir, "test/template/template1.html"),
60
69
  port: 100,
61
- logLevel: 'trace',
70
+ logLevel: "trace",
62
71
  noOpener: true,
63
72
  version: true,
64
73
  help: true,
@@ -67,21 +76,21 @@ describe('Params', () => {
67
76
  expect(params._params).toEqual(expectParams);
68
77
  });
69
78
 
70
- it('specify all environment variable', () => {
79
+ it("specify all environment variable", () => {
71
80
  const env = {
72
- MARKDOWN_PREVIEW_FILE: 'test/markdown/markdown1.md',
73
- MARKDOWN_PREVIEW_EXTENSIONS: 'ext1, ext2',
74
- MARKDOWN_PREVIEW_TEMPLATE: 'test/template/template1.html',
75
- MARKDOWN_PREVIEW_PORT: '100',
76
- MARKDOWN_PREVIEW_LOG_LEVEL: 'trace',
77
- MARKDOWN_PREVIEW_NO_OPENER: 'true',
81
+ MARKDOWN_PREVIEW_FILE: "test/markdown/markdown1.md",
82
+ MARKDOWN_PREVIEW_EXTENSIONS: "ext1, ext2",
83
+ MARKDOWN_PREVIEW_TEMPLATE: "test/template/template1.html",
84
+ MARKDOWN_PREVIEW_PORT: "100",
85
+ MARKDOWN_PREVIEW_LOG_LEVEL: "trace",
86
+ MARKDOWN_PREVIEW_NO_OPENER: "true",
78
87
  };
79
88
  const expectParams = {
80
- filepath: 'test/markdown/markdown1.md',
81
- extensions: ['ext1', 'ext2'],
82
- template: path.resolve(projectDir, 'test/template/template1.html'),
89
+ filepath: "test/markdown/markdown1.md",
90
+ extensions: ["ext1", "ext2"],
91
+ template: path.resolve(projectDir, "test/template/template1.html"),
83
92
  port: 100,
84
- logLevel: 'trace',
93
+ logLevel: "trace",
85
94
  noOpener: true,
86
95
  version: false,
87
96
  help: false,
package/src/lib/show.js CHANGED
@@ -1,5 +1,6 @@
1
- 'use strict';
2
- const pkg = require('../../package');
1
+ "use strict";
2
+
3
+ const pkg = require("../../package");
3
4
 
4
5
  const showUsage = (error = false) => {
5
6
  const usage = `
@@ -1,4 +1,4 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  class SocketManager {
4
4
  constructor() {
@@ -14,9 +14,7 @@ class SocketManager {
14
14
  }
15
15
 
16
16
  getSockets(filepath) {
17
- return this._sockets
18
- .filter(({ filepath: fp }) => fp === filepath)
19
- .map(s => s.socket);
17
+ return this._sockets.filter(({ filepath: fp }) => fp === filepath).map((s) => s.socket);
20
18
  }
21
19
 
22
20
  countSocket(filepath = null) {
@@ -1,18 +1,18 @@
1
- const SocketManager = require('./socket_manager');
1
+ const SocketManager = require("./socket_manager");
2
2
 
3
- const dummySocket1 = { name: 'socket1' };
4
- const dummySocket2 = { name: 'socket2' };
5
- const dummySocket3 = { name: 'socket3' };
3
+ const dummySocket1 = { name: "socket1" };
4
+ const dummySocket2 = { name: "socket2" };
5
+ const dummySocket3 = { name: "socket3" };
6
6
 
7
- const dummyFilepath1 = 'file1';
8
- const dummyFilepath2 = 'file2';
7
+ const dummyFilepath1 = "file1";
8
+ const dummyFilepath2 = "file2";
9
9
 
10
10
  const dummyInfo1 = { socket: dummySocket1, filepath: dummyFilepath1 };
11
11
  const dummyInfo2 = { socket: dummySocket2, filepath: dummyFilepath2 };
12
12
  const dummyInfo3 = { socket: dummySocket3, filepath: dummyFilepath2 };
13
13
 
14
- describe('SocketManager', () => {
15
- it('works normally', () => {
14
+ describe("SocketManager", () => {
15
+ it("works normally", () => {
16
16
  const socketManager = new SocketManager();
17
17
  expect(socketManager._sockets).toEqual([]);
18
18
 
@@ -31,7 +31,6 @@ describe('SocketManager', () => {
31
31
  expect(socketManager.countSocket(dummyFilepath1)).toEqual(1);
32
32
  expect(socketManager.countSocket(dummyFilepath2)).toEqual(2);
33
33
 
34
-
35
34
  socketManager.removeSocket(dummySocket2);
36
35
  expect(socketManager._sockets).toEqual([dummyInfo1, dummyInfo3]);
37
36
 
package/src/markdown.js CHANGED
@@ -1,16 +1,16 @@
1
- 'use strict'
1
+ "use strict";
2
2
 
3
- const path = require('path')
4
- const { rootDir } = require('./lib/directory')
5
- const { existsFile } = require('./lib/file')
3
+ const path = require("path");
4
+ const { rootDir } = require("./lib/directory");
5
+ const { existsFile } = require("./lib/file");
6
6
 
7
7
  const MarkdownHandler = (template) => (req, res, next) => {
8
- const filepath = path.resolve(rootDir, decodeURIComponent(req.path.substr(1)))
8
+ const filepath = path.resolve(rootDir, decodeURIComponent(req.path.substr(1)));
9
9
  if (existsFile(filepath)) {
10
- res.sendFile(template)
10
+ res.sendFile(template);
11
11
  } else {
12
- next()
12
+ next();
13
13
  }
14
- }
14
+ };
15
15
 
16
- module.exports = MarkdownHandler
16
+ module.exports = MarkdownHandler;
package/src/websocket.js CHANGED
@@ -1,9 +1,9 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
- const path = require('path');
4
- const FileWatcher = require('./lib/file_watcher');
5
- const SocketManager = require('./lib/socket_manager');
6
- const { rootDir } = require('./lib/directory');
3
+ const path = require("path");
4
+ const FileWatcher = require("./lib/file_watcher");
5
+ const SocketManager = require("./lib/socket_manager");
6
+ const { rootDir } = require("./lib/directory");
7
7
 
8
8
  const WebSocketHandler = (logger) => {
9
9
  let socketSeqNo = 1;
@@ -18,13 +18,13 @@ const WebSocketHandler = (logger) => {
18
18
  return (ws, req) => {
19
19
  const wsSeqNo = socketSeqNo++;
20
20
  try {
21
- logger.debug('WebSocket connected:', wsSeqNo);
21
+ logger.debug("WebSocket connected:", wsSeqNo);
22
22
  const filepath = path.resolve(rootDir, decodeURIComponent(req.query.path.substr(1)));
23
23
  fileWatcher.addTargetFile(filepath);
24
24
  socketManager.addSocket(ws, filepath);
25
25
 
26
- ws.on('close', () => {
27
- logger.debug('WebSocket close:', wsSeqNo);
26
+ ws.on("close", () => {
27
+ logger.debug("WebSocket close:", wsSeqNo);
28
28
  socketManager.removeSocket(ws);
29
29
  if (socketManager.countSocket(filepath) === 0) {
30
30
  fileWatcher.removeTargetFile(filepath);
@@ -0,0 +1,24 @@
1
+ <!doctype html>
2
+ <html lang="ja">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Markdown Preview</title>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.1.0/github-markdown-dark.min.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/styles/github-dark-dimmed.min.css">
9
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>
10
+ </head>
11
+ <body style="margin: 0 auto; max-width: 882px; padding: 32px; background-color: #0d1117;">
12
+ <div class="markdown-body">
13
+ <div id="content"></div>
14
+ </div>
15
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/4.1.1/marked.min.js"></script>
16
+ <script src="/markdown-preview-websocket.js"></script>
17
+ <script type="text/javascript">
18
+ connectMarkdownPreview(({ markdown }) => {
19
+ document.getElementById('content').innerHTML = marked.parse(markdown);
20
+ document.querySelectorAll('pre code').forEach(block => hljs.highlightBlock(block));
21
+ });
22
+ </script>
23
+ </body>
24
+ </html>
@@ -4,15 +4,15 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Markdown Preview</title>
7
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/4.0.0/github-markdown.css">
8
- <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.16.2/build/styles/github.min.css">
9
- <script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.16.2/build/highlight.min.js"></script>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.1.0/github-markdown-light.min.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/styles/github.min.css">
9
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>
10
10
  </head>
11
11
  <body style="margin: 0 auto; max-width: 882px; padding: 32px;">
12
12
  <div class="markdown-body">
13
13
  <div id="content"></div>
14
14
  </div>
15
- <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
15
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/4.1.1/marked.min.js"></script>
16
16
  <script src="/markdown-preview-websocket.js"></script>
17
17
  <script type="text/javascript">
18
18
  connectMarkdownPreview(({ markdown }) => {