diff --git a/src/dropTheRopeRunner.ts b/src/dropTheRopeRunner.ts index fa050464..64a3fbec 100644 --- a/src/dropTheRopeRunner.ts +++ b/src/dropTheRopeRunner.ts @@ -9,10 +9,7 @@ import { YarleOptions } from './YarleOptions'; import { loggerInfo } from './utils/loggerInfo'; import { clearLogFile } from './utils/clearLogFile'; import { applyLinks } from './utils/apply-links'; -import { createTanaOutput } from './utils/tana/create-tana-output'; -import { isTanaOutput } from './utils/tana/is-tana-output'; -const { isHeptaOutput } = require('./utils/heptabase/is-hepta-output'); -const { zipFolder } = require('./utils/heptabase/zip-folder'); +import { LanguageFactory } from './outputLanguages/LanguageFactory'; export const run = async (opts?: YarleOptions) => { clearLogFile(); @@ -42,12 +39,7 @@ export const run = async (opts?: YarleOptions) => { // apply internal links applyLinks(options, outputNotebookFolders); - // create tana output if it's required - if (isTanaOutput()){ - createTanaOutput(options, outputNotebookFolders) - } - if (isHeptaOutput()){ - await zipFolder(options, outputNotebookFolders) - } - + const langaugeFactory = new LanguageFactory(); + const targetLanguage = langaugeFactory.createLanguage(options.outputFormat) + await targetLanguage.postProcess(options, outputNotebookFolders) }; diff --git a/src/outputLanguages/Heptabase.ts b/src/outputLanguages/Heptabase.ts new file mode 100644 index 00000000..1384de9d --- /dev/null +++ b/src/outputLanguages/Heptabase.ts @@ -0,0 +1,22 @@ +import { YarleOptions } from "./../YarleOptions"; +import { Language } from "./language"; +import { zipFolder } from "./../utils/heptabase/zip-folder"; +import { StandardMD } from "./StandardMD"; + +export class Heptabase extends StandardMD implements Language { + constructor(){ + super() + } + + languageItems = { + bold: '**', + italic: '_', + highlight: '==', + strikethrough: '~~', + listItem: '* ' + }; + postProcess = async(options: YarleOptions, outputNotebookFolders: string[]) => { + await zipFolder(options, outputNotebookFolders) + }; + +} \ No newline at end of file diff --git a/src/outputLanguages/LanguageFactory.ts b/src/outputLanguages/LanguageFactory.ts new file mode 100644 index 00000000..6a06bd75 --- /dev/null +++ b/src/outputLanguages/LanguageFactory.ts @@ -0,0 +1,29 @@ +import { OutputFormat } from "./../output-format"; +import { Language } from "./language"; +import { ObsidianMD } from "./ObsidianMD"; +import { StandardMD } from "./StandardMD"; +import { Heptabase } from "./Heptabase"; +import { Tana } from "./Tana"; + +import { LanguageItems } from "./outputLanguages"; + +export class LanguageFactory { + createLanguage(type: OutputFormat): Language { + switch (type) { + case OutputFormat.ObsidianMD: + return new ObsidianMD(); + case OutputFormat.Heptabase: + return new Heptabase(); + case OutputFormat.Tana: + return new Tana(); + default: + return new StandardMD(); + } + } +} + +export const getLanguageItems = (language: OutputFormat): LanguageItems => { + const factory = new LanguageFactory(); + const lang = factory.createLanguage(language); + return lang.languageItems; +} \ No newline at end of file diff --git a/src/outputLanguages/ObsidianMD.ts b/src/outputLanguages/ObsidianMD.ts new file mode 100644 index 00000000..ca27033d --- /dev/null +++ b/src/outputLanguages/ObsidianMD.ts @@ -0,0 +1,17 @@ +import { StandardMD } from "./StandardMD"; +import { Language } from "./language"; + +export class ObsidianMD extends StandardMD implements Language { + constructor(){ + super() + } + + languageItems = { + bold: '**', + italic: '_', + highlight: '==', + strikethrough: '~~', + listItem: '* ' + }; + +} \ No newline at end of file diff --git a/src/outputLanguages/StandardMD.ts b/src/outputLanguages/StandardMD.ts new file mode 100644 index 00000000..163bf1f2 --- /dev/null +++ b/src/outputLanguages/StandardMD.ts @@ -0,0 +1,49 @@ +import { cloneDeep } from "lodash"; +import { NoteData } from "./../models/NoteData"; +import { saveMdFile } from "./../utils"; +import { YarleOptions } from "./../YarleOptions"; +import { Language } from "./language"; + +export class StandardMD implements Language { + constructor(){} + + languageItems = { + bold: '**', + italic: '_', + highlight: '`', + strikethrough: '~~', + listItem: '* ' + }; + codeBlock = '\n```\n'; + + postProcess= async(options: YarleOptions, outputNotebookFolders: string[]) => {}; + noteExtension= '.md'; + noteProcess= (data: NoteData, note: any) => { + data = (data) + + saveMdFile(fixImagesInLink(data.content), note) + }; + tagProcess= (content: string, tasks: Map, currentTaskPlaceholder: string, updatedContent: string): string => { + return updatedContent; + } + +} + + +const fixImagesInLink = (content: string):string => { + let updatedContent = cloneDeep(content); + // Regular expression for the whole string with two groups + const patternWholeString = /\[!\[\[(.*?)(?:\|(.*?))?\]\]\]\((.*?)\)/g; + + let match; + while ((match = patternWholeString.exec(content)) !== null) { + const bracketContent = match[1]; + const dimensions = match[2] || ''; // Use empty string if dimensions are not present + const parenthesesContent = match[3]; + updatedContent = (dimensions === "") + ? updatedContent.replace(`[![[${bracketContent}]]](${parenthesesContent})`, `![${parenthesesContent}](${bracketContent})`) + : updatedContent.replace(`[![[${bracketContent}|${dimensions}]]](${parenthesesContent})`, `![${parenthesesContent}\\|${dimensions}](${bracketContent})`) + + } + return updatedContent; + } \ No newline at end of file diff --git a/src/outputLanguages/Tana.ts b/src/outputLanguages/Tana.ts new file mode 100644 index 00000000..66fde6cd --- /dev/null +++ b/src/outputLanguages/Tana.ts @@ -0,0 +1,61 @@ +import { YarleOptions } from "./../YarleOptions"; +import { Language } from "./language"; +import { createTanaOutput } from "./../utils/tana/create-tana-output"; +import { StandardMD } from "./StandardMD"; +import { NoteData } from "./../models/NoteData"; +import { cleanTanaContent, convert2TanaNode } from "./../utils/tana/convert-to-tana-node"; +import { saveTanaFile } from "./../utils/save-tana-file"; +import { NodeType } from "./../utils/tana/types"; +import { checkboxDone, checkboxTodo } from './../constants'; + +export class Tana extends StandardMD implements Language { + constructor(){ + super() + } + + languageItems = { + bold: '**', + italic: '__', + highlight: '^^', + strikethrough: '~~', + listItem: '' + }; + codeBlock =''; + + postProcess = async (options: YarleOptions, outputNotebookFolders: string[]) => { + createTanaOutput(options, outputNotebookFolders); + }; + noteExtension = '.json'; + noteProcess = (data: NoteData, note: any) => { + + const tanaJson = convert2TanaNode(data) + saveTanaFile(tanaJson, note) + }; + tagProcess = (content: string, tasks: Map, currentTaskPlaceholder: string, updatedContent: string): string => { + const tanaNote = JSON.parse(content); + const rootTaskChild = tanaNote.nodes?.[0].children?.find((child:any) => child.name === currentTaskPlaceholder) + if (rootTaskChild){ + for (const taskItem of tasks.values()){ + // split by tasks + const todoState = taskItem.startsWith(checkboxTodo)? 'todo':'done' + tanaNote.nodes?.[0].children?.push({ + + uid: 'uuid' + Math.random(), + createdAt: rootTaskChild.createdAt, + editedAt: rootTaskChild.editedAt, + type: 'node' as NodeType, + + name: cleanTanaContent(taskItem, todoState === 'todo' ? checkboxTodo: checkboxDone), + todoState: todoState as "todo"|"done", + refs:[], + } + + ) + } + tanaNote.nodes?.[0].children.splice(tanaNote.nodes?.[0].children.indexOf(rootTaskChild), 1) + return JSON.stringify(tanaNote) + } + return updatedContent + } + +} \ No newline at end of file diff --git a/src/outputLanguages/language.ts b/src/outputLanguages/language.ts new file mode 100644 index 00000000..89fda438 --- /dev/null +++ b/src/outputLanguages/language.ts @@ -0,0 +1,17 @@ +export interface LanguageItems { + + bold?: string; + italic?: string; + highlight?: string; + strikethrough?: string; + listItem?: string; +} + +export interface Language { + languageItems: LanguageItems; + postProcess: Function; + noteProcess: Function; + tagProcess: Function; + noteExtension: string; + codeBlock: string; +} \ No newline at end of file diff --git a/src/outputLanguages/outputLanguages.ts b/src/outputLanguages/outputLanguages.ts index 121a8fb0..1e2695b4 100644 --- a/src/outputLanguages/outputLanguages.ts +++ b/src/outputLanguages/outputLanguages.ts @@ -1,30 +1,36 @@ + import { OutputFormat } from "./../output-format" export interface LanguageItems { bold?: string; italic?: string; highlight?: string; - strikethrough?: string; + strikethrough?: string; + listItem?: string; } +/* const languageItems: any = { } languageItems[OutputFormat.ObsidianMD] = { bold: '**', italic: '_', highlight: '==', - strikethrough: '~~', + strikethrough: '~~', + listItem: '* ' } languageItems[OutputFormat.Heptabase] = { bold: '**', italic: '_', highlight: '==', - strikethrough: '~~', + strikethrough: '~~', + listItem: '* ' } languageItems[OutputFormat.Tana] = { bold: '**', italic: '__', highlight: '^^', strikethrough: '~~', + listItem: '' } languageItems[OutputFormat.StandardMD] = { @@ -32,8 +38,9 @@ languageItems[OutputFormat.StandardMD] = { italic: '_', highlight: '`', strikethrough: '~~', + listItem: '* ' } export const getLanguageItems = (language: OutputFormat): any => { return languageItems[language] || languageItems[OutputFormat.StandardMD] -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/src/process-node.ts b/src/process-node.ts index 387d83f0..78514e3a 100644 --- a/src/process-node.ts +++ b/src/process-node.ts @@ -14,13 +14,8 @@ import { convertHtml2Md } from './convert-html-to-md'; import { convert2Html } from './convert-to-html'; import { NoteData } from './models/NoteData'; import { loggerInfo } from './utils/loggerInfo'; -import { isTOC } from './utils/is-toc'; import { RuntimePropertiesSingleton } from './runtime-properties'; -import { OutputFormat } from './output-format'; -import { convert2TanaNode } from './utils/tana/convert-to-tana-node'; -import { saveTanaFile } from './utils/save-tana-file'; -import { isTanaOutput } from './utils/tana/is-tana-output'; -import { cloneDeep } from 'lodash'; +import { LanguageFactory } from './outputLanguages/LanguageFactory'; export const processNode = (note: any, notebookName: string): void => { @@ -57,26 +52,15 @@ export const processNode = (note: any, notebookName: string): void => { let data = applyTemplate(noteData, yarleOptions); // tslint:disable-next-line:no-console // loggerInfo(`data =>\n ${JSON.stringify(data)} \n***`); - - if (isTanaOutput()){ - const tanaJson = convert2TanaNode({...noteData, content: data}, yarleOptions) - saveTanaFile(tanaJson, note) - } - else { - data = fixImagesInLink(data) - saveMdFile(data, note); - } + const langaugeFactory = new LanguageFactory(); + const targetLanguage = langaugeFactory.createLanguage(yarleOptions.outputFormat) + targetLanguage.noteProcess({...noteData, content: data}, note) if (yarleOptions.keepOriginalHtml) { convert2Html(noteData); saveHtmlFile(noteData, note); } - /* if (isTOC(noteData.title)) { - const noteIdNameMap = RuntimePropertiesSingleton.getInstance(); - noteIdNameMap.extendNoteIdNameMap(noteData); - }*/ - } catch (e) { // tslint:disable-next-line:no-console loggerInfo(`Failed to convert note: ${noteData.title}, ${JSON.stringify(e)}`); @@ -88,21 +72,3 @@ export const processNode = (note: any, notebookName: string): void => { loggerInfo(`Note "${noteData.title}" converted successfully in ${conversionDuration} seconds.`); }; - -const fixImagesInLink = (content: string):string => { - let updatedContent = cloneDeep(content); - // Regular expression for the whole string with two groups - const patternWholeString = /\[!\[\[(.*?)(?:\|(.*?))?\]\]\]\((.*?)\)/g; - - let match; - while ((match = patternWholeString.exec(content)) !== null) { - const bracketContent = match[1]; - const dimensions = match[2] || ''; // Use empty string if dimensions are not present - const parenthesesContent = match[3]; - updatedContent = (dimensions === "") - ? updatedContent.replace(`[![[${bracketContent}]]](${parenthesesContent})`, `![${parenthesesContent}](${bracketContent})`) - : updatedContent.replace(`[![[${bracketContent}|${dimensions}]]](${parenthesesContent})`, `![${parenthesesContent}\\|${dimensions}](${bracketContent})`) - - } - return updatedContent; -} \ No newline at end of file diff --git a/src/ui/index.html b/src/ui/index.html index 995fea60..9655a1d4 100644 --- a/src/ui/index.html +++ b/src/ui/index.html @@ -577,310 +577,6 @@
Tags
- -
@@ -893,43 +589,7 @@

Evernote v10+ Tasks

-
- - +
@@ -1000,58 +660,7 @@
Selected Output folder:
Designed with by Creative Tim.
- + diff --git a/src/ui/main.js b/src/ui/main.js index e7efc498..08a16d79 100644 --- a/src/ui/main.js +++ b/src/ui/main.js @@ -7,10 +7,7 @@ const { mapSettingsToYarleOptions } = require('./settingsMapper') const yarle = require('../yarle') const {OutputFormat} = require('./../output-format') const { applyLinks } = require('./../utils/apply-links'); -const { isTanaOutput } = require('./../utils/tana/is-tana-output'); -const { isHeptaOutput } = require('./../utils/heptabase/is-hepta-output'); -const {createTanaOutput } = require('./../utils/tana/create-tana-output'); -const { zipFolder } = require('./../utils/heptabase/zip-folder'); +const { LanguageFactory } = require('./../outputLanguages/LanguageFactory'); initialize(); // tslint:disable-next-line:no-require-imports variable-name @@ -75,13 +72,10 @@ const createWindow = () => { const outputNotebookFolders = await yarle.dropTheRope(settings); // apply internal links applyLinks(settings, outputNotebookFolders); - - if (isTanaOutput()){ - createTanaOutput(settings, outputNotebookFolders) - } - if (isHeptaOutput()){ - await zipFolder(settings, outputNotebookFolders) - } + + const langaugeFactory = new LanguageFactory(); + const targetLanguage = langaugeFactory.createLanguage(settings.outputFormat) + targetLanguage.postProcess(settings, outputNotebookFolders) }); diff --git a/src/utils/apply-links.ts b/src/utils/apply-links.ts index 6af227a1..1252fbcd 100644 --- a/src/utils/apply-links.ts +++ b/src/utils/apply-links.ts @@ -11,6 +11,7 @@ import { getAllOutputFilesWithExtension } from './get-all-output-files'; import { isTanaOutput } from './tana/is-tana-output'; import { updateFileContentSafely } from './file-utils'; import { getClosestFileName } from './filename-utils'; +import { LanguageFactory } from './../outputLanguages/LanguageFactory'; import { TOCNoteName } from './../constants' import { OutputFormat } from './../output-format'; @@ -47,8 +48,9 @@ export const applyLinks = (options: YarleOptions, outputNotebookFolders: Array { return path.extname(file).toLowerCase() === extension; diff --git a/src/utils/tana/convert-to-tana-node.ts b/src/utils/tana/convert-to-tana-node.ts index 7429f56b..99174940 100644 --- a/src/utils/tana/convert-to-tana-node.ts +++ b/src/utils/tana/convert-to-tana-node.ts @@ -106,7 +106,7 @@ export const convertChild = (data: NoteData, child: string) => { return convertedChild } -export const convert2TanaNode = (data: NoteData, node: any):TanaIntermediateFile => { +export const convert2TanaNode = (data: NoteData):TanaIntermediateFile => { const firstLevelChildren = data.content.replace(/(\n|\r\n)+/g, '\n').split('\n') const rootContent = data.title diff --git a/src/utils/turndown-rules/encrypt-rule.ts b/src/utils/turndown-rules/encrypt-rule.ts index 330f47be..0add3ba6 100644 --- a/src/utils/turndown-rules/encrypt-rule.ts +++ b/src/utils/turndown-rules/encrypt-rule.ts @@ -1,5 +1,4 @@ import { yarleOptions } from '../../yarle'; -import { getLanguageItems } from './../../outputLanguages/outputLanguages'; import { getAttributeProxy } from './get-attribute-proxy'; import { performDecryption } from './../decrypt' import { getTurndownService } from '../turndown-service'; diff --git a/src/utils/turndown-rules/italic-rule.ts b/src/utils/turndown-rules/italic-rule.ts index 8aa3b355..d674a87d 100644 --- a/src/utils/turndown-rules/italic-rule.ts +++ b/src/utils/turndown-rules/italic-rule.ts @@ -1,12 +1,12 @@ +import { getLanguageItems } from './../../outputLanguages/LanguageFactory'; import { yarleOptions } from '../../yarle'; -import { getLanguageItems } from './../../outputLanguages/outputLanguages'; // Note: this rule must appear *after* use(gfm) so it can override // turndown-plugin-gfm rule for strikethrough (which always uses single '~') export const italicRule = { filter: ['i'], replacement: (content: any) => { - const languageItems = getLanguageItems(yarleOptions.outputFormat); + const languageItems = getLanguageItems(yarleOptions.outputFormat) return (content.trim() !== '') ? `${languageItems.italic}${content}${languageItems.italic}` : content diff --git a/src/utils/turndown-rules/replace-code-block.ts b/src/utils/turndown-rules/replace-code-block.ts index fd23a85c..9ec51ba0 100644 --- a/src/utils/turndown-rules/replace-code-block.ts +++ b/src/utils/turndown-rules/replace-code-block.ts @@ -1,10 +1,7 @@ import { filterByNodeName } from './filter-by-nodename'; import { getAttributeProxy } from './get-attribute-proxy'; -import { OutputFormat } from './../../output-format'; -import { isTanaOutput } from '../tana/is-tana-output'; - -const markdownBlock = '\n```\n'; -const tanaCodeBlock =''; +import { LanguageFactory } from './../../outputLanguages/LanguageFactory'; +import { yarleOptions } from './../../yarle'; const isCodeBlock = (node: any) => { const nodeProxy = getAttributeProxy(node); @@ -41,8 +38,9 @@ export const replaceCodeBlock = (content: string, node: any): any => { // turndown has already escaped markdown chars (and all '\') in content; // reverse that to avoid extraneous backslashes in code block. content = unescapeMarkdown(content); - const codeBlock = isTanaOutput() ? tanaCodeBlock: markdownBlock - return `${codeBlock}${content}${codeBlock}`; + const langaugeFactory = new LanguageFactory(); + const targetLanguage = langaugeFactory.createLanguage(yarleOptions.outputFormat) + return `${targetLanguage.codeBlock}${content}${targetLanguage.codeBlock}`; } if (node.parentElement && isCodeBlock(node.parentElement) && node.parentElement.firstElementChild === node) { diff --git a/src/utils/turndown-rules/span-rule.ts b/src/utils/turndown-rules/span-rule.ts index ce03b1cc..184caf39 100644 --- a/src/utils/turndown-rules/span-rule.ts +++ b/src/utils/turndown-rules/span-rule.ts @@ -4,7 +4,7 @@ import { OutputFormat } from '../../output-format'; import { filterByNodeName } from './filter-by-nodename'; import { getAttributeProxy } from './get-attribute-proxy'; -import { getLanguageItems } from './../../outputLanguages/outputLanguages'; +import { getLanguageItems } from './../../outputLanguages/LanguageFactory'; const EVERNOTE_HIGHLIGHT = '-evernote-highlight:true;'; const EVERNOTE_COLORHIGHLIGHT = '--en-highlight'; @@ -14,11 +14,12 @@ const ITALIC = 'italic'; export const spanRule = { filter: filterByNodeName('SPAN'), replacement: (content: any, node: any) => { - const languageItems = getLanguageItems(yarleOptions.outputFormat); + //const HIGHLIGHT_SEPARATOR = yarleOptions.outputFormat === OutputFormat.ObsidianMD ? '==' : '`' ; const nodeProxy = getAttributeProxy(node); if (nodeProxy.style && content.trim() !== '') { const nodeValue: string = nodeProxy.style.value; + const languageItems = getLanguageItems(yarleOptions.outputFormat) // this aims to care for bold text generated as Bold if (content !== '') { diff --git a/src/utils/turndown-rules/strikethrough-rule.ts b/src/utils/turndown-rules/strikethrough-rule.ts index 8a64ea95..474cd8b9 100644 --- a/src/utils/turndown-rules/strikethrough-rule.ts +++ b/src/utils/turndown-rules/strikethrough-rule.ts @@ -1,5 +1,5 @@ import { yarleOptions } from '../../yarle'; -import { getLanguageItems } from './../../outputLanguages/outputLanguages'; +import { getLanguageItems } from './../../outputLanguages/LanguageFactory'; // Note: this rule must appear *after* use(gfm) so it can override // turndown-plugin-gfm rule for strikethrough (which always uses single '~') diff --git a/src/utils/turndown-rules/task-list-rule.ts b/src/utils/turndown-rules/task-list-rule.ts index d9ec7975..3e90ef8f 100644 --- a/src/utils/turndown-rules/task-list-rule.ts +++ b/src/utils/turndown-rules/task-list-rule.ts @@ -1,6 +1,6 @@ -import { isTanaOutput } from '../tana/is-tana-output'; import { OutputFormat } from '../../output-format'; import { yarleOptions } from '../../yarle'; +import { getLanguageItems } from './../../outputLanguages/LanguageFactory'; import { getAttributeProxy } from './get-attribute-proxy'; import { checkboxDone, checkboxTodo } from './../../constants'; @@ -33,6 +33,7 @@ export const taskListRule = { .replace(/^\n+/, '') // Remove leading newlines .replace(/\n+$/, '\n') // Replace trailing newlines with just a single one .replace(/\n/gm, `\n${indentCharacter}`); // Indent + const languageItems = getLanguageItems(yarleOptions.outputFormat); let prefix = indentCount > 0 ? indentChars @@ -40,7 +41,7 @@ export const taskListRule = { ? `${checkboxDone} ` : (isTodoBlock(node) ? `${checkboxTodo} ` - : getListItem())) + : languageItems.listItem)) ; const parent = node.parentNode; if (parent.nodeName === 'OL') { @@ -55,9 +56,3 @@ export const taskListRule = { return ret; }}; - -const getListItem = (): string => { - return isTanaOutput() - ? '' - : '* ' -} \ No newline at end of file diff --git a/src/yarle.ts b/src/yarle.ts index 685464fa..a14e1902 100644 --- a/src/yarle.ts +++ b/src/yarle.ts @@ -24,9 +24,7 @@ import { processTaskFactory } from './process-tasks'; import { mapEvernoteTask } from './models/EvernoteTask'; import { TaskOutputFormat } from './task-output-format'; import { isTanaOutput } from './utils/tana/is-tana-output'; -import { NodeType } from "./utils/tana/types"; -import { checkboxDone, checkboxTodo } from './constants'; -import { cleanTanaContent } from './utils/tana/convert-to-tana-node'; +import { LanguageFactory } from './outputLanguages/LanguageFactory'; export const defaultYarleOptions: YarleOptions = { enexSources: ['notebook.enex'], @@ -146,32 +144,10 @@ export const parseStream = async (options: YarleOptions, enexSource: string): Pr let updatedContent = fileContent.replace(taskPlaceholder, [...sortedTasks.values()].join('\n')); - if (isTanaOutput()){ - const tanaNote = JSON.parse(fileContent); - const rootTaskChild = tanaNote.nodes?.[0].children?.find((child:any) => child.name === taskPlaceholder) - if (rootTaskChild){ - for (const taskItem of sortedTasks.values()){ - // split by tasks - const todoState = taskItem.startsWith(checkboxTodo)? 'todo':'done' - tanaNote.nodes?.[0].children?.push({ - - uid: 'uuid' + Math.random(), - createdAt: rootTaskChild.createdAt, - editedAt: rootTaskChild.editedAt, - type: 'node' as NodeType, - - name: cleanTanaContent(taskItem, todoState === 'todo' ? checkboxTodo: checkboxDone), - todoState: todoState as "todo"|"done", - refs:[], - } - - ) - } - tanaNote.nodes?.[0].children.splice(tanaNote.nodes?.[0].children.indexOf(rootTaskChild), 1) - updatedContent = JSON.stringify(tanaNote) - } - - } + const languageFactory = new LanguageFactory(); + const language = languageFactory.createLanguage(yarleOptions.outputFormat) + updatedContent = language.tagProcess(fileContent, sortedTasks, taskPlaceholder, updatedContent) + fs.writeFileSync(currentNotePath, updatedContent); }