fix: convert html to markdown before save to obsidian

This commit is contained in:
Stephen Zhou 2024-10-23 23:36:59 +08:00
parent 6e949bb6a5
commit bef80de315
No known key found for this signature in database
4 changed files with 84 additions and 2 deletions

View File

@ -62,6 +62,7 @@
"franc-min": "6.2.0",
"fuse.js": "7.0.0",
"hast-util-to-jsx-runtime": "2.3.2",
"hast-util-to-mdast": "^10.1.0",
"hast-util-to-text": "4.0.2",
"i18next": "^23.16.0",
"i18next-browser-languagedetector": "8.0.0",
@ -72,6 +73,7 @@
"lethargy": "1.0.9",
"lodash-es": "4.17.21",
"masonic": "4.0.1",
"mdast-util-to-markdown": "^2.1.0",
"nanoid": "5.0.7",
"ofetch": "1.4.1",
"path-to-regexp": "8.2.0",

View File

@ -33,6 +33,7 @@ import { shortcuts } from "~/constants/shortcuts"
import { tipcClient } from "~/lib/client"
import { nextFrame } from "~/lib/dom"
import { FeedViewType } from "~/lib/enum"
import { parseHtml } from "~/lib/parse-html"
import { getOS } from "~/lib/utils"
import StarAnimationUri from "~/lottie/star.lottie?url"
import type { CombinedEntryModel } from "~/models"
@ -427,7 +428,7 @@ export const useEntryActions = ({
saveToObsidian.mutate({
url: populatedEntry.entries.url,
title: populatedEntry.entries.title || "",
content: populatedEntry.entries.content || "",
content: parseHtml(populatedEntry.entries.content || "").toMarkdown(),
author: populatedEntry.entries.author || "",
publishedAt: populatedEntry.entries.publishedAt || "",
vaultPath: obsidianVaultPath,

View File

@ -2,7 +2,9 @@ import type { Element, Parent, Text } from "hast"
import type { Schema } from "hast-util-sanitize"
import type { Components } from "hast-util-to-jsx-runtime"
import { toJsxRuntime } from "hast-util-to-jsx-runtime"
import { toMdast } from "hast-util-to-mdast"
import { toText } from "hast-util-to-text"
import { toMarkdown } from "mdast-util-to-markdown"
import { createElement } from "react"
import { Fragment, jsx, jsxs } from "react/jsx-runtime"
import { renderToString } from "react-dom/server"
@ -235,6 +237,7 @@ export const parseHtml = (
},
}),
toText: () => toText(hastTree),
toMarkdown: () => toMarkdown(toMdast(hastTree)),
}
}

View File

