All checks were successful
CD / Build and push images (push) Successful in 2m3s
CI / Lint, typecheck, test (push) Successful in 1m41s
CI / Auth e2e pack (push) Successful in 1m46s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 8s
CD / Smoke tests against Test (push) Successful in 1m10s
CD / Promote to Int (push) Successful in 10s
Wires docToMarkdown/markdownToDoc into the editor clipboard: copying selected content puts Markdown on text/plain alongside the browser's own HTML (so pasting into a plain-text destination yields Markdown), and pasting plain text that looks like a Markdown document converts it to rich nodes; content with real HTML on the clipboard is left to ProseMirror's normal HTML-based paste, and the heuristic requires two or more distinct Markdown-shaped lines (or a fenced code block) so ordinary prose is never mangled. Both directions need the parsed/selected doc re-hydrated against whichever schema instance is on the other side of the boundary: the canonical editorSchema (packages/shared) for markdownToDoc's output before inserting it into the live view, and the live view's schema wrapped back into editorSchema before handing a slice to docToMarkdown — they're structurally identical but not the same object, and ProseMirror's content checks are identity-based. Adds GET /pages/:id/export/markdown (downloads <slug>.md), serving the already-derived page_content_cache.markdown (#23) rather than re-decoding the Yjs state. "Copy as Markdown" and "Download as Markdown" actions in the page header both read from that same endpoint, so they always agree with each other and with the last saved state. Closes #30
76 lines
1.9 KiB
JSON
76 lines
1.9 KiB
JSON
{
|
|
"title": {
|
|
"placeholder": "Untitled page"
|
|
},
|
|
"mode": {
|
|
"edit": "Edit",
|
|
"view": "Read",
|
|
"toggleToEdit": "Switch to edit mode",
|
|
"toggleToView": "Switch to read mode"
|
|
},
|
|
"save": {
|
|
"saved": "Saved",
|
|
"saving": "Saving …",
|
|
"error": "Saving failed, retrying …",
|
|
"unsavedTitle": "Saving title …"
|
|
},
|
|
"toolbar": {
|
|
"paragraph": "Paragraph",
|
|
"heading1": "Heading 1",
|
|
"heading2": "Heading 2",
|
|
"heading3": "Heading 3",
|
|
"heading4": "Heading 4",
|
|
"bold": "Bold",
|
|
"italic": "Italic",
|
|
"code": "Inline code",
|
|
"strikethrough": "Strikethrough",
|
|
"bulletList": "Bullet list",
|
|
"orderedList": "Numbered list",
|
|
"taskList": "Task list",
|
|
"blockquote": "Quote",
|
|
"codeBlock": "Code block",
|
|
"horizontalRule": "Horizontal rule",
|
|
"image": "Insert image",
|
|
"undo": "Undo",
|
|
"redo": "Redo",
|
|
"link": {
|
|
"add": "Add link",
|
|
"edit": "Edit URL",
|
|
"remove": "Remove link",
|
|
"openNewTab": "Open in new tab",
|
|
"urlLabel": "Link URL",
|
|
"apply": "Apply",
|
|
"cancel": "Cancel",
|
|
"invalidProtocol": "This link type is not allowed."
|
|
},
|
|
"table": {
|
|
"insert": "Insert table",
|
|
"addColumnBefore": "Add column before",
|
|
"addColumnAfter": "Add column after",
|
|
"deleteColumn": "Delete column",
|
|
"addRowBefore": "Add row before",
|
|
"addRowAfter": "Add row after",
|
|
"deleteRow": "Delete row",
|
|
"toggleHeaderRow": "Toggle header row",
|
|
"deleteTable": "Delete table"
|
|
}
|
|
},
|
|
"image": {
|
|
"uploading": "Uploading image …",
|
|
"uploadFailed": "Image upload failed",
|
|
"altLabel": "Alt text",
|
|
"widthLabel": "Image width",
|
|
"width": {
|
|
"small": "Small",
|
|
"medium": "Medium",
|
|
"full": "Full"
|
|
}
|
|
},
|
|
"page": {
|
|
"copyMarkdown": "Copy as Markdown",
|
|
"markdownCopied": "Copied!",
|
|
"markdownCopyFailed": "Copy failed",
|
|
"downloadMarkdown": "Download as Markdown"
|
|
}
|
|
}
|