1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00

Chore: Export extractNoteFromHTML from notes services library (#9086)

This commit is contained in:
pedr 2023-10-17 17:10:18 -03:00 committed by GitHub
parent d50d940f3c
commit c06ca87573
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 26 deletions

View File

@ -48,7 +48,7 @@ type ImageObject = {
naturalHeight?: number; naturalHeight?: number;
}; };
export function getImageSizes(element: HTMLElement, forceAbsoluteUrls = false) { export function getImageSizes(element: Document, forceAbsoluteUrls = false) {
const output: Record<string, ImageObject[]> = {}; const output: Record<string, ImageObject[]> = {};
const images = element.getElementsByTagName('img'); const images = element.getElementsByTagName('img');

View File

@ -27,6 +27,7 @@ const { fileExtension, safeFileExtension, safeFilename, filename } = require('..
const { MarkupToHtml } = require('@joplin/renderer'); const { MarkupToHtml } = require('@joplin/renderer');
const { ErrorNotFound } = require('../utils/errors'); const { ErrorNotFound } = require('../utils/errors');
import { fileUriToPath } from '@joplin/utils/url'; import { fileUriToPath } from '@joplin/utils/url';
import { NoteEntity } from '../../database/types';
const logger = Logger.create('routes/notes'); const logger = Logger.create('routes/notes');
@ -38,7 +39,31 @@ function htmlToMdParser() {
return htmlToMdParser_; return htmlToMdParser_;
} }
async function requestNoteToNote(requestNote: any) { type RequestNote = {
id?: any;
parent_id?: string;
title: string;
body?: string;
latitude?: number;
longitude?: number;
altitude?: number;
author?: string;
source_url?: string;
is_todo?: number;
todo_due?: number;
todo_completed?: number;
user_updated_time?: number;
user_created_time?: number;
markup_language?: number;
body_html: string;
base_url?: string;
convert_to: string;
anchor_names?: any[];
image_sizes?: object;
stylesheets: any;
};
async function requestNoteToNote(requestNote: RequestNote): Promise<NoteEntity> {
const output: any = { const output: any = {
title: requestNote.title ? requestNote.title : '', title: requestNote.title ? requestNote.title : '',
body: requestNote.body ? requestNote.body : '', body: requestNote.body ? requestNote.body : '',
@ -337,6 +362,34 @@ async function attachImageFromDataUrl(note: any, imageDataUrl: string, cropRect:
return await shim.attachFileToNote(note, tempFilePath); return await shim.attachFileToNote(note, tempFilePath);
} }
export const extractNoteFromHTML = async (requestNote: RequestNote, requestId: number, imageSizes: any) => {
const note = await requestNoteToNote(requestNote);
const mediaUrls = extractMediaUrls(note.markup_language, note.body);
logger.info(`Request (${requestId}): Downloading media files: ${mediaUrls.length}`);
const mediaFiles = await downloadMediaFiles(mediaUrls); // , allowFileProtocolImages);
logger.info(`Request (${requestId}): Creating resources from paths: ${Object.getOwnPropertyNames(mediaFiles).length}`);
const resources = await createResourcesFromPaths(mediaFiles);
await removeTempFiles(resources);
note.body = replaceUrlsByResources(note.markup_language, note.body, resources, imageSizes);
logger.info(`Request (${requestId}): Saving note...`);
const saveOptions = defaultSaveOptions('POST', note.id);
saveOptions.autoTimestamp = false; // No auto-timestamp because user may have provided them
const timestamp = Date.now();
note.updated_time = timestamp;
note.created_time = timestamp;
if (!('user_updated_time' in note)) note.user_updated_time = timestamp;
if (!('user_created_time' in note)) note.user_created_time = timestamp;
return { note, saveOptions, resources };
};
export default async function(request: Request, id: string = null, link: string = null) { export default async function(request: Request, id: string = null, link: string = null) {
if (request.method === 'GET') { if (request.method === 'GET') {
if (link && link === 'tags') { if (link && link === 'tags') {
@ -368,31 +421,9 @@ export default async function(request: Request, id: string = null, link: string
logger.info('Images:', imageSizes); logger.info('Images:', imageSizes);
let note: any = await requestNoteToNote(requestNote); const extracted = await extractNoteFromHTML(requestNote, requestId, imageSizes);
const mediaUrls = extractMediaUrls(note.markup_language, note.body); let note = await Note.save(extracted.note, extracted.saveOptions);
logger.info(`Request (${requestId}): Downloading media files: ${mediaUrls.length}`);
let result = await downloadMediaFiles(mediaUrls); // , allowFileProtocolImages);
logger.info(`Request (${requestId}): Creating resources from paths: ${Object.getOwnPropertyNames(result).length}`);
result = await createResourcesFromPaths(result);
await removeTempFiles(result);
note.body = replaceUrlsByResources(note.markup_language, note.body, result, imageSizes);
logger.info(`Request (${requestId}): Saving note...`);
const saveOptions = defaultSaveOptions('POST', note.id);
saveOptions.autoTimestamp = false; // No auto-timestamp because user may have provided them
const timestamp = Date.now();
note.updated_time = timestamp;
note.created_time = timestamp;
if (!('user_updated_time' in note)) note.user_updated_time = timestamp;
if (!('user_created_time' in note)) note.user_created_time = timestamp;
note = await Note.save(note, saveOptions);
if (requestNote.tags) { if (requestNote.tags) {
const tagTitles = requestNote.tags.split(','); const tagTitles = requestNote.tags.split(',');