@ -477,6 +477,9 @@ importers:
hast-util-to-jsx-runtime:
specifier: 2.3.2
version: 2.3.2
hast-util-to-mdast:
specifier: ^10.1.0
version: 10.1.0
hast-util-to-text:
specifier: 4.0.2
version: 4.0.2
@ -507,6 +510,9 @@ importers:
masonic:
specifier: 4.0.1
version: 4.0.1(react@18.3.1)
mdast-util-to-markdown:
specifier: ^2.1.0
version: 2.1.0
nanoid:
specifier: 5.0.7
version: 5.0.7
@ -3599,7 +3605,7 @@ packages:
'@radix-ui/react-slot@1.1.0':
resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
peerDependencies:
'@types/react': '*'
'@types/react': npm:types-react@19.0.0-rc.1
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
@ -6541,6 +6547,9 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
hast-util-embedded@3.0.0:
resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==}
hast-util-excerpt@2.0.0:
resolution: {integrity: sha512-3hM4U3Tjvx8bn+KGM51BA2VL6poq3AyOHguq3dzDjI74lxYZfOV1zAEEiSbcGd8CXgx9N9JRS5MlS4izTWJRig==}
@ -6553,12 +6562,21 @@ packages:
hast-util-has-property@3.0.0:
resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==}
hast-util-is-body-ok-link@3.0.1:
resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==}
hast-util-is-element@3.0.0:
resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
hast-util-minify-whitespace@1.0.1:
resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==}
hast-util-parse-selector@4.0.0:
resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
hast-util-phrasing@3.0.1:
resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==}
hast-util-sanitize@5.0.1:
resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==}
@ -6571,6 +6589,9 @@ packages:
hast-util-to-jsx-runtime@2.3.2:
resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==}
hast-util-to-mdast@10.1.0:
resolution: {integrity: sha512-DsL/SvCK9V7+vfc6SLQ+vKIyBDXTk2KLSbfBYkH4zeF/uR1yBajHRhkzuaUSGOB1WJSTieJBdHwxlC+HLKvZZw==}
hast-util-to-string@3.0.0:
resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==}
@ -8738,6 +8759,9 @@ packages:
rehype-infer-description-meta@2.0.0:
resolution: {integrity: sha512-8MZjKRfQiNB5+Qpt0fS9bpjcKe+nhF5GOTHo0M5e+XdStDpcZxkSMMnCfNIlpNaOyIQ7Hu1qEaUxm8ZL1lYI1g==}
rehype-minify-whitespace@6.0.2:
resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==}
rehype-parse@9.0.1:
resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
@ -9395,6 +9419,9 @@ packages:
resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==}
engines: {node: '>=0.10.0'}
trim-trailing-lines@2.1.0:
resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==}
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
@ -16967,6 +16994,11 @@ snapshots:
function-bind: 1.1.2
optional: true
hast-util-embedded@3.0.0:
dependencies:
'@types/hast': 3.0.4
hast-util-is-element: 3.0.0
hast-util-excerpt@2.0.0:
dependencies:
'@types/hast': 3.0.4
@ -16996,14 +17028,34 @@ snapshots:
dependencies:
'@types/hast': 3.0.4
hast-util-is-body-ok-link@3.0.1:
dependencies:
'@types/hast': 3.0.4
hast-util-is-element@3.0.0:
dependencies:
'@types/hast': 3.0.4
hast-util-minify-whitespace@1.0.1:
dependencies:
'@types/hast': 3.0.4
hast-util-embedded: 3.0.0
hast-util-is-element: 3.0.0
hast-util-whitespace: 3.0.0
unist-util-is: 6.0.0
hast-util-parse-selector@4.0.0:
dependencies:
'@types/hast': 3.0.4
hast-util-phrasing@3.0.1:
dependencies:
'@types/hast': 3.0.4
hast-util-embedded: 3.0.0
hast-util-has-property: 3.0.0
hast-util-is-body-ok-link: 3.0.1
hast-util-is-element: 3.0.0
hast-util-sanitize@5.0.1:
dependencies:
'@types/hast': 3.0.4
@ -17063,6 +17115,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
hast-util-to-mdast@10.1.0:
dependencies:
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
'@ungap/structured-clone': 1.2.0
hast-util-phrasing: 3.0.1
hast-util-to-html: 9.0.3
hast-util-to-text: 4.0.2
hast-util-whitespace: 3.0.0
mdast-util-phrasing: 4.1.0
mdast-util-to-hast: 13.2.0
mdast-util-to-string: 4.0.0
rehype-minify-whitespace: 6.0.2
trim-trailing-lines: 2.1.0
unist-util-position: 5.0.0
unist-util-visit: 5.0.0
hast-util-to-string@3.0.0:
dependencies:
'@types/hast': 3.0.4
@ -19464,6 +19533,11 @@ snapshots:
unist-util-remove-position: 5.0.0
vfile: 6.0.3
rehype-minify-whitespace@6.0.2:
dependencies:
'@types/hast': 3.0.4
hast-util-minify-whitespace: 1.0.1
rehype-parse@9.0.1:
dependencies:
'@types/hast': 3.0.4
@ -20197,6 +20271,8 @@ snapshots:
dependencies:
escape-string-regexp: 1.0.5
trim-trailing-lines@2.1.0: {}
trough@2.2.0: {}
truncate-utf8-bytes@1.0.2: