mirror of
https://github.com/docmost/docmost.git
synced 2025-11-14 07:01:15 +10:00
import embeds
This commit is contained in:
@ -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 } =
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user