Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
448d93f1f5 | |||
ce4c2c171a | |||
619762a5cd | |||
4cfeb23982 | |||
2051cb6644 | |||
02b9e94d3e | |||
43e15a90a9 |
36
.gitea/workflows/build-and-pubilsh.yaml
Normal file
36
.gitea/workflows/build-and-pubilsh.yaml
Normal 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
|
40
.gitea/workflows/build-and-test.yaml
Normal file
40
.gitea/workflows/build-and-test.yaml
Normal 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
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@doc-utils/markdown2html",
|
||||
"version": "0.3.4",
|
||||
"version": "0.3.6",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@doc-utils/markdown2html",
|
||||
"version": "0.3.4",
|
||||
"version": "0.3.6",
|
||||
"dependencies": {
|
||||
"bytefield-svg": "^1.6.1",
|
||||
"dompurify": "^2.3.6",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@doc-utils/markdown2html",
|
||||
"version": "0.3.4",
|
||||
"version": "0.3.6",
|
||||
"publishConfig": {
|
||||
"registry": "https://gitea.home.jbrumond.me/api/packages/doc-utils/npm/"
|
||||
},
|
||||
|
@ -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
33
src/embed.ts
Normal 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>`;
|
||||
}
|
||||
};
|
||||
}
|
@ -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' ],
|
||||
});
|
||||
}
|
||||
|
@ -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);
|
||||
}),
|
||||
|
@ -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`;
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user