Compare commits

...

9 Commits

Author SHA1 Message Date
448d93f1f5
cleanup
All checks were successful
Build and test / build-and-test (18.x) (push) Successful in 19s
Build and test / build-and-test (20.x) (push) Successful in 22s
2023-08-19 16:05:21 -07:00
ce4c2c171a
0.3.6
All checks were successful
Build and publish / build-and-publish (push) Successful in 20s
2023-08-19 16:03:21 -07:00
619762a5cd
fix base url issues 2023-08-19 16:03:08 -07:00
4cfeb23982
add gitea actions
All checks were successful
Build and publish / build-and-publish (push) Successful in 21s
2023-08-19 14:31:44 -07:00
2051cb6644
0.3.5 2023-08-19 14:24:04 -07:00
02b9e94d3e
add newline after rendered headers 2023-08-19 14:23:59 -07:00
43e15a90a9
add support for embed, media elements 2023-07-16 16:20:32 -07:00
ea133cb0a7
0.3.4 2023-06-10 17:40:17 -07:00
dff6c31481
add support for http QUERY method in prism 2023-06-10 17:40:10 -07:00
11 changed files with 132 additions and 5 deletions

View File

@ -0,0 +1,36 @@
name: Build and publish
on:
- workflow_dispatch
# push:
# branches:
# - master
jobs:
build-and-publish:
runs-on: ubuntu-latest
env:
NPM_PUBLISH_TOKEN: ${{ secrets.NPM_TOKEN }}
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Use Node.js 20
uses: actions/setup-node@v3
with:
node-version: 20
- name: Login to package registry
run: |
npm config set @doc-utils:registry https://gitea.jbrumond.me/api/packages/doc-utils/npm/
npm config set -- '//gitea.jbrumond.me/api/packages/doc-utils/npm/:_authToken' "$NPM_PUBLISH_TOKEN"
- name: Install dependencies
run: npm ci
- name: Compile TypeScript
run: npm run tsc
- name: Publish package
run: npm publish

View File

@ -0,0 +1,40 @@
name: Build and test
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
build-and-test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Login to package registry
run: |
npm config set @doc-utils:registry https://gitea.jbrumond.me/api/packages/doc-utils/npm/
npm config set -- '//gitea.jbrumond.me/api/packages/doc-utils/npm/:_authToken' "$NPM_PUBLISH_TOKEN"
- name: Install dependencies
run: npm ci
- name: Compile TypeScript
run: npm run tsc
# todo: tests
- name: Run tests
run: exit 0

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "@doc-utils/markdown2html",
"version": "0.3.3",
"version": "0.3.6",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@doc-utils/markdown2html",
"version": "0.3.3",
"version": "0.3.6",
"dependencies": {
"bytefield-svg": "^1.6.1",
"dompurify": "^2.3.6",

View File

@ -1,6 +1,6 @@
{
"name": "@doc-utils/markdown2html",
"version": "0.3.3",
"version": "0.3.6",
"publishConfig": {
"registry": "https://gitea.home.jbrumond.me/api/packages/doc-utils/npm/"
},

View File

@ -2,10 +2,20 @@
import { marked } from 'marked';
import { MarkdownOptions } from './render';
export const placeholder_base_url = 'https://markdown2html.base-url.placeholder.invalid';
export function base_url_walk_tokens(token: marked.Token, options: MarkdownOptions) {
if (options.base_url) {
const base_url = options.base_url.startsWith('http://') || options.base_url.startsWith('https://')
? options.base_url
: placeholder_base_url + options.base_url;
if (token.type === 'link' || token.type === 'image') {
token.href = (new URL(token.href, options.base_url)).toString();
token.href = (new URL(token.href, base_url)).toString();
if (token.href.startsWith(placeholder_base_url)) {
token.href = token.href.slice(placeholder_base_url.length);
}
}
}
}

33
src/embed.ts Normal file
View File

@ -0,0 +1,33 @@
import type { marked } from 'marked';
import { MarkdownOptions } from './render';
export interface EmbedToken extends marked.Tokens.Generic {
media_type: string;
href: string;
}
export function embed_ext(renderer: marked.Renderer, opts: MarkdownOptions) : marked.TokenizerExtension & marked.RendererExtension {
return {
name: 'embed',
level: 'inline',
start: (src) => src.match(/\{&/)?.index,
tokenizer(src, tokens) {
const rule = /^\{&\s+([^\s]+):\s*([^\s]+)\s+&\}/;
const match = rule.exec(src);
if (match) {
return {
type: 'embed',
raw: match[0],
media_type: match[1],
href: match[2],
tokens: [ ]
};
}
},
renderer(token: EmbedToken) {
return `<embed type="${token.media_type}" src="${token.href}"></embed>`;
}
};
}

View File

@ -9,5 +9,6 @@ export function sanitize_html(html: string, custom_elements?: CustomElementHandl
const dom_purify = createDOMPurify(window as any as Window);
return dom_purify.sanitize(html, {
CUSTOM_ELEMENT_HANDLING: custom_elements,
ADD_TAGS: [ 'embed', 'object', 'video', 'audio', 'iframe' ],
});
}

4
src/prism/http.ts Normal file
View File

@ -0,0 +1,4 @@
import { languages } from 'prismjs';
languages.http['request-line'].pattern = /^(?:CONNECT|DELETE|GET|HEAD|QUERY|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m;

View File

@ -4,6 +4,7 @@ import load_languages = require('prismjs/components/index');
load_languages();
require('./wasm');
require('./http');
// hooks.add('after-tokenize', (env) => {
// //

View File

@ -10,6 +10,7 @@ import { footnote_list_ext, footnote_ref_ext } from './footnotes';
import { description_list_ext } from './description-list';
import { resolve_async_bindings } from './async-steps';
import { base_url_walk_tokens } from './base-url';
import { embed_ext } from './embed';
export interface MarkdownOptions {
base_url?: string;
@ -64,6 +65,7 @@ function setup_marked(options: MarkdownOptions, marked_options: marked.MarkedOpt
description_list_ext(marked_options.renderer, options),
section_ext(marked_options.renderer, options),
icon_ext(marked_options.renderer, options),
embed_ext(marked_options.renderer, options),
...(options.extensions || [ ]).map((ext) => {
return ext(marked_options.renderer, options);
}),

View File

@ -37,7 +37,7 @@ function heading(renderer: marked.Renderer, opts: MarkdownOptions) {
+ `\n\t</a>`;
}
return `\n<h${level} ${html_attrs.join(' ')}>\n\t${text}\n</h${level}>`;
return `\n<h${level} ${html_attrs.join(' ')}>\n\t${text}\n</h${level}>\n`;
};
}