This commit is contained in:
Morten Olsen
2023-03-28 08:10:46 +02:00
parent 9b1a067d56
commit 7adf03c83f
44 changed files with 1780 additions and 411 deletions

View File

@@ -1,11 +1,11 @@
import { resolve } from "path";
import { decode } from "html-entities";
import { marked } from "marked";
import remark from "remark";
import visit from "unist-util-visit";
import { Bundler } from "../../bundler";
import { createImage } from "../../resources/image";
import { renderer } from "./latex";
import { resolve } from 'path';
import { decode } from 'html-entities';
import { marked } from 'marked';
import remark from 'remark';
import visit from 'unist-util-visit';
import { Bundler } from '../../bundler';
import { createImage } from '../../resources/image';
import { renderer } from './latex';
type MarkdownBundleImagesOptions = {
cwd: string;
@@ -13,15 +13,11 @@ type MarkdownBundleImagesOptions = {
bundler: Bundler;
};
const markdownBundleImages = async ({
bundler,
cwd,
content,
}: MarkdownBundleImagesOptions) => {
const markdownBundleImages = async ({ bundler, cwd, content }: MarkdownBundleImagesOptions) => {
const result = await remark()
.use(() => (tree) => {
visit(tree, "image", (node) => {
if (!("url" in node)) {
visit(tree, 'image', (node) => {
if (!('url' in node)) {
return;
}
const url = node.url as string;
@@ -29,7 +25,7 @@ const markdownBundleImages = async ({
const image = createImage({
image: path,
bundler,
format: "webp",
format: 'avif',
});
const newUrl = image;
node.url = newUrl;
@@ -46,7 +42,7 @@ type MarkdownToLatexOptions = {
const markdownToLatex = ({ root, content }: MarkdownToLatexOptions) => {
const render: any = {
...renderer(0),
...renderer(0, root),
};
const latex = marked(content, {
renderer: render,

View File

@@ -1,19 +1,20 @@
import { decode } from "html-entities";
import { existsSync } from "fs";
import { decode } from 'html-entities';
import { existsSync } from 'fs';
import { resolve } from 'path';
const latexTypes = ["", "section", "subsection", "paragraph", "subparagraph"];
const latexTypes = ['', 'section', 'subsection', 'paragraph', 'subparagraph'];
const sanitize = (text?: string) => {
if (!text) {
return "";
return '';
}
return decode(text)
.replace("&", "\\&")
.replace("_", "\\_")
.replace(/([^\\])\}/g, "$1\\}")
.replace(/([^\\])\{/g, "$1\\{")
.replace(/[^\\]\[/g, "\\[")
.replace(/#/g, "\\#");
.replace('&', '\\&')
.replace('_', '\\_')
.replace(/([^\\])\}/g, '$1\\}')
.replace(/([^\\])\{/g, '$1\\{')
.replace(/[^\\]\[/g, '\\[')
.replace(/#/g, '\\#');
};
type Renderer = (depth: number) => {
@@ -30,7 +31,7 @@ type Renderer = (depth: number) => {
image?: (link: string) => string;
};
const renderer = (outerDepth: number) => ({
const renderer = (outerDepth: number, cwd: string) => ({
heading: (text: string, depth: number) => {
return `\\${latexTypes[outerDepth + depth]}{${sanitize(text)}}\n\n`;
},
@@ -76,13 +77,12 @@ const renderer = (outerDepth: number) => ({
return `\\texttt{${sanitize(code)}}`;
},
image: (link: string) => {
if (!existsSync(link)) {
return "Online image not supported";
const path = resolve(cwd, link);
if (!existsSync(path)) {
return `Online image not supported ${path}`;
}
return `\\begin{figure}[h!]
\\includegraphics[width=0.5\\textwidth]{${link}}
\\centering
\\end{figure}
return `
\\noindent\\includegraphics[width=\\linewidth]{${path}}
`;
},
});

View File

@@ -1,14 +1,10 @@
import { Observable } from "../../observable";
import { Observable } from '../../observable';
const forEach = async <T extends Observable<any[]>>(
observable: T,
fn: (
value: T extends Observable<infer U>
? U extends Array<infer A>
? A
: never
: never
) => Promise<void>
value: T extends Observable<infer U> ? (U extends Array<infer A> ? A : never) : never,
) => Promise<void>,
) => {
const knownValues = new Set();
const update = async () => {