Skip to content

Commit

Permalink
Merge pull request #7 from joerncodes/develop
Browse files Browse the repository at this point in the history
v0.0.4 - Develop into master
  • Loading branch information
joerncodes authored Aug 21, 2022
2 parents dfcfce8 + 35b7995 commit 69c5fd2
Show file tree
Hide file tree
Showing 20 changed files with 273 additions and 92 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ If the `Save Reader URL in frontmatter` is set, this plugin will write the Reade
<dt>Fallback author</dt>
<dd>Provide a string that gets used for the <code>author</code> field in Reader if no author frontmatter is present in your note.</dd>
<dt>Omit frontmatter</dt>
<dd>If this is checked, only the note's body will be sent to Reader, without the frontmatter. Defaults to <code>true</code>.</code>
<dd>If this is checked, only the note's body will be sent to Reader, without the frontmatter. Defaults to <code>true</code>.</dd>
<dt>Submit note tags</dt>
<dd>If this is checked, your Obsidian note's tags (the ones written like <code>#tag</code> plus the ones from the frontmatter) get appended as Reader document tags. See also the <em>General tags</em> setting.</dd>
</dl>

## Frontmatter parsing
Expand Down
26 changes: 0 additions & 26 deletions TODO.md

This file was deleted.

16 changes: 10 additions & 6 deletions main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
App,
App, CachedMetadata,
Editor, FileView,
MarkdownRenderer,
MarkdownView,
Expand All @@ -12,21 +12,24 @@ import {
} from 'obsidian';
import ReaderPayload from "./src/readerpayload";
import {
DEFAULT_SETTINGS,
FRONTMATTER_KEYS, NOTICE_SAVED_SUCCEFULLY,
NOTICE_TEXT_NO_ACCESS_TOKEN,
OBSIDIAN_TO_READER_REWRITE_URL, PLUGIN_NAME,
READER_API_URL,
TEXT_TITLE_NOT_FOUND
} from "./src/constants";
import ObsidianToReaderSettingTab, {DEFAULT_SETTINGS, ObsidianToReaderSettings} from "./src/settings";
import FrontmatterParser from "./src/frontmatter/frontmatterparser";
import {EditorView} from "@codemirror/view";
import PayloadExpander from "./src/payloadexpander/payloadexpander";
import ObsidianToReaderSettingsInterface from "./src/settings/obsidiantoreadersettingsinterface";
import ObsidianToReaderSettingsTab from "./src/settings/obsidiantoreadersettingstab";
import TagCollector from "./src/tagcollector";

// Remember to rename these classes and interfaces!

export default class ObsidianToReadwiseReader extends Plugin {
settings: ObsidianToReaderSettings;
settings: ObsidianToReaderSettingsInterface;

async onload() {
await this.loadSettings();
Expand Down Expand Up @@ -77,7 +80,7 @@ export default class ObsidianToReadwiseReader extends Plugin {
});

// This adds a settings tab so the user can configure various aspects of the plugin
this.addSettingTab(new ObsidianToReaderSettingTab(this.app, this));
this.addSettingTab(new ObsidianToReaderSettingsTab(this.app, this));
}

async sendToApi() {
Expand All @@ -93,16 +96,17 @@ export default class ObsidianToReadwiseReader extends Plugin {

await MarkdownRenderer.renderMarkdown(markdown, wrapper, file?.path || '', this);

const tags = (new TagCollector(originalMarkdown, metadata, this.settings)).gatherTags();

let payload:ReaderPayload = {
title: file?.basename ?? TEXT_TITLE_NOT_FOUND,
html: wrapper.outerHTML,
url: OBSIDIAN_TO_READER_REWRITE_URL + encodeURIComponent(app.getObsidianUrl(file)),
tags: this.settings.generalTags
tags: tags
};

const payloadExpander = new PayloadExpander();
payload = payloadExpander.expandPayload(this.settings, payload, originalMarkdown);
console.log(payload);

const auth = 'Token ' + this.settings.accessToken;

Expand Down
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "obsidian-readwise-reader",
"name": "Obsidian to Reader",
"version": "0.0.3",
"version": "0.0.4",
"minAppVersion": "0.15.0",
"description": "Obsidian to Reader is a plugin to publish Obsidian documents to the new Reader service of readwise.io for later reading. Please note that Readwise Reader is currently in beta.",
"author": "Obsidian",
Expand Down
14 changes: 13 additions & 1 deletion src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import ObsidianToReaderSettingsInterface from "./settings/obsidiantoreadersettingsinterface";

export const READER_API_URL = 'https://readwise.io/api/v3/save';
export const OBSIDIAN_TO_READER_REWRITE_URL = 'https://obsidiantoreader.com/to?url=';
export const TEXT_TITLE_NOT_FOUND = 'Obsidian title could not be found.';
Expand All @@ -13,5 +15,15 @@ export const FRONTMATTER_KEYS = {
author: 'author',
banner: 'banner',
imageUrl: 'image-url',
summary: 'summary'
summary: 'summary',
tags: 'tags',
};

export const DEFAULT_SETTINGS: ObsidianToReaderSettingsInterface = {
accessToken: '',
generalTags: [],
frontmatter: false,
omitFrontmatter: true,
noteTags: false,
}

32 changes: 28 additions & 4 deletions src/frontmatter/frontmatterparser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,37 @@ export default class FrontmatterParser
return;
}


rawFrontmatter.split("\n").forEach(line => {
let parts = line.split(':').map(v => v.trim());
const key = parts[0].toString();
const value = parts.slice(1).join(':');
this.frontmatter.push(new FrontmatterEntry(key, value));
this.frontmatter.push(this.createEntry(key, value));
});
}

