From e8b1685d4e4ba1533c5ced829805fbe03838b4fb Mon Sep 17 00:00:00 2001 From: Akos Balasko Date: Sat, 29 Oct 2022 00:02:44 +0200 Subject: [PATCH] =?UTF-8?q?supporting=20new=20format=20(=E3=80=90Note?= =?UTF-8?q?=E3=80=91),=20and=20some=20bugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 2 +- package-lock.json | 4 +- package.json | 2 +- src/extract-onyx-notes.ts | 79 ++++++++++++++++++++-- src/models/reading-note-details.ts | 11 +-- src/parse-onyx-note.ts | 28 +++++++- src/utils/create-permanent-note-content.ts | 2 +- src/utils/get-strings-between.ts | 2 +- src/utils/is-version-2.ts | 4 ++ versions.json | 4 +- 10 files changed, 119 insertions(+), 19 deletions(-) create mode 100644 src/utils/is-version-2.ts diff --git a/manifest.json b/manifest.json index adc01cd..fbdaef5 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "onyx-boox-extractor", "name": "Onyx Boox Annotation & Highlight Extractor", - "version": "1.0.3", + "version": "1.1.0", "minAppVersion": "0.12.0", "description": "This plugin extracts annotations and highlights files exported from Onyx Boox tablets, and converts them to reference, literature and permanent notes fitting to the Zettelkasten method.", "author": "Akos Balasko", diff --git a/package-lock.json b/package-lock.json index 2860447..7451e4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "onyx-boox-extractor", - "version": "1.0.3", + "version": "1.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "onyx-boox-extractor", - "version": "1.0.3", + "version": "1.1.0", "license": "MIT", "dependencies": { "nanoid": "^3.3.4" diff --git a/package.json b/package.json index d615468..b6793a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "onyx-boox-extractor", - "version": "1.0.3", + "version": "1.1.0", "description": "Onyx Boox Annotation & Highlight Extractor", "main": "main.js", "scripts": { diff --git a/src/extract-onyx-notes.ts b/src/extract-onyx-notes.ts index 307a280..1578599 100644 --- a/src/extract-onyx-notes.ts +++ b/src/extract-onyx-notes.ts @@ -1,14 +1,16 @@ import { createReferenceNote } from "./create-reference-note"; import { createZettelNotes } from "./create-zettel-notes"; -import { OnyxBooxExtractorSettings, ReferenceNoteDetails } from "./models"; +import { OnyxBooxExtractorSettings, ReadingNoteDetails, ReferenceNoteDetails } from "./models"; import { parseNote } from "./parse-onyx-note"; +import { isVersion2 } from "./utils/is-version-2"; + +const extractOnyxReadingNotesV1 = async (vault: any, settings: OnyxBooxExtractorSettings, fileContent: string) => { -export const extractOnyxReadingNotes = async (vault: any, settings: OnyxBooxExtractorSettings, fileContent: string) => { const NOTE_SEPARATOR = '-------------------'; - let readingNotesArray = fileContent.split(NOTE_SEPARATOR); + let readingNotesStringArray = fileContent.split(NOTE_SEPARATOR); // parse reading note // first contains the ref info - const firstNote = readingNotesArray.shift(); + const firstNote = readingNotesStringArray.shift(); let firstNoteLines = firstNote.split('\n') // readingNotesArray @@ -16,12 +18,13 @@ export const extractOnyxReadingNotes = async (vault: any, settings: OnyxBooxExtr const authors = firstNoteLines.shift(); firstNoteLines.reverse().push('\n'); firstNoteLines = firstNoteLines.reverse(); - readingNotesArray.push(firstNote); - readingNotesArray = readingNotesArray.filter(note => note.contains('【Original Text】')); + readingNotesStringArray.push(firstNote); + readingNotesStringArray = readingNotesStringArray.filter(note => note.contains('【Original Text】')); const referenceInfo: ReferenceNoteDetails = { title, authors, }; + const readingNotesArray = readingNotesStringArray.map(note => {return {raw: note}}); const referenceNoteId = await createReferenceNote(vault, settings, referenceInfo); for (const readingNote of readingNotesArray){ const noteDetails = parseNote(readingNote); @@ -29,3 +32,67 @@ export const extractOnyxReadingNotes = async (vault: any, settings: OnyxBooxExtr } } + +const extractOnyxReadingNotesV2 = async (vault: any, settings: OnyxBooxExtractorSettings, fileContent: string) => { + + const NOTE_SEPARATOR = '-------------------'; + const mainMetadata = fileContent.split('\n')[0]; + let readingNotesArray = fileContent.split('\n') + readingNotesArray.shift(); + readingNotesArray = readingNotesArray.join('\n').split(NOTE_SEPARATOR); + // parse reading note + // first contains the ref info + /*const firstNote = readingNotesArray.shift(); + let firstNoteLines = firstNote.split('\n') +*/ + // readingNotesArray + const titleAndAuthor = mainMetadata.split('|')[1]; + const title = titleAndAuthor.split('>>')[0].replace(/<|>/g, ''); + const authors = titleAndAuthor.split('>>')?.[1]; + /*firstNoteLines = firstNoteLines.reverse() + firstNoteLines.push('\n'); + firstNoteLines = firstNoteLines.reverse(); + readingNotesArray = readingNotesArray.reverse() + readingNotesArray.push(firstNote); + readingNotesArray = readingNotesArray.reverse();*/ + //readingNotesArray = readingNotesArray.filter(note => note.contains('【Original Text】')); + const referenceInfo: ReferenceNoteDetails = { + title, + authors, + }; + // parse chapters + const readingNotesArrayObj = parseChapters(readingNotesArray); + const referenceNoteId = await createReferenceNote(vault, settings, referenceInfo); + for (const readingNote of readingNotesArrayObj){ + const noteDetails = parseNote(readingNote); + await createZettelNotes(vault, settings, referenceNoteId, referenceInfo, noteDetails); + + } +} + +const parseChapters = (readingNotesArray: Array): Array => { + let currentChapter; + const readingNotes = []; + for (const note of readingNotesArray){ + const noteLines = note.split('\n').filter(line=> line !== ''); + // trying to parse the creation date + const fullFirstLine = noteLines[0]; + const creationTimeCandidate = fullFirstLine?.split('|')[0].trim(); + const creationTimeCandidateDate = new Date(creationTimeCandidate); + if (creationTimeCandidateDate.toString() === 'Invalid Date'){ + currentChapter = fullFirstLine + noteLines.splice(0,1); + } + readingNotes.push({ + section: currentChapter, + raw: noteLines.join('\n') + }) + } + return readingNotes; +} + +export const extractOnyxReadingNotes = async (vault: any, settings: OnyxBooxExtractorSettings, fileContent: string) => { + if (isVersion2) await extractOnyxReadingNotesV2(vault, settings, fileContent) + else await extractOnyxReadingNotesV1(vault, settings, fileContent) + +} diff --git a/src/models/reading-note-details.ts b/src/models/reading-note-details.ts index 1cc7e81..17818c6 100644 --- a/src/models/reading-note-details.ts +++ b/src/models/reading-note-details.ts @@ -1,7 +1,8 @@ export interface ReadingNoteDetails { - section: string; - creationTime: Date; - page: number; - originalText: string; - annotation: string; + section?: string; + creationTime?: Date; + page?: number; + originalText?: string; + annotation?: string; + raw?: string } diff --git a/src/parse-onyx-note.ts b/src/parse-onyx-note.ts index 256247b..7bcda63 100644 --- a/src/parse-onyx-note.ts +++ b/src/parse-onyx-note.ts @@ -1,7 +1,16 @@ import { ReadingNoteDetails } from "./models"; import { getStringBetween } from "./utils"; +import { isVersion2 } from "./utils/is-version-2"; -export const parseNote = (readingNote: string): ReadingNoteDetails => { +export const parseNote = (readingNote: ReadingNoteDetails): ReadingNoteDetails => { + return (readingNote.raw && isVersion2(readingNote.raw)) + ? parseNoteV2(readingNote) + : parseNoteV1(readingNote) + +} + +const parseNoteV1 = (readingNoteObj: ReadingNoteDetails): ReadingNoteDetails => { + const readingNote = readingNoteObj?.raw; const readingNoteLines = readingNote.split('\n'); return { @@ -12,3 +21,20 @@ export const parseNote = (readingNote: string): ReadingNoteDetails => { page: Number(getStringBetween(readingNote,'【Page Number】', '\n').trim()), }; } + + +const parseNoteV2 = (readingNoteObj: ReadingNoteDetails): ReadingNoteDetails => { + const readingNote = readingNoteObj?.raw; + + const readingNoteLines = readingNote.split('\n'); + const firstNoteLine = readingNoteLines[0] + readingNoteLines.shift() // remove metadata + + return { + section: readingNoteObj.section, + creationTime: new Date(firstNoteLine.split('|')[0].trim()), + originalText: readingNoteLines.join('\n').split('【Note】')[0], + annotation: (readingNote.split('【Note】').length > 0) ? readingNote.split('【Note】')[1]: undefined , + page: Number(firstNoteLine.split('Page No.:')[1].trim()), + }; +} diff --git a/src/utils/create-permanent-note-content.ts b/src/utils/create-permanent-note-content.ts index a950940..2a4c56d 100644 --- a/src/utils/create-permanent-note-content.ts +++ b/src/utils/create-permanent-note-content.ts @@ -1,7 +1,7 @@ import { ReadingNoteDetails, ReferenceNoteDetails } from "src/models"; export const createPermanentNoteContent = (noteDetails: ReadingNoteDetails,literatureFileName: string, referenceNoteId: string, referenceInfo: ReferenceNoteDetails): string => { - return (noteDetails.annotation?.replace(/\n/g,'').trim() === '') + return (!noteDetails.annotation || noteDetails.annotation.replace(/\n/g,'').trim() === '') ? undefined : `--- diff --git a/src/utils/get-strings-between.ts b/src/utils/get-strings-between.ts index 714efde..c6062ff 100644 --- a/src/utils/get-strings-between.ts +++ b/src/utils/get-strings-between.ts @@ -3,7 +3,7 @@ export const getStringBetween = (text: string, after: string, before: string): s const textArray =text.split(after); return (textArray.length > 0) - ? textArray[1].split(before)[0] + ? textArray[0].split(before)[0] : '' } diff --git a/src/utils/is-version-2.ts b/src/utils/is-version-2.ts new file mode 100644 index 0000000..3f0a670 --- /dev/null +++ b/src/utils/is-version-2.ts @@ -0,0 +1,4 @@ +export const isVersion2 = (fileContent: string): boolean => { + return !fileContent.contains('【Original Text】') + +} diff --git a/versions.json b/versions.json index 52b52d4..5831a65 100644 --- a/versions.json +++ b/versions.json @@ -2,5 +2,7 @@ "1.0.0": "0.9.7", "1.0.1": "0.12.0", "1.0.2": "0.12.0", - "1.0.3": "0.12.0" + "1.0.3": "0.12.0", + "1.1.0": "0.12.0" + }