import embeds

This commit is contained in:
Philipinho
2025-05-26 15:37:35 -07:00
parent af54e1827d
commit 36a573fce9
2 changed files with 46 additions and 7 deletions

View File

@ -28,8 +28,7 @@ import { markdownToHtml } from '@docmost/editor-ext';
import { getAttachmentFolderPath } from '../../core/attachment/attachment.utils'; import { getAttachmentFolderPath } from '../../core/attachment/attachment.utils';
import { AttachmentType } from '../../core/attachment/attachment.constants'; import { AttachmentType } from '../../core/attachment/attachment.constants';
import { getProsemirrorContent } from '../../common/helpers/prosemirror/utils'; import { getProsemirrorContent } from '../../common/helpers/prosemirror/utils';
import { not } from 'rxjs/internal/util/not'; import { formatImportHtml, notionFormatter } from './import-formatter';
import { notionFormatter } from './import-formatter';
@Injectable() @Injectable()
export class FileTaskService { export class FileTaskService {
@ -68,9 +67,8 @@ export class FileTaskService {
await pipeline(fileStream, createWriteStream(tmpZipPath)); await pipeline(fileStream, createWriteStream(tmpZipPath));
await extractZip(tmpZipPath, tmpExtractDir); await extractZip(tmpZipPath, tmpExtractDir);
console.log('extract here');
// TODO: internal link mentions, backlinks, attachments // TODO: backlinks
try { try {
await this.updateTaskStatus(fileTaskId, FileTaskStatus.Processing); await this.updateTaskStatus(fileTaskId, FileTaskStatus.Processing);
// if type == generic // if type == generic
@ -127,8 +125,6 @@ export class FileTaskService {
content = await markdownToHtml(content); content = await markdownToHtml(content);
} }
//content = this.stripAllStyles(content)
content = await this.rewriteLocalFilesInHtml({ content = await this.rewriteLocalFilesInHtml({
html: content, html: content,
pageRelativePath: relPath, pageRelativePath: relPath,
@ -209,7 +205,7 @@ export class FileTaskService {
); );
const pmState = getProsemirrorContent( const pmState = getProsemirrorContent(
await this.importService.processHTML(notionFormatter(htmlContent)), await this.importService.processHTML(formatImportHtml(htmlContent)),
); );
const { title, prosemirrorJson } = const { title, prosemirrorJson } =

View File

@ -1,10 +1,53 @@
import { Window } from 'happy-dom'; import { Window } from 'happy-dom';
import { cleanUrlString } from './file.utils';
import { getEmbedUrlAndProvider } from '@docmost/editor-ext';
export function formatImportHtml(html: string) {
const pmHtml = notionFormatter(html);
return defaultHtmlFormatter(pmHtml);
}
export function defaultHtmlFormatter(html: string): string {
const window = new Window();
const doc = window.document;
doc.body.innerHTML = html;
// embed providers
const anchors = Array.from(doc.getElementsByTagName('a'));
for (const a of anchors) {
const href = cleanUrlString(a.getAttribute('href')) ?? '';
if (!href) continue;
const embedProvider = getEmbedUrlAndProvider(href);
if (embedProvider) {
const embed = doc.createElement('div');
embed.setAttribute('data-type', 'embed');
embed.setAttribute('data-src', href);
embed.setAttribute('data-provider', embedProvider.provider);
embed.setAttribute('data-align', 'center');
embed.setAttribute('data-width', '640');
embed.setAttribute('data-height', '480');
a.replaceWith(embed);
}
}
return doc.body.innerHTML;
}
export function notionFormatter(html: string): string { export function notionFormatter(html: string): string {
const window = new Window(); const window = new Window();
const doc = window.document; const doc = window.document;
doc.body.innerHTML = html; doc.body.innerHTML = html;
// remove empty description paragraph
doc.querySelectorAll('p.page-description').forEach((p) => {
if (p.textContent?.trim() === '') {
p.remove();
}
});
// Block math // Block math
for (const fig of Array.from(doc.querySelectorAll('figure.equation'))) { for (const fig of Array.from(doc.querySelectorAll('figure.equation'))) {
// get TeX source from the MathML <annotation> // get TeX source from the MathML <annotation>