createEntry(key:string, value:string): FrontmatterEntry {
return new FrontmatterEntry(key, this.parseValue(value));
}

private parseValue(value: any): any {
if(Array.isArray(value)) {
return value;
}

let parsedValue:any = value;

if(value.trim().startsWith('[') && value.trim().endsWith(']')) {
value = value.slice(1,-1);
value = value.replace(/\s/g,'');

parsedValue = value
? value.split(',')
: [];
}

return parsedValue;
}

stripFrontmatter(): string {
if(this.content.indexOf('---') === - 1) {
return this.content.trim();
Expand Down Expand Up @@ -69,7 +91,7 @@ export default class FrontmatterParser
});

if (!found) {
this.frontmatter.push(new FrontmatterEntry(key, value));
this.frontmatter.push(this.createEntry(key, value));
}

return this;
Expand All @@ -79,7 +101,9 @@ export default class FrontmatterParser
{
let result = '---\n';
this.frontmatter.forEach(fm => {
result += fm.getKey() + ': ' + fm.getValue() + '\n';
result += Array.isArray(fm.getValue())
? fm.getKey() + ': [' + fm.getValue().join(', ') + ']\n'
: fm.getKey() + ': ' + fm.getValue() + '\n';
});

// no frontmatter yet
Expand Down
4 changes: 2 additions & 2 deletions src/payloadexpander/authorpayloadexpander.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import PayloadExpanderInterface from "./payloadexpanderinterface";
import {ObsidianToReaderSettings} from "../settings";
import ReaderPayload from "../readerpayload";
import {FRONTMATTER_KEYS} from "../constants";
import FrontmatterParser from "../frontmatter/frontmatterparser";
import ObsidianToReaderSettingsInterface from "../settings/obsidiantoreadersettingsinterface";

export default class AuthorPayloadExpander implements PayloadExpanderInterface {
expandPayload(settings: ObsidianToReaderSettings, payload: ReaderPayload, markdown: string): ReaderPayload {
expandPayload(settings: ObsidianToReaderSettingsInterface, payload: ReaderPayload, markdown: string): ReaderPayload {
const parser = new FrontmatterParser(markdown);

if(parser.hasFrontmatter(FRONTMATTER_KEYS.author)) {
Expand Down
4 changes: 2 additions & 2 deletions src/payloadexpander/imageurlpayloadexpander.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import PayloadExpanderInterface from "./payloadexpanderinterface";
import {ObsidianToReaderSettings} from "../settings";
import ReaderPayload from "../readerpayload";
import FrontmatterParser from "../frontmatter/frontmatterparser";
import {FRONTMATTER_KEYS} from "../constants";
import ObsidianToReaderSettingsInterface from "../settings/obsidiantoreadersettingsinterface";

export default class ImageUrlPayloadExpander implements PayloadExpanderInterface
{
expandPayload(settings: ObsidianToReaderSettings, payload: ReaderPayload, markdown: string): ReaderPayload {
expandPayload(settings: ObsidianToReaderSettingsInterface, payload: ReaderPayload, markdown: string): ReaderPayload {
const parser = new FrontmatterParser(markdown);

if(parser.hasFrontmatter(FRONTMATTER_KEYS.imageUrl)) {
Expand Down
2 changes: 1 addition & 1 deletion src/payloadexpander/payloadexpander.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {ObsidianToReaderSettings} from "../settings";
import {ObsidianToReaderSettings} from "../settings/settings";
import ReaderPayload from "../readerpayload";
import PayloadExpanderInterface from "./payloadexpanderinterface";
import AuthorPayloadExpander from "./authorpayloadexpander";
Expand Down
2 changes: 1 addition & 1 deletion src/payloadexpander/payloadexpanderinterface.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {ObsidianToReaderSettings} from "../settings";
import {ObsidianToReaderSettings} from "../settings/settings";
import ReaderPayload from "../readerpayload";

export default interface PayloadExpanderInterface {
Expand Down
4 changes: 2 additions & 2 deletions src/payloadexpander/summarypayloadexpander.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import PayloadExpanderInterface from "./payloadexpanderinterface";
import {ObsidianToReaderSettings} from "../settings";
import ReaderPayload from "../readerpayload";
import FrontmatterParser from "../frontmatter/frontmatterparser";
import {FRONTMATTER_KEYS} from "../constants";
import ObsidianToReaderSettingsInterface from "../settings/obsidiantoreadersettingsinterface";

export default class SummaryPayloadExpander implements PayloadExpanderInterface {
expandPayload(settings: ObsidianToReaderSettings, payload: ReaderPayload, markdown: string): ReaderPayload {
expandPayload(settings: ObsidianToReaderSettingsInterface, payload: ReaderPayload, markdown: string): ReaderPayload {
const parser = new FrontmatterParser(markdown);
if(parser.hasFrontmatter(FRONTMATTER_KEYS.summary)) {
payload.summary = parser.getFrontmatter(FRONTMATTER_KEYS.summary)?.getValue();
Expand Down
2 changes: 1 addition & 1 deletion src/readerpayload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ interface ReaderPayload {
url: string;
author?: string;
should_clean_html?: boolean;
tags?: [];
tags?: string[];
image_url?: string;
summary?: string;
}
Expand Down
8 changes: 8 additions & 0 deletions src/settings/obsidiantoreadersettingsinterface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export default interface ObsidianToReaderSettingsInterface {
accessToken: string;
generalTags: string[];
frontmatter: boolean;
omitFrontmatter: boolean;
fallbackAuthor?: string;
noteTags: boolean;
}
41 changes: 18 additions & 23 deletions src/settings.ts → src/settings/obsidiantoreadersettingstab.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,8 @@
import {App, PluginSettingTab, Setting} from "obsidian";
import ObsidianToReadwiseReader from "../main";
import ObsidianToReadwiseReader from "../../main";
import ObsidianToReaderSettingsInterface from "./obsidiantoreadersettingsinterface";


export interface ObsidianToReaderSettings {
accessToken: string;
generalTags: [];
frontmatter: boolean;
omitFrontmatter: boolean;
fallbackAuthor?: string;
}

export const DEFAULT_SETTINGS: ObsidianToReaderSettings = {
accessToken: '',
generalTags: [],
frontmatter: false,
omitFrontmatter: true,
}


export default class ObsidianToReaderSettingTab extends PluginSettingTab {
export default class ObsidianToReaderSettingsTab extends PluginSettingTab {
plugin: ObsidianToReadwiseReader;

constructor(app: App, plugin: ObsidianToReadwiseReader) {
Expand Down Expand Up @@ -74,9 +58,9 @@ export default class ObsidianToReaderSettingTab extends PluginSettingTab {
.setDesc(desc)
.addText(text => text
.setPlaceholder('obsidian, plugin')
.setValue(this.plugin.settings.generalTags.join(', ') || null)
.setValue(this.plugin.settings.generalTags.join(', ') || '')
.onChange(async (value) => {
let tags = [];
let tags:string[] = [];

if(value.length) {
tags = tags.concat(value.split(','));
Expand All @@ -103,7 +87,7 @@ export default class ObsidianToReaderSettingTab extends PluginSettingTab {
.setDesc('If no author frontmatter could be found, use this value instead.')
.addText(text => text
.setPlaceholder('Your name')
.setValue(this.plugin.settings.fallbackAuthor)
.setValue(this.plugin.settings.fallbackAuthor || '')
.onChange(async (value) => {
this.plugin.settings.fallbackAuthor= value;
await this.plugin.saveSettings();
Expand All @@ -118,6 +102,17 @@ export default class ObsidianToReaderSettingTab extends PluginSettingTab {
this.plugin.settings.omitFrontmatter = v;
await this.plugin.saveSettings();
})
})
});

new Setting(containerEl)
.setName('Submit note tags')
.setDesc('If this is checked, the tags from your Obsidian note will get submitted as Reader tags.')
.addToggle((t) => {
t.setValue(this.plugin.settings.noteTags);
t.onChange(async(v) => {
this.plugin.settings.noteTags = v;
await this.plugin.saveSettings();
})
});
}
}
41 changes: 41 additions & 0 deletions src/tagcollector.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import {CachedMetadata, TagCache} from "obsidian";
import FrontmatterParser from "./frontmatter/frontmatterparser";
import {FRONTMATTER_KEYS} from "./constants";
import ObsidianToReaderSettingsInterface from "./settings/obsidiantoreadersettingsinterface";

export default class TagCollector
{
private markdown:string;
private metadata:CachedMetadata;
private settings:ObsidianToReaderSettingsInterface;

constructor(markdown:string, metadata:CachedMetadata, settings:ObsidianToReaderSettingsInterface) {
this.markdown = markdown;
this.metadata = metadata;
this.settings = settings;
}

gatherTags():string[] {
let tags:string[] = [];
tags = tags.concat(this.settings.generalTags);

if(this.settings.noteTags) {
const parser = new FrontmatterParser(this.markdown);
if (parser.hasFrontmatter(FRONTMATTER_KEYS.tags)) {
tags = tags.concat(parser.getFrontmatter(FRONTMATTER_KEYS.tags)?.getValue() || []);
}

// Omit the #
if(this.metadata.tags !== undefined) {
const metadataTags = this.metadata.tags.map((t:TagCache) => {
return t.tag.startsWith('#')
? t.tag.substring(1)
: t.tag;
});
tags = tags.concat(metadataTags);
}
}

return tags;
}
}
Loading

0 comments on commit 69c5fd2

Please sign in to comment.