Skip to content

Commit

Permalink
Merge pull request #4 from akosbalasko/feat-support-v2-export-format
Browse files Browse the repository at this point in the history
  • Loading branch information
akosbalasko committed Oct 30, 2022
2 parents 59d1a81 + e8b1685 commit 15fd006
Show file tree
Hide file tree
Showing 10 changed files with 119 additions and 19 deletions.
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand Down
79 changes: 73 additions & 6 deletions src/extract-onyx-notes.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,98 @@
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
const title = firstNoteLines.shift().split('|')[1].replace(/<<|>>/g,'');
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);
await createZettelNotes(vault, settings, referenceNoteId, referenceInfo, noteDetails);

}
}

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<string>): Array<ReadingNoteDetails> => {
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)

}
11 changes: 6 additions & 5 deletions src/models/reading-note-details.ts
Original file line number Diff line number Diff line change
@@ -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
}
28 changes: 27 additions & 1 deletion src/parse-onyx-note.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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()),
};
}
2 changes: 1 addition & 1 deletion src/utils/create-permanent-note-content.ts
Original file line number Diff line number Diff line change
@@ -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
: `---
Expand Down
2 changes: 1 addition & 1 deletion src/utils/get-strings-between.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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]
: ''

}
4 changes: 4 additions & 0 deletions src/utils/is-version-2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const isVersion2 = (fileContent: string): boolean => {
return !fileContent.contains('【Original Text】')

}
4 changes: 3 additions & 1 deletion versions.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"

}

0 comments on commit 15fd006

Please sign in to comment.