{"record":{"id":"4412b8a0e5655169","repo":"siyuan-note/siyuan","slug":"createdoctree-document-title-must-not-be-empty","errorCode":null,"errorMessage":"createDocTree document title must not be empty","messagePattern":"createDocTree document title must not be empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/template_doc_tree.go","lineNumber":157,"sourceCode":"\t\tfor key := range definition {\n\t\t\tswitch key {\n\t\t\tcase \"title\", \"template\", \"define\", \"children\":\n\t\t\tdefault:\n\t\t\t\treturn nil, fmt.Errorf(\"createDocTree document contains unknown field [%s]\", key)\n\t\t\t}\n\t\t}\n\n\t\ttitleValue, ok := definition[\"title\"]\n\t\tif !ok {\n\t\t\treturn nil, errors.New(\"createDocTree document title is required\")\n\t\t}\n\t\ttitle, ok := titleValue.(string)\n\t\tif !ok {\n\t\t\treturn nil, errors.New(\"createDocTree document title must be a string\")\n\t\t}\n\t\ttitle = normalizeDocTitle(title)\n\t\tif \"\" == title {\n\t\t\treturn nil, errors.New(\"createDocTree document title must not be empty\")\n\t\t}\n\t\tif 512 < utf8.RuneCountInString(title) {\n\t\t\treturn nil, fmt.Errorf(\"createDocTree document title exceeds %d characters\", 512)\n\t\t}\n\n\t\ttemplateName, err := templateDocTreeStringField(definition, \"template\")\n\t\tif nil != err {\n\t\t\treturn nil, err\n\t\t}\n\t\tdefineName, err := templateDocTreeStringField(definition, \"define\")\n\t\tif nil != err {\n\t\t\treturn nil, err\n\t\t}\n\t\tif \"\" != templateName && \"\" != defineName {\n\t\t\treturn nil, errors.New(\"createDocTree document template and define are mutually exclusive\")\n\t\t}\n\n\t\tstate.count++","sourceCodeStart":139,"sourceCodeEnd":175,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/template_doc_tree.go#L139-L175","documentation":"After normalization (trimming whitespace), a title that becomes the empty string is rejected. A document cannot exist without a name, so parseNodes refuses entries whose title is blank or only whitespace. This fires even when a non-empty string was supplied, because normalization strips it away.","triggerScenarios":"Titles like \"\", \"   \", or strings consisting only of characters removed by normalizeDocTitle (e.g. stray control characters) passed in a createDocTree document object.","commonSituations":"Template variables that expand to empty ({{title}} unresolved); script-built definitions where a lookup returned an empty value; copy-pasted placeholder titles.","solutions":["Provide a real, non-empty title string for each document entry.","Check that any template variable used in the title resolves to non-empty content before rendering.","Trim/validate titles in the generator so empty values fail early with a clear message."],"exampleFix":"// before\n{\"title\": \"   \", \"template\": \"note.md\"}\n// after\n{\"title\": \"Meeting notes\", \"template\": \"note.md\"}","handlingStrategy":"validation","validationCode":"const hasNonEmptyTitle = (d) => typeof d.title === 'string' && d.title.trim() !== '';\nif (!docs.every(hasNonEmptyTitle)) throw new Error('all docs need a non-empty title');","typeGuard":"const hasNonEmptyTitle = (d) => typeof d.title === 'string' && d.title.trim() !== '';","tryCatchPattern":null,"preventionTips":["Trim titles and reject empties in the generator.","Ensure template variables used in titles always resolve.","Use a fallback title when a variable may be empty."],"tags":["template","validation","empty-value"],"backgroundTag":"empty-required-field","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}