restructure the code for further feature

This commit is contained in:
Jiaxin Peng
2023-11-04 22:37:02 +00:00
parent ae9e0c14fb
commit 8617878582
12 changed files with 411 additions and 332 deletions

View File

@@ -43,8 +43,8 @@ jobs:
prerelease: false prerelease: false
- name: Upload zip file - name: Upload zip file
id: upload-zip id: uploadCommand-zip
uses: actions/upload-release-asset@v1 uses: actions/uploadCommand-release-asset@v1
env: env:
GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }} GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
with: with:
@@ -54,8 +54,8 @@ jobs:
asset_content_type: application/zip asset_content_type: application/zip
- name: Upload main.js - name: Upload main.js
id: upload-main id: uploadCommand-main
uses: actions/upload-release-asset@v1 uses: actions/uploadCommand-release-asset@v1
env: env:
GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }} GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
with: with:
@@ -65,8 +65,8 @@ jobs:
asset_content_type: text/javascript asset_content_type: text/javascript
- name: Upload manifest.json - name: Upload manifest.json
id: upload-manifest id: uploadCommand-manifest
uses: actions/upload-release-asset@v1 uses: actions/uploadCommand-release-asset@v1
env: env:
GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }} GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
with: with:
@@ -76,8 +76,8 @@ jobs:
asset_content_type: application/json asset_content_type: application/json
- name: Upload markdown template - name: Upload markdown template
id: upload-md id: uploadCommand-md
uses: actions/upload-release-asset@v1 uses: actions/uploadCommand-release-asset@v1
env: env:
GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }} GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
with: with:
@@ -87,8 +87,8 @@ jobs:
asset_content_type: text/markdown asset_content_type: text/markdown
# - name: Upload styles.css # - name: Upload styles.css
# id: upload-css # id: uploadCommand-css
# uses: actions/upload-release-asset@v1 # uses: actions/uploadCommand-release-asset@v1
# env: # env:
# GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }} # GITHUB_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
# with: # with:

View File

