mirror of
https://github.com/jxpeng98/obsidian-to-NotionNext
synced 2026-07-29 08:08:34 +08:00
almost finish the structure
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { i18nConfig } from "src/lang/I18n";
|
||||
import {Editor, MarkdownView, setTooltip} from "obsidian";
|
||||
import { FuzzySuggester, DatabaseList } from "./FuzzySuggester";
|
||||
import { uploadCommandGeneral, uploadCommandNext } from "../upload/uploadCommand";
|
||||
import {uploadCommandCustom, uploadCommandGeneral, uploadCommandNext} from "../upload/uploadCommand";
|
||||
import ObsidianSyncNotionPlugin from "src/main";
|
||||
import {DatabaseDetails} from "../ui/settingTabs";
|
||||
|
||||
@@ -94,11 +94,11 @@ export default class RibbonCommands {
|
||||
await uploadCommandGeneral(this.plugin, this.plugin.settings, dbDetails, this.plugin.app);
|
||||
};
|
||||
}
|
||||
// else if (dbDetails.format === 'custom') {
|
||||
// editorCallback = async (editor, view) => {
|
||||
// await uploadCommandGeneral(this.plugin, dbDetails, this.plugin.app);
|
||||
// };
|
||||
// }
|
||||
else if (dbDetails.format === 'custom') {
|
||||
editorCallback = async (editor, view) => {
|
||||
await uploadCommandCustom(this.plugin, this.plugin.settings, dbDetails, this.plugin.app);
|
||||
};
|
||||
}
|
||||
|
||||
this.Ncommand.push({ id: commandId, name: commandName, editorCallback });
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import {ObsidianSettingTab} from "./settingTabs";
|
||||
|
||||
export class CustomModal extends Modal {
|
||||
propertyLines: Setting[] = []; // Store all property line settings
|
||||
properties: { customValue: string, customType: string }[] = []; // Array to store property values and types
|
||||
properties: { customName: string, customType: string }[] = []; // Array to store property values and types
|
||||
plugin: ObsidianSyncNotionPlugin;
|
||||
settingTab: ObsidianSettingTab;
|
||||
|
||||
@@ -14,19 +14,45 @@ export class CustomModal extends Modal {
|
||||
|
||||
createPropertyLine(containerEl: HTMLElement): void {
|
||||
const propertyIndex = this.properties.length;
|
||||
this.properties.push({customValue: "", customType: ""}); // Initialize with empty values
|
||||
this.properties.push({customName: "", customType: ""}); // Initialize with empty values
|
||||
|
||||
const propertyLine = new Setting(containerEl)
|
||||
|
||||
if (propertyIndex === 0) {
|
||||
propertyLine
|
||||
.setName("Property " + (propertyIndex + 1))
|
||||
.setName("Title")
|
||||
.setDesc("The title of the page, must be the first property")
|
||||
|
||||
propertyLine.addText((text) => {
|
||||
text
|
||||
.setPlaceholder("Property name")
|
||||
.setValue("")
|
||||
.onChange(async (value) => {
|
||||
this.properties[propertyIndex].customValue = value; // Update the customValue of the specific property
|
||||
this.properties[propertyIndex].customName = value; // Update the customValue of the specific property
|
||||
});
|
||||
|
||||
}
|
||||
)
|
||||
|
||||
propertyLine.addDropdown((dropdown) => {
|
||||
dropdown
|
||||
.addOption("title", "Title")
|
||||
.setValue("")
|
||||
.onChange(async (value) => {
|
||||
this.properties[propertyIndex].customType = value; // Update the customType of the specific property
|
||||
});
|
||||
}
|
||||
)
|
||||
} else {
|
||||
propertyLine
|
||||
.setName("Property " + (propertyIndex))
|
||||
|
||||
propertyLine.addText((text) => {
|
||||
text
|
||||
.setPlaceholder("Property name")
|
||||
.setValue("")
|
||||
.onChange(async (value) => {
|
||||
this.properties[propertyIndex].customName = value; // Update the customValue of the specific property
|
||||
});
|
||||
}
|
||||
)
|
||||
@@ -70,7 +96,7 @@ export class CustomModal extends Modal {
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
this.propertyLines.push(propertyLine);
|
||||
}
|
||||
|
||||
|
||||
@@ -235,9 +235,6 @@ export class EditModal extends SettingModal {
|
||||
// add database id
|
||||
this.createSettingEl(nextTabs, i18nConfig.DatabaseID, i18nConfig.NotionAPIDesc, 'password', i18nConfig.DatabaseIDText, this.dataTemp.databaseIDTemp, 'dataTemp', 'databaseIDTemp')
|
||||
|
||||
// add custom title name
|
||||
this.createSettingEl(nextTabs, i18nConfig.NotionCustomTitleName, i18nConfig.NotionCustomTitleNameDesc, 'text', i18nConfig.NotionCustomTitleText, this.dataTemp.customTitleNameTemp, 'dataTemp', 'customTitleNameTemp')
|
||||
|
||||
// add new property button
|
||||
new Setting(nextTabs)
|
||||
.setName(i18nConfig.NotionCustomValues)
|
||||
|
||||
@@ -214,9 +214,6 @@ export class SettingModal extends Modal {
|
||||
// add database id
|
||||
this.createSettingEl(nextTabs, i18nConfig.DatabaseID, i18nConfig.NotionAPIDesc, 'password', i18nConfig.DatabaseIDText, this.data.databaseID, 'data', 'databaseID')
|
||||
|
||||
// add custom title name
|
||||
this.createSettingEl(nextTabs, i18nConfig.NotionCustomTitleName, i18nConfig.NotionCustomTitleNameDesc, 'text', i18nConfig.NotionCustomTitleText, this.data.customTitleName, 'data', 'customTitleName')
|
||||
|
||||
// add new property button
|
||||
new Setting(nextTabs)
|
||||
.setName(i18nConfig.NotionCustomValues)
|
||||
@@ -251,9 +248,9 @@ export class SettingModal extends Modal {
|
||||
renderCustomPreview(properties: any[], nextTabs: HTMLElement) {
|
||||
const previewContainer = nextTabs.createDiv('preview-container');
|
||||
|
||||
properties.forEach((property: { customValue: any; customType: any; }) => {
|
||||
properties.forEach((property: { customName: any; customType: any; }) => {
|
||||
const propertyEl = previewContainer.createEl('div', {cls: 'property-preview'});
|
||||
propertyEl.createEl('span', {text: `Property: ${property.customValue}, Type: ${property.customType}`});
|
||||
propertyEl.createEl('span', {text: `Property: ${property.customName}, Type: ${property.customType}`});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ export interface DatabaseDetails {
|
||||
tagButton: boolean;
|
||||
customTitleButton: boolean;
|
||||
customTitleName: string;
|
||||
customProperties:{ customValue: string, customType: string }[];
|
||||
customProperties:{ customName: string, customType: string }[];
|
||||
// customValues: string;
|
||||
saved: boolean;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,21 @@ export async function uploadCommandNext(
|
||||
return;
|
||||
}
|
||||
|
||||
const { markDownData, nowFile, emoji, cover, tags, type, slug, stats, category, summary, paword, favicon, datetime } = await getNowFileMarkdownContentNext(app, settings)
|
||||
const {
|
||||
markDownData,
|
||||
nowFile,
|
||||
emoji,
|
||||
cover,
|
||||
tags,
|
||||
type,
|
||||
slug,
|
||||
stats,
|
||||
category,
|
||||
summary,
|
||||
paword,
|
||||
favicon,
|
||||
datetime
|
||||
} = await getNowFileMarkdownContentNext(app, settings)
|
||||
|
||||
if (markDownData) {
|
||||
const {basename} = nowFile;
|
||||
@@ -49,7 +63,6 @@ export async function uploadCommandNext(
|
||||
}
|
||||
|
||||
|
||||
|
||||
export async function uploadCommandGeneral(
|
||||
plugin: ObsidianSyncNotionPlugin,
|
||||
settings: PluginSettings,
|
||||
@@ -106,7 +119,7 @@ export async function uploadCommandCustom(
|
||||
const { basename} = nowFile;
|
||||
|
||||
const upload = new Upload2NotionCustom(plugin, dbDetails);
|
||||
const res = await upload.syncMarkdownToNotionCustom(basename, cover, customValues, markDownData, nowFile, this.app);
|
||||
const res = await upload.syncMarkdownToNotionCustom(cover, customValues, markDownData, nowFile, this.app);
|
||||
|
||||
if (res.status === 200) {
|
||||
new Notice(`${i18nConfig["sync-success"]}${basename}`);
|
||||
|
||||
@@ -11,6 +11,7 @@ export class UploadBaseGeneral {
|
||||
notion: Client;
|
||||
agent: any;
|
||||
dbDetails: DatabaseDetails
|
||||
|
||||
constructor(plugin: MyPlugin, dbDetails: DatabaseDetails) {
|
||||
this.plugin = plugin;
|
||||
this.dbDetails = dbDetails
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import {App, Notice, requestUrl, TFile} from "obsidian";
|
||||
import { Client } from "@notionhq/client";
|
||||
import {markdownToBlocks} from "@tryfabric/martian";
|
||||
import * as yamlFrontMatter from "yaml-front-matter";
|
||||
// import * as yaml from "yaml"
|
||||
@@ -21,7 +20,6 @@ export class Upload2NotionCustom extends UploadBaseCustom {
|
||||
// 暂时就直接删除,新建一个page
|
||||
async updatePage(
|
||||
notionID: string,
|
||||
title: string,
|
||||
cover: string,
|
||||
customValues: Record<string, string>,
|
||||
childArr: any,
|
||||
@@ -38,11 +36,10 @@ export class Upload2NotionCustom extends UploadBaseCustom {
|
||||
cover = databaseCover;
|
||||
}
|
||||
|
||||
return await this.createPage(title, cover, customValues, childArr);
|
||||
return await this.createPage(cover, customValues, childArr);
|
||||
}
|
||||
|
||||
async createPage(
|
||||
title: string,
|
||||
cover: string,
|
||||
customValues: Record<string, string>,
|
||||
childArr: any,
|
||||
@@ -50,42 +47,11 @@ export class Upload2NotionCustom extends UploadBaseCustom {
|
||||
|
||||
const {
|
||||
databaseID,
|
||||
customTitleButton,
|
||||
customTitleName,
|
||||
customProperties,
|
||||
notionAPI
|
||||
} = this.dbDetails;
|
||||
|
||||
const bodyString: any = {
|
||||
parent: {
|
||||
database_id: databaseID,
|
||||
},
|
||||
properties: {
|
||||
[customTitleButton
|
||||
? customTitleName
|
||||
: "title"]: {
|
||||
title: [
|
||||
{
|
||||
text: {
|
||||
content: title,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
...(Object.keys(customValues).reduce((acc, key) => {
|
||||
acc[key] = {
|
||||
rich_text: [
|
||||
{
|
||||
text: {
|
||||
content: customValues[key] || '',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
return acc;
|
||||
}, {} as Record<string, { rich_text: { text: { content: string } }[] } >)),
|
||||
},
|
||||
children: childArr,
|
||||
};
|
||||
const bodyString: any = this.buildBodyString(customProperties, customValues, childArr);
|
||||
|
||||
if (cover) {
|
||||
bodyString.cover = {
|
||||
@@ -124,7 +90,6 @@ export class Upload2NotionCustom extends UploadBaseCustom {
|
||||
}
|
||||
|
||||
async syncMarkdownToNotionCustom(
|
||||
title: string,
|
||||
cover: string,
|
||||
customValues: Record<string, string>,
|
||||
markdown: string,
|
||||
@@ -147,13 +112,12 @@ export class Upload2NotionCustom extends UploadBaseCustom {
|
||||
if (notionID) {
|
||||
res = await this.updatePage(
|
||||
notionID,
|
||||
title,
|
||||
cover,
|
||||
customValues,
|
||||
file2Block,
|
||||
);
|
||||
} else {
|
||||
res = await this.createPage(title, cover, customValues, file2Block);
|
||||
res = await this.createPage(cover, customValues, file2Block);
|
||||
}
|
||||
if (res.status === 200) {
|
||||
await updateYamlInfo(markdown, nowFile, res, app, this.plugin, this.dbDetails);
|
||||
@@ -162,4 +126,72 @@ export class Upload2NotionCustom extends UploadBaseCustom {
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
private buildPropertyObject(customName: string, customType: string, customValues: Record<string, any>) {
|
||||
const value = customValues[customName] || '';
|
||||
|
||||
switch (customType) {
|
||||
case "title":
|
||||
return {
|
||||
title: [
|
||||
{
|
||||
text: {
|
||||
content: value,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
case "rich_text":
|
||||
return {
|
||||
rich_text: [
|
||||
{
|
||||
text: {
|
||||
content: value || '',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
case "date":
|
||||
return {
|
||||
date: {
|
||||
start: value || new Date().toISOString(),
|
||||
},
|
||||
};
|
||||
case "select":
|
||||
return {
|
||||
select: {
|
||||
name: value,
|
||||
},
|
||||
};
|
||||
case "multi_select":
|
||||
return {
|
||||
multi_select: Array.isArray(value) ? value.map(item => ({name: item})) : [{name: value}],
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private buildBodyString(
|
||||
customProperties: { customName: string; customType: string }[],
|
||||
customValues: Record<string, string>,
|
||||
childArr: any,
|
||||
) {
|
||||
|
||||
const properties: { [key: string]: any } = {};
|
||||
|
||||
customProperties.forEach(({customName, customType}) => {
|
||||
properties[customName] = this.buildPropertyObject(customName, customType, customValues);
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
return {
|
||||
parent: {
|
||||
database_id: this.dbDetails.databaseID,
|
||||
},
|
||||
properties,
|
||||
children: childArr,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import {App, Notice} from "obsidian";
|
||||
import {App, Notice, TAbstractFile, TFile} from "obsidian";
|
||||
import {i18nConfig} from "../../lang/I18n";
|
||||
import {DatabaseDetails, PluginSettings} from "../../ui/settingTabs";
|
||||
|
||||
@@ -8,22 +8,29 @@ export async function getNowFileMarkdownContentCustom(
|
||||
settings: PluginSettings,
|
||||
) {
|
||||
const nowFile = app.workspace.getActiveFile();
|
||||
if (!nowFile) {
|
||||
new Notice(i18nConfig["open-file"]);
|
||||
return;
|
||||
}
|
||||
let cover = '';
|
||||
let customValues: Record<string, any> = {}; // Change 'any' to a more specific type if possible
|
||||
let customValues: Record<string, any> = {};
|
||||
|
||||
const FileCache = app.metadataCache.getFileCache(nowFile);
|
||||
try {
|
||||
cover = FileCache.frontmatter.coverurl;
|
||||
|
||||
// Get custom property names from dbDetails
|
||||
const customPropertyNames = dbDetails.customProperties.map(property => property.customValue);
|
||||
const customPropertyValues = dbDetails.customProperties.map(property => property.customName);
|
||||
|
||||
// Extract custom values from the frontmatter based on the names
|
||||
customPropertyNames.forEach(propertyName => {
|
||||
customPropertyValues.forEach( propertyName => {
|
||||
if (FileCache.frontmatter[propertyName] !== undefined) {
|
||||
customValues[propertyName] = FileCache.frontmatter[propertyName];
|
||||
}
|
||||
});
|
||||
|
||||
customValues['title'] = nowFile.basename; // Use 'basename' for the file name without extension
|
||||
|
||||
} catch (error) {
|
||||
new Notice(i18nConfig["set-tags-fail"]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user