[{"data":1,"prerenderedAt":1403},["ShallowReactive",2],{"navigation_docs":3,"-guides-importers":412,"-guides-importers-surround":1398},[4,38,84,326,386],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":37},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,24,28,32],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick start: Nuxt","\u002Fgetting-started\u002Fquick-start-nuxt","1.getting-started\u002F3.quick-start-nuxt",{"title":25,"path":26,"stem":27,"icon":6},"Quick start: plain Vue","\u002Fgetting-started\u002Fquick-start-vue","1.getting-started\u002F4.quick-start-vue",{"title":29,"path":30,"stem":31,"icon":6},"Quick start: React","\u002Fgetting-started\u002Fquick-start-react","1.getting-started\u002F5.quick-start-react",{"title":33,"path":34,"stem":35,"icon":36},"Glossary","\u002Fgetting-started\u002Fglossary","1.getting-started\u002F6.glossary","i-lucide-book-a",false,{"title":39,"icon":40,"path":41,"stem":42,"children":43,"page":37},"Tutorial","i-lucide-graduation-cap","\u002Ftutorial","2.tutorial",[44,49,54,59,64,69,74,79],{"title":45,"path":46,"stem":47,"icon":48},"Tutorial: overview","\u002Ftutorial\u002Foverview","2.tutorial\u002F1.overview","i-lucide-map",{"title":50,"path":51,"stem":52,"icon":53},"Chapter 2: A simple editor","\u002Ftutorial\u002Fsimple-editor","2.tutorial\u002F2.simple-editor","i-lucide-pencil",{"title":55,"path":56,"stem":57,"icon":58},"Chapter 3: Compose features","\u002Ftutorial\u002Fcompose-features","2.tutorial\u002F3.compose-features","i-lucide-blocks",{"title":60,"path":61,"stem":62,"icon":63},"Chapter 4: Your own block, path A","\u002Ftutorial\u002Fown-block-path-a","2.tutorial\u002F4.own-block-path-a","i-lucide-square-plus",{"title":65,"path":66,"stem":67,"icon":68},"Chapter 5: Your own feature, path B","\u002Ftutorial\u002Fown-feature-path-b","2.tutorial\u002F5.own-feature-path-b","i-lucide-puzzle",{"title":70,"path":71,"stem":72,"icon":73},"Chapter 6: Backend and collaboration","\u002Ftutorial\u002Fbackend-and-collaboration","2.tutorial\u002F6.backend-and-collaboration","i-lucide-users",{"title":75,"path":76,"stem":77,"icon":78},"Chapter 7: AI","\u002Ftutorial\u002Fai","2.tutorial\u002F7.ai","i-lucide-sparkles",{"title":80,"path":81,"stem":82,"icon":83},"Chapter 8: The React surface","\u002Ftutorial\u002Freact-surface","2.tutorial\u002F8.react-surface","i-lucide-atom",{"title":85,"icon":14,"path":86,"stem":87,"children":88,"page":37},"Guides","\u002Fguides","3.guides",[89,93,98,103,108,112,116,121,126,130,134,139,144,149,154,159,164,169,174,179,184,189,194,199,204,209,213,218,223,228,233,237,242,247,251,256,261,266,271,276,281,286,291,295,302,307,311,316,321],{"title":90,"path":91,"stem":92,"icon":58},"Feature composition and entries","\u002Fguides\u002Fcomposition","3.guides\u002F1.composition",{"title":94,"path":95,"stem":96,"icon":97},"Media, mentions and transcript features","\u002Fguides\u002Fmedia-mentions-transcript","3.guides\u002F10.media-mentions-transcript","i-lucide-image",{"title":99,"path":100,"stem":101,"icon":102},"Authors and comments","\u002Fguides\u002Fauthors-and-comments","3.guides\u002F11.authors-and-comments","i-lucide-message-square-text",{"title":104,"path":105,"stem":106,"icon":107},"Themes (Obsidian)","\u002Fguides\u002Fthemes","3.guides\u002F12.themes","i-lucide-palette",{"title":109,"path":110,"stem":111,"icon":58},"Composites and the settings UI","\u002Fguides\u002Fcomposites","3.guides\u002F13.composites",{"title":113,"path":114,"stem":115,"icon":78},"AI","\u002Fguides\u002Fai","3.guides\u002F14.ai",{"title":117,"path":118,"stem":119,"icon":120},"Document tree","\u002Fguides\u002Fdocument-tree","3.guides\u002F15.document-tree","i-lucide-folder-tree",{"title":122,"path":123,"stem":124,"icon":125},"Markdown and code","\u002Fguides\u002Fmarkdown-and-code","3.guides\u002F16.markdown-and-code","i-lucide-file-code",{"title":127,"path":128,"stem":129,"icon":83},"Advanced editor in React","\u002Fguides\u002Fadvanced-react","3.guides\u002F17.advanced-react",{"title":131,"path":132,"stem":133,"icon":6},"Kitchen sink: learning path","\u002Fguides\u002Fadvanced-nuxt-example","3.guides\u002F18.advanced-nuxt-example",{"title":135,"path":136,"stem":137,"icon":138},"Production","\u002Fguides\u002Fproduction","3.guides\u002F19.production","i-lucide-server",{"title":140,"path":141,"stem":142,"icon":143},"Register the Nuxt module","\u002Fguides\u002Fnuxt-module","3.guides\u002F2.nuxt-module","i-lucide-package",{"title":145,"path":146,"stem":147,"icon":148},"Storage adapters, comment stores, Nitro host","\u002Fguides\u002Fstorage-adapters","3.guides\u002F20.storage-adapters","i-lucide-database",{"title":150,"path":151,"stem":152,"icon":153},"Migrating from #tiptap-editor","\u002Fguides\u002Fmigration","3.guides\u002F21.migration","i-lucide-arrow-right-left",{"title":155,"path":156,"stem":157,"icon":158},"Content tree mechanics","\u002Fguides\u002Fcontent-tree","3.guides\u002F22.content-tree","i-lucide-git-fork",{"title":160,"path":161,"stem":162,"icon":163},"Block capabilities, abilities and actions","\u002Fguides\u002Fblock-capabilities","3.guides\u002F23.block-capabilities","i-lucide-shield-check",{"title":165,"path":166,"stem":167,"icon":168},"Block types in code and JSON","\u002Fguides\u002Fblock-types","3.guides\u002F24.block-types","i-lucide-shapes",{"title":170,"path":171,"stem":172,"icon":173},"Derive methods and the Derivation index","\u002Fguides\u002Fderive-methods","3.guides\u002F25.derive-methods","i-lucide-git-branch-plus",{"title":175,"path":176,"stem":177,"icon":178},"Block properties and Property definitions","\u002Fguides\u002Fblock-properties","3.guides\u002F26.block-properties","i-lucide-sliders-horizontal",{"title":180,"path":181,"stem":182,"icon":183},"Image studio","\u002Fguides\u002Fimage-studio","3.guides\u002F27.image-studio","i-lucide-image-plus",{"title":185,"path":186,"stem":187,"icon":188},"Prüfung and Freigabestatus","\u002Fguides\u002Fpruefung","3.guides\u002F28.pruefung","i-lucide-stamp",{"title":190,"path":191,"stem":192,"icon":193},"Workspace: find, read, reference and embed Blocks across Documents","\u002Fguides\u002Fworkspace","3.guides\u002F29.workspace","i-lucide-network",{"title":195,"path":196,"stem":197,"icon":198},"EditorPorts: auth and storage","\u002Fguides\u002Feditor-ports","3.guides\u002F3.editor-ports","i-lucide-plug",{"title":200,"path":201,"stem":202,"icon":203},"Collections: an ordered list of Blocks","\u002Fguides\u002Fcollections","3.guides\u002F30.collections","i-lucide-list-checks",{"title":205,"path":206,"stem":207,"icon":208},"Data views: a query shown as table, list or board","\u002Fguides\u002Fdata-views","3.guides\u002F31.data-views","i-lucide-table-properties",{"title":210,"path":211,"stem":212,"icon":193},"Explore: backlinks, related Blocks and the trail","\u002Fguides\u002Fexplore","3.guides\u002F32.explore",{"title":214,"path":215,"stem":216,"icon":217},"Render: export a Block or a Document to a file","\u002Fguides\u002Frender","3.guides\u002F33.render","i-lucide-file-output",{"title":219,"path":220,"stem":221,"icon":222},"Importers: what a dropped file becomes","\u002Fguides\u002Fimporters","3.guides\u002F34.importers","i-lucide-file-input",{"title":224,"path":225,"stem":226,"icon":227},"Templates: start a Document from a Dokumentvorlage","\u002Fguides\u002Ftemplates","3.guides\u002F35.templates","i-lucide-file-stack",{"title":229,"path":230,"stem":231,"icon":232},"Citations","\u002Fguides\u002Fcitations","3.guides\u002F36.citations","i-lucide-quote",{"title":234,"path":235,"stem":236,"icon":163},"AI proposals and the export check","\u002Fguides\u002Fexport-check","3.guides\u002F37.export-check",{"title":238,"path":239,"stem":240,"icon":241},"Query: filter, sort, group and total Blocks","\u002Fguides\u002Fquery","3.guides\u002F38.query","i-lucide-list-filter",{"title":243,"path":244,"stem":245,"icon":246},"Edges: backlinks and authored connections","\u002Fguides\u002Fedges","3.guides\u002F39.edges","i-lucide-link-2",{"title":248,"path":249,"stem":250,"icon":163},"Server routes and authentication","\u002Fguides\u002Froutes-and-auth","3.guides\u002F4.routes-and-auth",{"title":252,"path":253,"stem":254,"icon":255},"Speech: text to audio, and subtitle files","\u002Fguides\u002Fspeech","3.guides\u002F41.speech","i-lucide-audio-lines",{"title":257,"path":258,"stem":259,"icon":260},"Graph: the Edges around a Block","\u002Fguides\u002Fgraph","3.guides\u002F42.graph","i-lucide-waypoints",{"title":262,"path":263,"stem":264,"icon":265},"PDF viewer: passages, anchors and quotes","\u002Fguides\u002Fpdf-viewer","3.guides\u002F43.pdf-viewer","i-lucide-file-search",{"title":267,"path":268,"stem":269,"icon":270},"Obsidian: import and export a vault","\u002Fguides\u002Fobsidian","3.guides\u002F44.obsidian","i-lucide-folder-input",{"title":272,"path":273,"stem":274,"icon":275},"Typst: render a Document as a PDF with citations","\u002Fguides\u002Ftypst","3.guides\u002F45.typst","i-lucide-file-text",{"title":277,"path":278,"stem":279,"icon":280},"Audio: read aloud, mixdown and ElevenLabs","\u002Fguides\u002Faudio","3.guides\u002F46.audio","i-lucide-audio-waveform",{"title":282,"path":283,"stem":284,"icon":285},"Slides: decks, slide layouts and exports","\u002Fguides\u002Fslides","3.guides\u002F47.slides","i-lucide-presentation",{"title":287,"path":288,"stem":289,"icon":290},"Knowledge graph: sources and concepts beside the Documents","\u002Fguides\u002Fknowledge-graph","3.guides\u002F49.knowledge-graph","i-lucide-share-2",{"title":292,"path":293,"stem":294,"icon":78},"AI configuration and secrets","\u002Fguides\u002Fai-configuration","3.guides\u002F5.ai-configuration",{"title":296,"path":297,"stem":298,"children":299,"icon":301},"Index on Postgres: typos, meaning and SQL pushdown","\u002Fguides\u002Findex-pg","3.guides\u002F50.index-pg",[300],{"title":296,"path":297,"stem":298,"icon":301},"i-lucide-database-zap",{"title":303,"path":304,"stem":305,"icon":306},"Charts: bar, line, pie and scatter over a query","\u002Fguides\u002Fcharts","3.guides\u002F51.charts","i-lucide-chart-column",{"title":308,"path":309,"stem":310,"icon":73},"Collaboration on the client","\u002Fguides\u002Fcollaboration","3.guides\u002F6.collaboration",{"title":312,"path":313,"stem":314,"icon":315},"Block UI (drag handle, hover actions)","\u002Fguides\u002Fblock-ui","3.guides\u002F7.block-ui","i-lucide-grip-vertical",{"title":317,"path":318,"stem":319,"icon":320},"Settings and app lifetime","\u002Fguides\u002Fsettings","3.guides\u002F8.settings","i-lucide-settings",{"title":322,"path":323,"stem":324,"icon":325},"Language","\u002Fguides\u002Flanguage","3.guides\u002F9.language","i-lucide-languages",{"title":327,"icon":14,"path":328,"stem":329,"children":330,"page":37},"Reference","\u002Freference","4.reference",[331,335,339,344,348,352,356,360,364,368,373,378,382],{"title":332,"path":333,"stem":334,"icon":143},"Public exports","\u002Freference\u002Fexports","4.reference\u002F1.exports",{"title":336,"path":337,"stem":338,"icon":173},"Derive method contract","\u002Freference\u002Fderive-methods","4.reference\u002F10.derive-methods",{"title":340,"path":341,"stem":342,"icon":343},"Changelog","\u002Freference\u002Fchangelog","4.reference\u002F11.changelog","i-lucide-history",{"title":345,"path":346,"stem":347,"icon":217},"Renderer port","\u002Freference\u002Frenderer-port","4.reference\u002F12.renderer-port",{"title":349,"path":350,"stem":351,"icon":255},"Speech port","\u002Freference\u002Fspeech-port","4.reference\u002F13.speech-port",{"title":353,"path":354,"stem":355,"icon":58},"Presets and features","\u002Freference\u002Fpresets-and-features","4.reference\u002F2.presets-and-features",{"title":357,"path":358,"stem":359,"icon":68},"Feature contract","\u002Freference\u002Ffeature-contract","4.reference\u002F3.feature-contract",{"title":361,"path":362,"stem":363,"icon":107},"CSS and UI-provider requirements","\u002Freference\u002Fcss-and-ui","4.reference\u002F4.css-and-ui",{"title":365,"path":366,"stem":367,"icon":148},"Vue-free advanced schema","\u002Freference\u002Fadvanced-schema","4.reference\u002F5.advanced-schema",{"title":369,"path":370,"stem":371,"icon":372},"Dependency rules","\u002Freference\u002Fdependency-rules","4.reference\u002F6.dependency-rules","i-lucide-git-branch",{"title":374,"path":375,"stem":376,"icon":377},"Commands","\u002Freference\u002Fcommands","4.reference\u002F7.commands","i-lucide-terminal",{"title":379,"path":380,"stem":381,"icon":163},"Block capability contract","\u002Freference\u002Fblock-capabilities","4.reference\u002F8.block-capabilities",{"title":383,"path":384,"stem":385,"icon":168},"Block type contract","\u002Freference\u002Fblock-types","4.reference\u002F9.block-types",{"title":387,"path":388,"stem":389,"children":390,"icon":393},"AI agents","\u002Fai-agents","5.ai-agents\u002F1.index",[391,394,398,402,407],{"title":392,"path":388,"stem":389,"icon":393},"Overview","i-lucide-bot",{"title":395,"path":396,"stem":397,"icon":198},"Integrate the editor","\u002Fai-agents\u002Fintegrate","5.ai-agents\u002F2.integrate",{"title":399,"path":400,"stem":401,"icon":68},"Add a block or feature","\u002Fai-agents\u002Fextend","5.ai-agents\u002F3.extend",{"title":403,"path":404,"stem":405,"icon":406},"Pitfalls and invariants","\u002Fai-agents\u002Finvariants","5.ai-agents\u002F4.invariants","i-lucide-shield-alert",{"title":408,"path":409,"stem":410,"icon":411},"Verify","\u002Fai-agents\u002Fverify","5.ai-agents\u002F5.verify","i-lucide-check-check",{"id":413,"title":219,"body":414,"description":1391,"extension":1392,"links":1393,"meta":1394,"navigation":1395,"path":220,"seo":1396,"stem":221,"__hash__":1397},"docs\u002F3.guides\u002F34.importers.md",{"type":415,"value":416,"toc":1384},"minimark",[417,443,779,784,806,854,873,877,888,1017,1028,1076,1110,1165,1167,1198,1208,1212,1240,1321,1324,1344,1358,1369,1373,1380],[418,419,420,421,425,426,430,431,434,435,438,439,442],"p",{},"Dropping, pasting or picking a file runs it through the ",[422,423,424],"strong",{},"importer registry",". A feature contributes ",[427,428,429],"code",{},"importers: Importer[]","; the editor asks them, in feature order, which one takes the file. The result is an ",[427,432,433],{},"ImportPlan",": the blocks to insert, plus facts about the file as a whole. ",[427,436,437],{},"fileImport"," (",[427,440,441],{},"@skaile\u002Fforge-editor\u002Fmedia",") inserts the blocks at the drop position and shows the plan's warnings as one notice.",[444,445,450],"pre",{"className":446,"code":447,"language":448,"meta":449,"style":449},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { Importer } from '@skaile\u002Fforge-editor\u002Fcore'\n\nconst csvImporter: Importer = {\n  id: 'csv',\n  accepts: ['.csv', 'text\u002Fcsv'],\n  async plan(editor, file, text) {\n    \u002F\u002F `text` is the file's text for a text file of at most MAX_TEXT_BYTES, else null\n    return { blocks: [{ type: 'paragraph', content: [{ type: 'text', text: text ?? '' }] }] }\n  },\n}\n\nexport const csvFeature = (): EditorFeature\u003Cnever> => ({ id: 'csv', dimension: 'content', importers: [csvImporter] })\n","ts","",[427,451,452,488,495,517,537,570,601,608,686,692,697,702],{"__ignoreMap":449},[453,454,457,461,464,468,472,475,478,481,485],"span",{"class":455,"line":456},"line",1,[453,458,460],{"class":459},"s7zQu","import",[453,462,463],{"class":459}," type",[453,465,467],{"class":466},"sMK4o"," {",[453,469,471],{"class":470},"sTEyZ"," Importer",[453,473,474],{"class":466}," }",[453,476,477],{"class":459}," from",[453,479,480],{"class":466}," '",[453,482,484],{"class":483},"sfazB","@skaile\u002Fforge-editor\u002Fcore",[453,486,487],{"class":466},"'\n",[453,489,491],{"class":455,"line":490},2,[453,492,494],{"emptyLinePlaceholder":493},true,"\n",[453,496,498,502,505,508,511,514],{"class":455,"line":497},3,[453,499,501],{"class":500},"spNyl","const",[453,503,504],{"class":470}," csvImporter",[453,506,507],{"class":466},":",[453,509,471],{"class":510},"sBMFI",[453,512,513],{"class":466}," =",[453,515,516],{"class":466}," {\n",[453,518,520,524,526,528,531,534],{"class":455,"line":519},4,[453,521,523],{"class":522},"swJcz","  id",[453,525,507],{"class":466},[453,527,480],{"class":466},[453,529,530],{"class":483},"csv",[453,532,533],{"class":466},"'",[453,535,536],{"class":466},",\n",[453,538,540,543,545,548,550,553,555,558,560,563,565,568],{"class":455,"line":539},5,[453,541,542],{"class":522},"  accepts",[453,544,507],{"class":466},[453,546,547],{"class":470}," [",[453,549,533],{"class":466},[453,551,552],{"class":483},".csv",[453,554,533],{"class":466},[453,556,557],{"class":466},",",[453,559,480],{"class":466},[453,561,562],{"class":483},"text\u002Fcsv",[453,564,533],{"class":466},[453,566,567],{"class":470},"]",[453,569,536],{"class":466},[453,571,573,576,579,582,586,588,591,593,596,599],{"class":455,"line":572},6,[453,574,575],{"class":500},"  async",[453,577,578],{"class":522}," plan",[453,580,581],{"class":466},"(",[453,583,585],{"class":584},"sHdIc","editor",[453,587,557],{"class":466},[453,589,590],{"class":584}," file",[453,592,557],{"class":466},[453,594,595],{"class":584}," text",[453,597,598],{"class":466},")",[453,600,516],{"class":466},[453,602,604],{"class":455,"line":603},7,[453,605,607],{"class":606},"sHwdD","    \u002F\u002F `text` is the file's text for a text file of at most MAX_TEXT_BYTES, else null\n",[453,609,611,614,616,619,621,623,626,628,630,632,635,637,639,642,644,646,648,650,652,654,657,659,661,663,665,667,670,673,675,678,681,683],{"class":455,"line":610},8,[453,612,613],{"class":459},"    return",[453,615,467],{"class":466},[453,617,618],{"class":522}," blocks",[453,620,507],{"class":466},[453,622,547],{"class":522},[453,624,625],{"class":466},"{",[453,627,463],{"class":522},[453,629,507],{"class":466},[453,631,480],{"class":466},[453,633,634],{"class":483},"paragraph",[453,636,533],{"class":466},[453,638,557],{"class":466},[453,640,641],{"class":522}," content",[453,643,507],{"class":466},[453,645,547],{"class":522},[453,647,625],{"class":466},[453,649,463],{"class":522},[453,651,507],{"class":466},[453,653,480],{"class":466},[453,655,656],{"class":483},"text",[453,658,533],{"class":466},[453,660,557],{"class":466},[453,662,595],{"class":522},[453,664,507],{"class":466},[453,666,595],{"class":470},[453,668,669],{"class":466}," ??",[453,671,672],{"class":466}," ''",[453,674,474],{"class":466},[453,676,677],{"class":522},"] ",[453,679,680],{"class":466},"}",[453,682,677],{"class":522},[453,684,685],{"class":466},"}\n",[453,687,689],{"class":455,"line":688},9,[453,690,691],{"class":466},"  },\n",[453,693,695],{"class":455,"line":694},10,[453,696,685],{"class":466},[453,698,700],{"class":455,"line":699},11,[453,701,494],{"emptyLinePlaceholder":493},[453,703,705,708,711,714,717,720,723,726,729,732,735,737,739,742,744,746,748,750,752,755,757,759,762,764,766,769,771,774,776],{"class":455,"line":704},12,[453,706,707],{"class":459},"export",[453,709,710],{"class":500}," const",[453,712,713],{"class":470}," csvFeature ",[453,715,716],{"class":466},"=",[453,718,719],{"class":466}," ():",[453,721,722],{"class":510}," EditorFeature",[453,724,725],{"class":466},"\u003C",[453,727,728],{"class":510},"never",[453,730,731],{"class":466},">",[453,733,734],{"class":500}," =>",[453,736,438],{"class":470},[453,738,625],{"class":466},[453,740,741],{"class":522}," id",[453,743,507],{"class":466},[453,745,480],{"class":466},[453,747,530],{"class":483},[453,749,533],{"class":466},[453,751,557],{"class":466},[453,753,754],{"class":522}," dimension",[453,756,507],{"class":466},[453,758,480],{"class":466},[453,760,761],{"class":483},"content",[453,763,533],{"class":466},[453,765,557],{"class":466},[453,767,768],{"class":522}," importers",[453,770,507],{"class":466},[453,772,773],{"class":470}," [csvImporter] ",[453,775,680],{"class":466},[453,777,778],{"class":470},")\n",[780,781,783],"h2",{"id":782},"which-importer-takes-a-file","Which importer takes a file",[418,785,786,789,790,793,794,797,798,801,802,805],{},[427,787,788],{},"accepts"," lists MIME types (",[427,791,792],{},"text\u002Fmarkdown",", ",[427,795,796],{},"audio\u002F*","), extensions with their dot (",[427,799,800],{},".vtt",", not case-sensitive) or ",[427,803,804],{},"*",".",[807,808,809,820,840],"ul",{},[810,811,812,815,816,819],"li",{},[422,813,814],{},"Specific entries."," The first importer in feature order with a matching MIME type or extension plans the file. A file without a match goes to the ",[422,817,818],{},"fallback",": text and Markdown files are parsed through the block pipeline (parse, normalize, segment, structure), everything else is uploaded as a media or file block.",[810,821,822,828,829,831,832,835,836,839],{},[422,823,824,825,827],{},"Wrapping importers (",[427,826,804],{},")."," An importer that accepts ",[427,830,804],{}," takes every file but plans last. It receives the plan made so far as ",[427,833,834],{},"base"," and returns the final plan. ",[427,837,838],{},"composite-media"," is one: it puts the blocks of every file into one Typed block.",[810,841,842,845,846,849,850,853],{},[422,843,844],{},"Text."," An importer that matched by extension or a ",[427,847,848],{},"text\u002F*"," type gets the file's text. Files above ",[427,851,852],{},"MAX_TEXT_BYTES"," (2 MB) are not read; such a file goes to the fallback.",[418,855,856,857,860,861,864,865,868,869,872],{},"Importer ids must be unique: ",[427,858,859],{},"defineEditor"," throws for a second ",[427,862,863],{},"importers"," entry with the same id. Importers are additive, so two features may both contribute some. ",[427,866,867],{},"planImport(editor, file, fallback)"," is the framework-free entry; ",[427,870,871],{},"importersOf(features)"," lists the contributions.",[780,874,876],{"id":875},"the-importers-of-the-media-feature","The importers of the media feature",[418,878,879,880,883,884,887],{},"The ",[427,881,882],{},"media"," feature contributes three importers (",[427,885,886],{},"FILE_IMPORTERS",", in this order).",[889,890,891,907],"table",{},[892,893,894],"thead",{},[895,896,897,901,904],"tr",{},[898,899,900],"th",{},"Importer",[898,902,903],{},"Takes",[898,905,906],{},"Plan",[908,909,910,934,977],"tbody",{},[895,911,912,918,928],{},[913,914,915],"td",{},[427,916,917],{},"markdown",[913,919,920,793,923,793,926],{},[427,921,922],{},".md",[427,924,925],{},".markdown",[427,927,792],{},[913,929,930,931],{},"The body parsed through the block pipeline. The frontmatter keys become ",[427,932,933],{},"properties",[895,935,936,941,951],{},[913,937,938],{},[427,939,940],{},"subtitle",[913,942,943,793,945,793,948],{},[427,944,800],{},[427,946,947],{},".srt",[427,949,950],{},"text\u002Fvtt",[913,952,953,954,957,958,961,962,793,965,968,969,972,973,976],{},"One Typed block of Block type ",[427,955,956],{},"rendition",", titled with the file name, holding one ",[427,959,960],{},"transcriptSegment"," per cue (",[427,963,964],{},"start",[427,966,967],{},"end"," in seconds, ",[427,970,971],{},"speaker"," from a WebVTT ",[427,974,975],{},"\u003Cv Name>"," tag)",[895,978,979,984,992],{},[913,980,981],{},[427,982,983],{},"bibtex",[913,985,986,793,989],{},[427,987,988],{},".bib",[427,990,991],{},"application\u002Fx-bibtex",[913,993,994,995,998,999,1002,1003,1005,1006,438,1009,1012,1013,1016],{},"One Typed block per entry: ",[427,996,997],{},"paper",", or ",[427,1000,1001],{},"book"," for CSL ",[427,1004,1001],{},". The entry is the CSL record in ",[427,1007,1008],{},"meta.bib",[427,1010,1011],{},"doi"," \u002F ",[427,1014,1015],{},"isbn"," too)",[418,1018,1019,1020,1023,1024,1027],{},"Without the ",[427,1021,1022],{},"composites"," feature there are no Typed blocks: the subtitle importer then inserts the segments as they are (paragraphs ",[427,1025,1026],{},"Sprecher: Text"," without the transcript feature), the BibTeX importer one citation paragraph per entry.",[418,1029,1030,1033,1034,1037,1038,793,1041,793,1044,1047,1048,1051,1052,1055,1056,1058,1059,1062,1063,793,1066,793,1069,793,1072,1075],{},[422,1031,1032],{},"Frontmatter"," is read by ",[427,1035,1036],{},"parseFrontmatter"," with a small subset: scalars (quoted strings, numbers, ",[427,1039,1040],{},"true",[427,1042,1043],{},"false",[427,1045,1046],{},"null","), flow lists (",[427,1049,1050],{},"tags: [a, \"b, c\"]",") and block lists (",[427,1053,1054],{},"- item"," lines). Nested maps and multi-line scalars are skipped with a warning; the body is never affected. ",[427,1057,933],{}," are not inserted by themselves: a wrapping importer merges them into the ",[427,1060,1061],{},"meta"," of the Typed block it creates, after which the file's own import facts (",[427,1064,1065],{},"filename",[427,1067,1068],{},"mimeType",[427,1070,1071],{},"size",[427,1073,1074],{},"importedAt",") are set and never replaced.",[418,1077,1078,438,1081,1084,1085,793,1088,1091,1092,1095,1096,793,1099,1102,1103,438,1106,1109],{},[422,1079,1080],{},"Subtitles",[427,1082,1083],{},"parseSubtitles","): cue blocks are separated by blank lines; identifier lines (the numbers of SubRip), ",[427,1086,1087],{},"NOTE",[427,1089,1090],{},"STYLE"," and ",[427,1093,1094],{},"REGION"," blocks and cue settings are ignored, inline tags are dropped, cue lines are joined by a space. Times are ",[427,1097,1098],{},"hh:mm:ss.mmm",[427,1100,1101],{},"mm:ss.mmm"," or ",[427,1104,1105],{},"hh:mm:ss,mmm",[427,1107,1108],{},"cueTime","). A block without a valid time range is skipped and reported.",[418,1111,1112,438,1115,1118,1119,1122,1123,1091,1126,1128,1129,1132,1133,793,1136,1139,1140,1091,1143,1146,1147,1150,1151,793,1154,1157,1158,1091,1161,1164],{},[422,1113,1114],{},"BibTeX",[427,1116,1117],{},"parseBibtex","): ",[427,1120,1121],{},"@type{key, field = {value} | \"value\" | number | macro # …}",". ",[427,1124,1125],{},"author",[427,1127,585],{}," split on ",[427,1130,1131],{},"and"," outside braces (",[427,1134,1135],{},"Family, Given",[427,1137,1138],{},"Given Family"," or a braced institution), ",[427,1141,1142],{},"year",[427,1144,1145],{},"month"," (number or English name) or ",[427,1148,1149],{},"date"," become ",[427,1152,1153],{},"issued",[427,1155,1156],{},"@string"," macros are resolved, ",[427,1159,1160],{},"@comment",[427,1162,1163],{},"@preamble"," are skipped. LaTeX accent commands are not translated. An entry without key or title is skipped with a warning. The block's title is the entry's title; the CSL record carries no title.",[780,1166,838],{"id":838},[418,1168,1169,1172,1173,1175,1176,1178,1179,1181,1182,1184,1185,1187,1188,1190,1191,1194,1195,1197],{},[427,1170,1171],{},"compositeMediaFeature()"," contributes the wrapping importer. For every planned file it creates one Typed block of the Block type whose ",[427,1174,460],{}," capability takes the file's media, titled with the file name without its extension. The plan's blocks become its body, the plan's ",[427,1177,933],{}," and the file's facts its ",[427,1180,1061],{},". Without a Block type that takes the file, the plan is inserted as it is. So it is when the plan is already Typed blocks and carries no ",[427,1183,933],{},": a dropped ",[427,1186,800],{}," stays the one transcript block and a ",[427,1189,988],{}," its paper and book blocks, none of them wrapped in a ",[427,1192,1193],{},"document"," block. Markdown files (frontmatter ",[427,1196,933],{},") and plain media or text files keep one wrapper per file.",[418,1199,1200,1201,1204,1205,1207],{},"The wrapper needs a plan to wrap; it never reads files itself. It replaces the earlier ",[427,1202,1203],{},"wrapImport"," pipeline hook, which allowed one contributor: any number of features can now contribute importers, and ",[427,1206,1203],{}," no longer exists.",[780,1209,1211],{"id":1210},"duplicates","Duplicates",[418,1213,1214,1215,1218,1219,1222,1223,1226,1227,438,1230,793,1233,793,1236,1239],{},"Before a dropped file is inserted, the Block index is asked whether the workspace holds it already (",[427,1216,1217],{},"backend.index.importCheck",", route ",[427,1220,1221],{},"POST \u002Fapi\u002Feditor\u002Fimport\u002Fcheck",", body ",[427,1224,1225],{},"{ sha256?, doi?, title?, type? }",", at least one of the first three). The answer is a list of ",[427,1228,1229],{},"ImportMatch",[427,1231,1232],{},"address",[427,1234,1235],{},"title",[427,1237,1238],{},"reason","), at most ten, over the Documents the user may read:",[889,1241,1242,1252],{},[892,1243,1244],{},[895,1245,1246,1249],{},[898,1247,1248],{},"Reason",[898,1250,1251],{},"A Block matches when",[908,1253,1254,1275,1300],{},[895,1255,1256,1261],{},[913,1257,1258],{},[427,1259,1260],{},"sha256",[913,1262,1263,1264,1267,1268,1271,1272,1274],{},"its file has the same SHA-256 (",[427,1265,1266],{},"properties.sha256",": the ",[427,1269,1270],{},"hash"," of an uploaded media or file block, or of the first body block of a Typed block that wraps one). An authored ",[427,1273,1260],{}," property wins",[895,1276,1277,1281],{},[913,1278,1279],{},[427,1280,1011],{},[913,1282,1283,1284,1287,1288,1291,1292,1295,1296,1299],{},"its bibliographic record (",[427,1285,1286],{},"properties.bib.DOI",", else ",[427,1289,1290],{},"properties.doi",") has the same DOI; case, ",[427,1293,1294],{},"doi:"," and the ",[427,1297,1298],{},"doi.org"," URL do not count",[895,1301,1302,1306],{},[913,1303,1304],{},[427,1305,1235],{},[913,1307,1308,1309,1312,1313,1316,1317,1320],{},"its title has the same words in the same order (",[427,1310,1311],{},"rankBlockRows"," ranks, ",[427,1314,1315],{},"titleMatchOf"," decides); with ",[427,1318,1319],{},"type",", the same Block type too",[418,1322,1323],{},"A Block is named once, by the first reason in that order. Of the Blocks of one Document that match for the same reason only the titled ones are kept: a Typed block that wraps an uploaded file and the image inside it carry the same hash, and the Typed block is the one to point at.",[418,1325,1326,1327,1329,1330,1333,1334,1336,1337,1287,1340,1343],{},"The file import (",[427,1328,437],{},"; ",[427,1331,1332],{},"useFileImport()",", the ",[427,1335,882],{}," feature) asks in two steps. A file that is not text is hashed in the browser first (SHA-256 through WebCrypto), so a file the workspace holds is not uploaded a second time unless the user insists. Otherwise the file is planned and the check asks for every Typed block of the plan (at most 25) with its title, Block type and DOI (",[427,1338,1339],{},"meta.bib.DOI",[427,1341,1342],{},"meta.doi","). A hit is not inserted. A notice offers two answers:",[807,1345,1346,1352],{},[810,1347,1348,1351],{},[422,1349,1350],{},"Vorhandenen Block referenzieren"," inserts a reference chip to the existing Block instead. Of a plan only the duplicate blocks are replaced; a chip into the open Document names no Document.",[810,1353,1354,1357],{},[422,1355,1356],{},"Trotzdem einfügen"," inserts the file or the whole plan as it would have been.",[418,1359,1360,1361,1364,1365,1368],{},"The notice stays 30 seconds; closing it skips the file. The drop position is anchored meanwhile, so the answer lands where the file was dropped. A check that fails, a missing ",[427,1362,1363],{},"index"," port (a backend without Block index) or an editor without reference chips is no duplicate: the file is inserted at once and nothing is asked. The memory backend answers from its own documents, the HTTP backend through the route. ",[427,1366,1367],{},"Notice.secondaryAction"," is the second button of the notice (Nuxt UI actions, Sonner cancel button).",[780,1370,1372],{"id":1371},"not-included","Not included",[418,1374,1375,1376,1379],{},"Templates for new Documents are a separate guide (",[427,1377,1378],{},"35.templates","). Frontmatter outside the subset above is not imported.",[1381,1382,1383],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":449,"searchDepth":490,"depth":490,"links":1385},[1386,1387,1388,1389,1390],{"id":782,"depth":490,"text":783},{"id":875,"depth":490,"text":876},{"id":838,"depth":490,"text":838},{"id":1210,"depth":490,"text":1211},{"id":1371,"depth":490,"text":1372},"The importer registry of the feature contract: Importer and ImportPlan, planImport, the Markdown, subtitle and BibTeX importers of the media feature, and how composite-media wraps the plan.","md",null,{},{"icon":222},{"title":219,"description":1391},"0EC_LTI7_VUvDA1gn8tzSAOITbwk43uvc6W_LYP3yMg",[1399,1401],{"title":214,"path":215,"stem":216,"description":1400,"icon":217,"children":-1},"The Renderer port with its render targets, the SSE route that streams progress and stores the result as an asset, the client call, and the block action and command that offer it.",{"title":224,"path":225,"stem":226,"description":1402,"icon":227,"children":-1},"The Dokumentvorlagen folder, the placeholders expandTemplate fills in ({{title}}, {{date}}, {{time}}, {{cursor}}), and the templateId of the Document create route.",1793178234861]