@@ -3,8 +3,13 @@
所以我在[原作者](https://github.com/EasyChris/obsidian-to-notion)的基础之上,增加了匹配[NotionNext](https://github.com/tangly1024/NotionNext)模板的功能。这样可以直接在Obsidian编辑整理好之后一键发布。 所以我在[原作者](https://github.com/EasyChris/obsidian-to-notion)的基础之上,增加了匹配[NotionNext](https://github.com/tangly1024/NotionNext)模板的功能。这样可以直接在Obsidian编辑整理好之后一键发布。
## 更新说明 ## 更新说明
### 0.2.1
- 重构代码。
### 0.2.0 ### 0.2.0
- 从这个版本开始采用了类似于BRAT的交互方式。当你点击左侧同步按钮的时候首先会弹出 - 从这个版本开始,重构了交互逻辑。现在当你点击左侧的按钮,会弹出可同步的数据库选项。你可以选择你想要同步的数据库,然后点击同步按钮。**但是现在仅支持同步单个数据库如果你的数据库不是NotionNext你可以不用更新。**
![](https://minioapi.pjx.ac.cn/img1/2023/11/c963e97f31a30c994e067c58443fed4f.gif)
### 0.1.10 ### 0.1.10
- 修正了设置中的中文显示。 - 修正了设置中的中文显示。
### 0.1.8 ### 0.1.8

View File

@@ -5,6 +5,8 @@ Thanks to the [original author](https://github.com/EasyChris/obsidian-to-notion)
Thus, based on the [original author's work](https://github.com/EasyChris/obsidian-to-notion), I've added a feature to match the [NotionNext](https://github.com/tangly1024/NotionNext) template. This way, you can edit directly in Obsidian and publish with a single click after organizing. Thus, based on the [original author's work](https://github.com/EasyChris/obsidian-to-notion), I've added a feature to match the [NotionNext](https://github.com/tangly1024/NotionNext) template. This way, you can edit directly in Obsidian and publish with a single click after organizing.
## Update ## Update
### 0.2.1
- Restructure the code
### 0.2.0 ### 0.2.0
- From this version, the interactive logic has been rewritten. When you click the ribbon icon, it will display the sync command for all presetting NotionNext databases. You can choose the database you want to sync to. **However, only NotionNext database is supported for now.** - From this version, the interactive logic has been rewritten. When you click the ribbon icon, it will display the sync command for all presetting NotionNext databases. You can choose the database you want to sync to. **However, only NotionNext database is supported for now.**
@@ -13,7 +15,7 @@ Thus, based on the [original author's work](https://github.com/EasyChris/obsidia
### 0.1.10 ### 0.1.10
- Fix the Chinese support in the settings. - Fix the Chinese support in the settings.
### 0.1.8 ### 0.1.8
- Rebuild the upload function, and add one button to select the different databases. **However, only NotionNext database is supported for now.** - Rebuild the uploadCommand function, and add one button to select the different databases. **However, only NotionNext database is supported for now.**
### 0.1.7 ### 0.1.7
- [x] Removed the `convert tag` option. Now, you can directly add tags in the YAML front matter. If you don't want to add tags, you can delete the tags in the YAML front matter or leave the tags blank. - [x] Removed the `convert tag` option. Now, you can directly add tags in the YAML front matter. If you don't want to add tags, you can delete the tags in the YAML front matter or leave the tags blank.
@@ -189,9 +191,9 @@ Fill the configuration with the `NOTION_API_KEY` and `DATABASE_ID` you got
![](./doc/2.png) ![](./doc/2.png)
## Upload file content to notion ## Upload file content to notion
Click the upload notion button Click the uploadCommand notion button
![](./doc/4.png) ![](./doc/4.png)
A share link will be automatically generated after successful upload A share link will be automatically generated after successful uploadCommand
![](./doc/5.png) ![](./doc/5.png)

View File

@@ -1,6 +1,6 @@
import { FuzzySuggestModal, FuzzyMatch } from 'obsidian'; import { FuzzySuggestModal, FuzzyMatch } from 'obsidian';
import MyPlugin from "./main"; import MyPlugin from "../main";
import {i18nConfig} from "./lang/I18n"; import {i18nConfig} from "../lang/I18n";
/** /**
* Simple interface for what should be displayed and stored for suggester * Simple interface for what should be displayed and stored for suggester
@@ -10,9 +10,7 @@ export interface DatabaseList {
match: any // match: any //
} }
/**
* Generic suggester for quick reuse
*/
export class FuzzySuggester extends FuzzySuggestModal<DatabaseList>{ export class FuzzySuggester extends FuzzySuggestModal<DatabaseList>{
private plugin: MyPlugin; private plugin: MyPlugin;
private data: DatabaseList[]; private data: DatabaseList[];

View File

@@ -1,17 +1,21 @@
import {i18nConfig} from "src/lang/I18n"; import {i18nConfig} from "src/lang/I18n";
import MyPlugin from "src/main";
import {Editor, MarkdownView} from "obsidian"; import {Editor, MarkdownView} from "obsidian";
import {FuzzySuggester, DatabaseList} from "./FuzzySuggester"; import {FuzzySuggester, DatabaseList} from "./FuzzySuggester";
import {uploadCommand} from "../upload/uploadCommand";
import ObsidianSyncNotionPlugin from "src/main";
// create the commands list // create the commands list
export default class RibbonCommands { export default class RibbonCommands {
plugin: MyPlugin; plugin: ObsidianSyncNotionPlugin;
// Total commands that will be used // Total commands that will be used
Ncommand = [ Ncommand = [
{ {
id: "share-to-notionnext", id: "share-to-notionnext",
name: i18nConfig.ribbonIcon, // Use the translated text from i18nConfig name: i18nConfig.ribbonIcon, // Use the translated text from i18nConfig
editorCallback: async (editor: Editor, view: MarkdownView) => { editorCallback: async (editor: Editor, view: MarkdownView) => {
await this.plugin.upload(); // await this.plugin.uploadCommand()
await uploadCommand(this.plugin, this.plugin.settings, this.plugin.app)
} }
}, },
// { // {
@@ -39,7 +43,7 @@ export default class RibbonCommands {
await fusg.display(async (results) => {await results.match()}) await fusg.display(async (results) => {await results.match()})
}; };
constructor(plugin: MyPlugin) { constructor(plugin: ObsidianSyncNotionPlugin) {
this.plugin = plugin; this.plugin = plugin;
// Register all the commands // Register all the commands

View File

@@ -10,8 +10,8 @@ export const I18n: { [key: string]: any } = {
NotionAPI: "Notion API Token", NotionAPI: "Notion API Token",
NotionAPIDesc: "It's a secret", NotionAPIDesc: "It's a secret",
NotionAPIText: "Enter your Notion API Token", NotionAPIText: "Enter your Notion API Token",
NotionID: "Database ID", DatabaseID: "Database ID",
NotionIDText: "Enter your Database ID", DatabaseIDText: "Enter your Database ID",
BannerUrl: "Banner url(optional)", BannerUrl: "Banner url(optional)",
BannerUrlDesc: BannerUrlDesc:
"page banner url(optional), default is empty, if you want to show a banner, please enter the url(like:https://raw.githubusercontent.com/EasyChris/obsidian-to-notion/ae7a9ac6cf427f3ca338a409ce6967ced9506f12/doc/2.png)", "page banner url(optional), default is empty, if you want to show a banner, please enter the url(like:https://raw.githubusercontent.com/EasyChris/obsidian-to-notion/ae7a9ac6cf427f3ca338a409ce6967ced9506f12/doc/2.png)",
@@ -49,8 +49,8 @@ export const I18n: { [key: string]: any } = {
NotionAPI: "Notion API 令牌", NotionAPI: "Notion API 令牌",
NotionAPIDesc: "显示为密码", NotionAPIDesc: "显示为密码",
NotionAPIText: "输入你的 Notion API 令牌", NotionAPIText: "输入你的 Notion API 令牌",
NotionID: "数据库 ID", DatabaseID: "数据库 ID",
NotionIDText: "输入你的数据库 ID", DatabaseIDText: "输入你的数据库 ID",
BannerUrl: "封面图片地址(可选)", BannerUrl: "封面图片地址(可选)",
BannerUrlDesc: BannerUrlDesc:
"页面封面图片地址可选默认为空如果你想显示封面图片请输入图片地址例如https://raw.githubusercontent.com/EasyChris/obsidian-to-notion/ae7a9ac6cf427f3ca338a409ce6967ced9506f12/doc/2.png", "页面封面图片地址可选默认为空如果你想显示封面图片请输入图片地址例如https://raw.githubusercontent.com/EasyChris/obsidian-to-notion/ae7a9ac6cf427f3ca338a409ce6967ced9506f12/doc/2.png",

View File

@@ -3,30 +3,16 @@ import {addIcons} from 'src/ui/icon';
import {Upload2NotionGeneral} from "src/upload/Upload2NotionGeneral"; import {Upload2NotionGeneral} from "src/upload/Upload2NotionGeneral";
import {Upload2NotionNext} from "src/upload/Upload2NotionNext"; import {Upload2NotionNext} from "src/upload/Upload2NotionNext";
import {i18nConfig} from "src/lang/I18n"; import {i18nConfig} from "src/lang/I18n";
import ribbonCommands from "src/NotionCommands"; import ribbonCommands from "src/commands/NotionCommands";
import { ObsidianSettingTab, PluginSettings, DEFAULT_SETTINGS } from "src/ui/settingTabs";
import {getNowFileMarkdownContent} from "src/upload/getMarkdown";
// Remember to rename these classes and interfaces! // Remember to rename these classes and interfaces!
interface PluginSettings {
NNon: boolean;
notionAPI: string;
databaseID: string;
bannerUrl: string;
notionID: string;
proxy: string;
}
const DEFAULT_SETTINGS: PluginSettings = {
NNon: undefined,
notionAPI: "",
databaseID: "",
bannerUrl: "",
notionID: "",
proxy: "",
};
export default class ObsidianSyncNotionPlugin extends Plugin { export default class ObsidianSyncNotionPlugin extends Plugin {
settings: PluginSettings; settings: PluginSettings;
commands: ribbonCommands; commands: ribbonCommands;
app: App;
async onload() { async onload() {
await this.loadSettings(); await this.loadSettings();
@@ -39,23 +25,15 @@ export default class ObsidianSyncNotionPlugin extends Plugin {
i18nConfig.ribbonIcon, i18nConfig.ribbonIcon,
async (evt: MouseEvent) => { async (evt: MouseEvent) => {
// Called when the user clicks the icon. // Called when the user clicks the icon.
// await this.upload(); // await this.uploadCommand();
this.commands.ribbonDisplay(); this.commands.ribbonDisplay();
} }
); );
// This adds a status bar item to the bottom of the app. Does not work on mobile apps. // This adds a status bar item to the bottom of the app. Does not work on mobile apps.
const statusBarItemEl = this.addStatusBarItem();
// statusBarItemEl.setText("share to notion");
this.addCommand({
id: "share-to-notionnext",
name: i18nConfig.CommandName,
editorCallback: async (editor: Editor, view: MarkdownView) => {
await this.upload()
},
});
// const statusBarItemEl = this.addStatusBarItem();
// // statusBarItemEl.setText("share to notion");
// This adds a settings tab so the user can configure various aspects of the plugin // This adds a settings tab so the user can configure various aspects of the plugin
this.addSettingTab(new ObsidianSettingTab(this.app, this)); this.addSettingTab(new ObsidianSettingTab(this.app, this));
@@ -65,103 +43,47 @@ export default class ObsidianSyncNotionPlugin extends Plugin {
onunload() { onunload() {
} }
async upload() { // async uploadCommand() {
const {notionAPI, databaseID, NNon} = this.settings; // const {notionAPI, databaseID, NNon} = this.settings;
//
// // Check if NNon exists
// if (NNon === undefined) {
// const NNonmessage = i18nConfig.NNonMissing;
// new Notice(NNonmessage);
// return;
// }
//
// // Check if the user has set up the Notion API and database ID
// if (notionAPI === "" || databaseID === "") {
// const setAPIMessage = i18nConfig["set-api-id"];
// new Notice(setAPIMessage);
// return;
// }
//
// const {markDownData, nowFile, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime} = await getNowFileMarkdownContent(this.app, this.settings)
//
// if (markDownData) {
// const {basename} = nowFile;
// let upload;
// let res;
//
// if (NNon) {
// upload = new Upload2NotionNext(this);
// res = await upload.syncMarkdownToNotionNext(basename, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime, markDownData, nowFile, this.app, this.settings);
// } else {
// upload = new Upload2NotionGeneral(this);
// res = await upload.syncMarkdownToNotionGeneral(basename, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime, markDownData, nowFile, this.app, this.settings);
// }
//
//
// if (res.status === 200) {
// new Notice(`${i18nConfig["sync-success"]}${basename}`);
// } else {
// new Notice(`${i18nConfig["sync-fail"]}${basename}`, 5000);
// }
// }
// }
// Check if NNon exists
if (NNon === undefined) {
const NNonmessage = i18nConfig.NNonMissing;
new Notice(NNonmessage);
return;
}
// Check if the user has set up the Notion API and database ID
if (notionAPI === "" || databaseID === "") {
const setAPIMessage = i18nConfig["set-api-id"];
new Notice(setAPIMessage);
return;
}
const {markDownData, nowFile, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime} = await this.getNowFileMarkdownContent(this.app);
if (markDownData) {
const {basename} = nowFile;
let upload;
let res;
if (NNon) {
upload = new Upload2NotionNext(this);
res = await upload.syncMarkdownToNotionNext(basename, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime, markDownData, nowFile, this.app, this.settings);
} else {
upload = new Upload2NotionGeneral(this);
res = await upload.syncMarkdownToNotionGeneral(basename, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime, markDownData, nowFile, this.app, this.settings);
}
if (res.status === 200) {
new Notice(`${i18nConfig["sync-success"]}${basename}`);
} else {
new Notice(`${i18nConfig["sync-fail"]}${basename}`, 5000);
}
}
}
async getNowFileMarkdownContent(app: App) {
const nowFile = app.workspace.getActiveFile();
const {NNon} = this.settings;
let emoji = ''
let cover = ''
let tags = []
let type = ''
let slug = ''
let stats = ''
let category = ''
let summary = ''
let paword = ''
let favicon = ''
let datetime = ''
const FileCache = app.metadataCache.getFileCache(nowFile)
try {
if (NNon) {
emoji = FileCache.frontmatter.titleicon;
cover = FileCache.frontmatter.coverurl;
tags = FileCache.frontmatter.tags;
type = FileCache.frontmatter.type;
slug = FileCache.frontmatter.slug;
stats = FileCache.frontmatter.stats;
category = FileCache.frontmatter.category;
summary = FileCache.frontmatter.summary;
paword = FileCache.frontmatter.password;
favicon = FileCache.frontmatter.icon;
datetime = FileCache.frontmatter.date;
}
} catch (error) {
new Notice(i18nConfig["set-tags-fail"]);
}
if (nowFile) {
const markDownData = await nowFile.vault.read(nowFile);
return {
markDownData,
nowFile,
emoji,
cover,
tags,
type,
slug,
stats,
category,
summary,
paword,
favicon,
datetime,
};
} else {
new Notice(i18nConfig["open-file"]);
return;
}
}
async loadSettings() { async loadSettings() {
this.settings = Object.assign( this.settings = Object.assign(
@@ -174,110 +96,9 @@ export default class ObsidianSyncNotionPlugin extends Plugin {
async saveSettings() { async saveSettings() {
await this.saveData(this.settings); await this.saveData(this.settings);
} }
} }
class ObsidianSettingTab extends PluginSettingTab {
plugin: ObsidianSyncNotionPlugin;
constructor(app: App, plugin: ObsidianSyncNotionPlugin) {
super(app, plugin);
this.plugin = plugin;
}
display(): void {
const {containerEl} = this;
containerEl.empty();
new Setting(containerEl)
.setName(i18nConfig.NotionNextVersion)
.setDesc(i18nConfig.NotionNextVersionDesc)
.addToggle((toggle) =>
toggle
.setValue(this.plugin.settings.NNon)
.onChange(async (value) => {
this.plugin.settings.NNon = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl('h2', {text: i18nConfig.NotionNextSetting})
new Setting(containerEl)
.setName(i18nConfig.NotionAPI)
.setDesc(i18nConfig.NotionAPIDesc)
.addText((text) => {
text.inputEl.type = 'password';
return text
.setPlaceholder(i18nConfig.NotionAPIText)
.setValue(this.plugin.settings.notionAPI)
.onChange(async (value) => {
this.plugin.settings.notionAPI = value;
await this.plugin.saveSettings();
})
});
const notionDatabaseID = new Setting(containerEl)
.setName(i18nConfig.NotionID)
.setDesc(i18nConfig.NotionAPIDesc)
.addText((text) => {
text.inputEl.type = 'password';
return text
.setPlaceholder(i18nConfig.NotionIDText)
.setValue(this.plugin.settings.databaseID)
.onChange(async (value) => {
this.plugin.settings.databaseID = value;
await this.plugin.saveSettings();
})
}
);
// notionDatabaseID.controlEl.querySelector('input').type='password'
new Setting(containerEl)
.setName(i18nConfig.BannerUrl)
.setDesc(i18nConfig.BannerUrlDesc)
.addText((text) =>
text
.setPlaceholder(i18nConfig.BannerUrlText)
.setValue(this.plugin.settings.bannerUrl)
.onChange(async (value) => {
this.plugin.settings.bannerUrl = value;
await this.plugin.saveSettings();
})
);
new Setting(containerEl)
.setName(i18nConfig.NotionUser)
.setDesc(i18nConfig.NotionUserDesc)
.addText((text) =>
text
.setPlaceholder(i18nConfig.NotionUserText)
.setValue(this.plugin.settings.notionID)
.onChange(async (value) => {
this.plugin.settings.notionID = value;
await this.plugin.saveSettings();
})
);
// General Database Settings
containerEl.createEl('h2', {text: i18nConfig.NotionGeneralSetting});
new Setting(containerEl)
.setName(i18nConfig.NotYetFinish)
// new Setting(containerEl)
// .setName("Convert tags(optional)")
// .setDesc("Transfer the Obsidian tags to the Notion table. It requires the column with the name 'Tags'")
// .addToggle((toggle) =>
// toggle
// .setValue(this.plugin.settings.allowTags)
// .onChange(async (value) => {
// this.plugin.settings.allowTags = value;
// await this.plugin.saveSettings();
// })
// );
}
}

128
src/ui/settingTabs.ts Normal file
View File

@@ -0,0 +1,128 @@
import {App, PluginSettingTab, Setting} from "obsidian";
import {i18nConfig} from "../lang/I18n";
import ObsidianSyncNotionPlugin from "../main";
export interface PluginSettings {
NNon: boolean;
notionAPI: string;
databaseID: string;
bannerUrl: string;
notionUser: string;
proxy: string;
}
export const DEFAULT_SETTINGS: PluginSettings = {
NNon: undefined,
notionAPI: "",
databaseID: "",
bannerUrl: "",
notionUser: "",
proxy: "",
};
export class ObsidianSettingTab extends PluginSettingTab {
plugin: ObsidianSyncNotionPlugin;
constructor(app: App, plugin: ObsidianSyncNotionPlugin) {
super(app, plugin);
this.plugin = plugin;
}
display(): void {
const {containerEl} = this;
containerEl.empty();
new Setting(containerEl)
.setName(i18nConfig.NotionNextVersion)
.setDesc(i18nConfig.NotionNextVersionDesc)
.addToggle((toggle) =>
toggle
.setValue(this.plugin.settings.NNon)
.onChange(async (value) => {
this.plugin.settings.NNon = value;
await this.plugin.saveSettings();
})
);
containerEl.createEl('h2', {text: i18nConfig.NotionNextSetting})
new Setting(containerEl)
.setName(i18nConfig.NotionAPI)
.setDesc(i18nConfig.NotionAPIDesc)
.addText((text) => {
text.inputEl.type = 'password';
return text
.setPlaceholder(i18nConfig.NotionAPIText)
.setValue(this.plugin.settings.notionAPI)
.onChange(async (value) => {
this.plugin.settings.notionAPI = value;
await this.plugin.saveSettings();
})
});
const notionDatabaseID = new Setting(containerEl)
.setName(i18nConfig.DatabaseID)
.setDesc(i18nConfig.NotionAPIDesc)
.addText((text) => {
text.inputEl.type = 'password';
return text
.setPlaceholder(i18nConfig.DatabaseIDText)
.setValue(this.plugin.settings.databaseID)
.onChange(async (value) => {
this.plugin.settings.databaseID = value;
await this.plugin.saveSettings();
})
}
);
// notionDatabaseID.controlEl.querySelector('input').type='password'
new Setting(containerEl)
.setName(i18nConfig.BannerUrl)
.setDesc(i18nConfig.BannerUrlDesc)
.addText((text) =>
text
.setPlaceholder(i18nConfig.BannerUrlText)
.setValue(this.plugin.settings.bannerUrl)
.onChange(async (value) => {
this.plugin.settings.bannerUrl = value;
await this.plugin.saveSettings();
})
);
new Setting(containerEl)
.setName(i18nConfig.NotionUser)
.setDesc(i18nConfig.NotionUserDesc)
.addText((text) =>
text
.setPlaceholder(i18nConfig.NotionUserText)
.setValue(this.plugin.settings.notionUser)
.onChange(async (value) => {
this.plugin.settings.notionUser = value;
await this.plugin.saveSettings();
})
);
// General Database Settings
containerEl.createEl('h2', {text: i18nConfig.NotionGeneralSetting});
new Setting(containerEl)
.setName(i18nConfig.NotYetFinish)
// new Setting(containerEl)
// .setName("Convert tags(optional)")
// .setDesc("Transfer the Obsidian tags to the Notion table. It requires the column with the name 'Tags'")
// .addToggle((toggle) =>
// toggle
// .setValue(this.plugin.settings.allowTags)
// .onChange(async (value) => {
// this.plugin.settings.allowTags = value;
// await this.plugin.saveSettings();
// })
// );
}
}

View File

@@ -1,6 +1,6 @@
import { App, Notice, requestUrl, TFile } from "obsidian"; import {App, Notice, requestUrl, TFile} from "obsidian";
import { Client } from '@notionhq/client'; import {Client} from '@notionhq/client';
import { markdownToBlocks, } from "@tryfabric/martian"; import {markdownToBlocks,} from "@tryfabric/martian";
import * as yamlFrontMatter from "yaml-front-matter"; import * as yamlFrontMatter from "yaml-front-matter";
// import * as yaml from "yaml" // import * as yaml from "yaml"
import MyPlugin from "src/main"; import MyPlugin from "src/main";
@@ -9,6 +9,7 @@ export class UploadBase {
plugin: MyPlugin; plugin: MyPlugin;
notion: Client; notion: Client;
agent: any; agent: any;
constructor(plugin: MyPlugin) { constructor(plugin: MyPlugin) {
this.plugin = plugin; this.plugin = plugin;
} }
@@ -46,13 +47,15 @@ export class UploadBase {
} }
async updateYamlInfo(yamlContent: string, nowFile: TFile, res: any, app: App, settings: any) { async updateYamlInfo(yamlContent: string, nowFile: TFile, res: any, app: App, settings: any) {
let { url, id } = res.json let {url, id} = res.json
// replace www to notionID // replace www to notionID
const { notionID } = settings; const {notionUser} = this.plugin.settings;
if (notionID !== "") {
if (notionUser !== "") {
// replace url str "www" to notionID // replace url str "www" to notionID
url = url.replace("www.notion.so", `${notionID}.notion.site`) url = url.replace("www.notion.so", `${notionUser}.notion.site`)
} }
await app.fileManager.processFrontMatter(nowFile, yamlContent => { await app.fileManager.processFrontMatter(nowFile, yamlContent => {
if (yamlContent['notionID']) { if (yamlContent['notionID']) {
delete yamlContent['notionID'] delete yamlContent['notionID']

View File

@@ -5,8 +5,10 @@ import { markdownToBlocks, } from "@tryfabric/martian";
import * as yamlFrontMatter from "yaml-front-matter"; import * as yamlFrontMatter from "yaml-front-matter";
// import * as yaml from "yaml" // import * as yaml from "yaml"
import MyPlugin from "src/main"; import MyPlugin from "src/main";
import {PluginSettings} from "../ui/settingTabs";
export class Upload2NotionNext extends UploadBase { export class Upload2NotionNext extends UploadBase {
settings: PluginSettings;
constructor(plugin: MyPlugin) { constructor(plugin: MyPlugin) {
super(plugin); super(plugin);
} }
@@ -155,7 +157,7 @@ export class Upload2NotionNext extends UploadBase {
} }
} }
async syncMarkdownToNotionNext(title: string, emoji: string, cover: string, tags: string[], type: string, slug: string, stats: string, category: string, summary: string, paword: string, favicon: string, datetime: string, markdown: string, nowFile: TFile, app: App, settings: any): Promise<any> { async syncMarkdownToNotionNext(title: string, emoji: string, cover: string, tags: string[], type: string, slug: string, stats: string, category: string, summary: string, paword: string, favicon: string, datetime: string, markdown: string, nowFile: TFile, app: App, settings: PluginSettings): Promise<any> {
let res: any let res: any
const yamlContent: any = yamlFrontMatter.loadFront(markdown); const yamlContent: any = yamlFrontMatter.loadFront(markdown);
const __content = yamlContent.__content const __content = yamlContent.__content

62
src/upload/getMarkdown.ts Normal file
View File

@@ -0,0 +1,62 @@
import {App, Notice} from "obsidian";
import {i18nConfig} from "../lang/I18n";
import {PluginSettings} from "../ui/settingTabs";
export async function getNowFileMarkdownContent(
app: App,
settings: PluginSettings,
) {
const nowFile = app.workspace.getActiveFile();
const {NNon} = settings; // Change this line
let emoji = '';
let cover = '';
let tags = [];
let type = '';
let slug = '';
let stats = '';
let category = '';
let summary = '';
let paword = '';
let favicon = '';
let datetime = '';
const FileCache = app.metadataCache.getFileCache(nowFile);
try {
if (NNon) {
emoji = FileCache.frontmatter.titleicon;
cover = FileCache.frontmatter.coverurl;
tags = FileCache.frontmatter.tags;
type = FileCache.frontmatter.type;
slug = FileCache.frontmatter.slug;
stats = FileCache.frontmatter.stats;
category = FileCache.frontmatter.category;
summary = FileCache.frontmatter.summary;
paword = FileCache.frontmatter.password;
favicon = FileCache.frontmatter.icon;
datetime = FileCache.frontmatter.date;
}
} catch (error) {
new Notice(i18nConfig["set-tags-fail"]);
}
if (nowFile) {
const markDownData = await nowFile.vault.read(nowFile);
return {
markDownData,
nowFile,
emoji,
cover,
tags,
type,
slug,
stats,
category,
summary,
paword,
favicon,
datetime,
};
} else {
new Notice(i18nConfig["open-file"]);
return;
}
}

View File

@@ -0,0 +1,54 @@
import {i18nConfig} from "../lang/I18n";
import {App, Notice} from "obsidian";
import {getNowFileMarkdownContent} from "./getMarkdown";
import {Upload2NotionNext} from "./Upload2NotionNext";
import {Upload2NotionGeneral} from "./Upload2NotionGeneral";
import {PluginSettings} from "../ui/settingTabs";
import ObsidianSyncNotionPlugin from "../main";
export async function uploadCommand(
plugin: ObsidianSyncNotionPlugin,
settings: PluginSettings,
app: App,
) {
const {notionAPI, databaseID, NNon} = settings;
// Check if NNon exists
if (NNon === undefined) {
const NNonmessage = i18nConfig.NNonMissing;
new Notice(NNonmessage);
return;
}
// Check if the user has set up the Notion API and database ID
if (notionAPI === "" || databaseID === "") {
const setAPIMessage = i18nConfig["set-api-id"];
new Notice(setAPIMessage);
return;
}
const {markDownData, nowFile, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime} = await getNowFileMarkdownContent(app, settings)
if (markDownData) {
const {basename} = nowFile;
let upload;
let res;
if (NNon) {
upload = new Upload2NotionNext(plugin);
res = await upload.syncMarkdownToNotionNext(basename, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime, markDownData, nowFile, this.app, this.settings);
} else {
upload = new Upload2NotionGeneral(plugin);
res = await upload.syncMarkdownToNotionGeneral(basename, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime, markDownData, nowFile, this.app, this.settings);
}
if (res.status === 200) {
new Notice(`${i18nConfig["sync-success"]}${basename}`);
} else {
new Notice(`${i18nConfig["sync-fail"]}${basename}`, 5000);
}
}
}