Document schema
Every node and mark that can appear in a Tintero content file: 35 nodes and 17 marks, read out of the schema the editor builds.
A chapter's text is ProseMirror JSON, and this page is its whole vocabulary: every type name
you can meet inside files/<id>.json, what each one is allowed to contain,
and which attributes it carries with what defaults. Whether you are writing something that
reads Tintero documents or a plugin that produces them, this is the list to keep open beside
you.
22 of the 35 nodes and 7 of the 17 marks are Tintero's own. The rest are standard Tiptap and behave the way they do everywhere else. The badge on each entry says which, because the two halves have very different amounts of documentation in the world: the standard ones are described on prosemirror.net, and the Tintero ones are described here and nowhere else.
What this is a schema of
Tintero has one function whose job is to answer "every node and mark any document in this project could use", used when a remote edit arrives for a file whose editor is closed. This page is that schema, extracted by running it. It is not a list anyone maintains, so it cannot fall behind the editor: add a node in Tintero and it turns up here on the next sync, with its real attributes and its real defaults.
Unknown types, and what to do with them
There is no version field in a Tintero project, so a document can contain a node type that your reader has never heard of, and that is not damage. It means the file was written by a newer Tintero than the list you built against.
Pass what you do not recognise through untouched. A node you drop is a scene marker, a bookmark or a stretch of dialogue that the writer will find missing later, and nothing will have told them. The same goes the other way: writing a node type that is not on this list produces a file Tintero cannot open, and the check that runs before a plugin's write lands is not a schema check, so nothing will stop you.
Nodes (35)
Nodes are the structure. Every one of them has a type, and most carry a
content array holding the nodes inside them. The root of a document is always
doc.
action bookmark centered character dialogue inlineAudioPlayer lyrics page-break paragraph parenthetical resizableImageClean scene section shot slugline synopsis table tableCell tableHeader transition ttsPause ttsSoundTag
The 22 nodes above exist only in Tintero. The rest of the list is standard.
action #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "action" blockquote #
- contains
- block+
- group
- block
- flags
- block-level, defining
- from
-
starterKit
indent 0 marginLeftMm null marginRightMm null firstLineMm null bookmark #
- contains
- nothing, it is a leaf
- group
- inline
- flags
- inline, leaf, atom, not selectable
- from
-
bookmarkcustomExtensions/bookmark-node.ts
id "" bulletList #
- contains
- listItem+
- group
- block list
- flags
- block-level
- from
-
starterKit
No attributes. In the file it is { "type": "bulletList" } and whatever it
holds.
centered #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "centered" character #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "character" codeBlock #
- contains
- text*
- group
- block
- marks
- none allowed
- flags
- block-level, defining, code
- from
-
starterKit
marginLeftMm null marginRightMm null firstLineMm null language null dialogue #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "dialogue" doc #
- contains
- block+
- group
- none
- flags
- block-level
- from
-
starterKit
No attributes. In the file it is { "type": "doc" } and whatever it
holds.
hardBreak #
- contains
- nothing, it is a leaf
- group
- inline
- flags
- inline, leaf, not selectable
- from
-
starterKit
No attributes. In the file it is { "type": "hardBreak" } and whatever it
holds.
heading #
- contains
- inline*
- group
- block
- flags
- block-level, defining
- from
-
starterKit
textAlign null indent 0 marginLeftMm null marginRightMm null firstLineMm null level 1 horizontalRule #
- contains
- nothing, it is a leaf
- group
- block
- flags
- block-level, leaf
- from
-
starterKit
No attributes. In the file it is { "type": "horizontalRule" } and whatever it
holds.
inlineAudioPlayer #
- contains
- nothing, it is a leaf
- group
- block
- flags
- block-level, leaf, atom
- from
-
inlineAudioPlayercustomExtensions/inline-audio-player.ts
src null title null listItem #
- contains
- paragraph block*
- group
- none
- flags
- block-level, defining
- from
-
starterKit
indent 0 lyrics #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "lyrics" orderedList #
- contains
- listItem+
- group
- block list
- flags
- block-level
- from
-
starterKit
start 1 type null page-break #
- contains
- nothing, it is a leaf
- group
- block
- flags
- block-level, leaf, atom
- from
-
screenplaycustomExtensions/screenplay.extension.ts
class "page-break" paragraph #
- contains
- inline*
- group
- block
- flags
- block-level
- from
-
paragraphcustomExtensions/dialog-paragraph.ts
textAlign null indent 0 marginLeftMm null marginRightMm null firstLineMm null dialog false parenthetical #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "parenthetical" resizableImageClean #
- contains
- nothing, it is a leaf
- group
- block
- flags
- block-level, leaf, draggable
- from
-
resizableImageCleancustomExtensions/resizable-image-clean.ts
src null alt null title null width null height null data-alignment "center" data-reference-url null data-scale null scene #
- contains
- block+
- group
- block
- flags
- block-level
- from
-
scenecustomExtensions/scene-extension.ts
sceneId null sceneType "main_continuity" section #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null level 1 class "section" shot #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "shot" slugline #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "slugline" synopsis #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "synopsis" table #
- contains
- tableRow+
- group
- block
- flags
- block-level, isolating
- from
-
tablecustomExtensions/custom-table.ts
wrapperWidth null wrapperMargin null tableCell #
- contains
- block+
- group
- none
- flags
- block-level, isolating
- from
-
tableCellcustomExtensions/custom-table-cell.ts
colspan 1 rowspan 1 colwidth null align null backgroundColor null verticalAlign null tableHeader #
- contains
- block+
- group
- none
- flags
- block-level, isolating
- from
-
tableHeadercustomExtensions/custom-table-cell.ts
colspan 1 rowspan 1 colwidth null align null backgroundColor null verticalAlign null tableRow #
- contains
- (tableCell | tableHeader)*
- group
- none
- flags
- block-level
- from
-
tableRow
No attributes. In the file it is { "type": "tableRow" } and whatever it
holds.
taskItem #
- contains
- paragraph block*
- group
- none
- flags
- block-level, defining
- from
-
taskItem
checked false taskList #
- contains
- taskItem+
- group
- block list
- flags
- block-level
- from
-
taskList
No attributes. In the file it is { "type": "taskList" } and whatever it
holds.
text #
- contains
- nothing, it is a leaf
- group
- inline
- flags
- block-level, leaf
- from
-
starterKit
No attributes. In the file it is { "type": "text" } and whatever it
holds.
transition #
- contains
- text*
- group
- block
- flags
- block-level, defining
- from
-
screenplaycustomExtensions/screenplay.extension.ts
marginLeftMm null marginRightMm null firstLineMm null class "transition" ttsPause #
- contains
- nothing, it is a leaf
- group
- inline
- flags
- inline, leaf, atom
- from
-
ttsPausecustomExtensions/tts-annotations.ts
ms 500 ttsSoundTag #
- contains
- nothing, it is a leaf
- group
- inline
- flags
- inline, leaf, atom
- from
-
ttsSoundTagcustomExtensions/tts-annotations.ts
tag "laugh" Marks (17)
Marks are formatting, and anything else laid over a stretch of text rather than wrapped
around it. They live in a marks array on the text node itself, so a bold word
inside a paragraph is simply a text node carrying { "type": "bold" }.
bold #
- group
- none
- from
-
starterKit
No attributes. In the file it is { "type": "bold" } and whatever it
holds.
code #
- group
- none
- flags
- excludes _, code
- from
-
starterKit
No attributes. In the file it is { "type": "code" } and whatever it
holds.
customHighlight #
- group
- none
- flags
- not inclusive
- from
-
customHighlightcustomExtensions/custom-highlight.ts
data-highlight-id null class "highlight-error" suggestions [] data-character-id null data-worldbuilding-id null style null data-assigned-color null dialogMark #
- group
- none
- flags
- not inclusive
- from
-
dialogMarkcustomExtensions/dialog-mark.ts
class "dialog-mark" documentLink #
- group
- none
- flags
- not inclusive, excludes documentLink link
- from
-
documentLinkcustomExtensions/document-link.ts
fileId null label null highlight #
- group
- none
- from
-
highlight
color null intelligentQuote #
- group
- none
- flags
- not inclusive
- from
-
intelligentQuotecustomExtensions/intelligent-quote.ts
class "intelligent-quote" italic #
- group
- none
- from
-
starterKit
No attributes. In the file it is { "type": "italic" } and whatever it
holds.
link #
- group
- none
- from
-
link
href null target "_blank" rel "noopener noreferrer" class "editor-link" title null noteHighlight #
- group
- none
- from
-
noteHighlightcustomExtensions/note-highlight.ts
id null class "note" strike #
- group
- none
- from
-
starterKit
No attributes. In the file it is { "type": "strike" } and whatever it
holds.
subscript #
- group
- none
- from
-
subscript
No attributes. In the file it is { "type": "subscript" } and whatever it
holds.
superscript #
- group
- none
- from
-
superscript
No attributes. In the file it is { "type": "superscript" } and whatever it
holds.
textStyle #
- group
- none
- from
-
textStyle
color null fontSize null fontFamily null ttsEmotion #
- group
- none
- flags
- not inclusive
- from
-
ttsEmotioncustomExtensions/tts-annotations.ts
emotion "neutral" ttsVoice #
- group
- none
- flags
- not inclusive
- from
-
ttsVoicecustomExtensions/tts-annotations.ts
voice "" label "" underline #
- group
- none
- from
-
underline
No attributes. In the file it is { "type": "underline" } and whatever it
holds.
Generated from the schema Tintero builds at runtime, through
getBackgroundSchema(). Behaviour that adds no node and no mark is listed
separately, on editor extensions.