265 lines
9.7 KiB
JavaScript
Executable File
265 lines
9.7 KiB
JavaScript
Executable File
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
if you want to view the source, please visit the github repository of this plugin
|
|
*/
|
|
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __copyProps = (to, from, except, desc) => {
|
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
for (let key of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
}
|
|
return to;
|
|
};
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
|
|
// src/main.ts
|
|
var main_exports = {};
|
|
__export(main_exports, {
|
|
default: () => YuquePublishPlugin
|
|
});
|
|
module.exports = __toCommonJS(main_exports);
|
|
var import_obsidian4 = require("obsidian");
|
|
|
|
// src/settings.ts
|
|
var DEFAULT_SETTINGS = {
|
|
groups: []
|
|
};
|
|
|
|
// src/settings-tab.ts
|
|
var import_obsidian3 = require("obsidian");
|
|
|
|
// src/yuque-validator.ts
|
|
var import_obsidian = require("obsidian");
|
|
var import_obsidian2 = require("obsidian");
|
|
var YuqueValidator = class {
|
|
static async validate(config) {
|
|
const urlRegex = /^https:\/\/([^\/]+)\.yuque\.com\/([^\/]+)(\/)?$/;
|
|
const match = config.urlPrefix.match(urlRegex);
|
|
if (!match) {
|
|
throw new Error("URL format is incorrect. It should be like https://spaceName.yuque.com/groupName/");
|
|
}
|
|
const [, spaceName, groupName] = match;
|
|
const baseUrl = `https://${spaceName}.yuque.com`;
|
|
const apiUrl = `${baseUrl}/api/v2/user`;
|
|
try {
|
|
const response = await (0, import_obsidian2.requestUrl)({
|
|
url: apiUrl,
|
|
method: "GET",
|
|
headers: {
|
|
"X-Auth-Token": config.authToken
|
|
}
|
|
});
|
|
if (response.status !== 200) {
|
|
throw new Error(`API request failed with status ${response.status}`);
|
|
}
|
|
const data = response.json;
|
|
const loginName = data.data.login;
|
|
if (loginName !== groupName) {
|
|
throw new Error(`Token is valid but the team name "${loginName}" does not match the configured name "${groupName}"`);
|
|
}
|
|
new import_obsidian.Notice("Configuration is valid!");
|
|
} catch (error) {
|
|
if (error instanceof Error) {
|
|
throw new Error(`Configuration validation failed: ${error.message}`);
|
|
}
|
|
throw new Error("Configuration validation failed: Unknown error");
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/settings-tab.ts
|
|
var YuquePublishSettingTab = class extends import_obsidian3.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
const { containerEl } = this;
|
|
containerEl.empty();
|
|
new import_obsidian3.Setting(containerEl).setHeading().setName("Yuque group and token explanation");
|
|
const explanationDiv = containerEl.createDiv("yuque-explanation");
|
|
const ol = explanationDiv.createEl("ol");
|
|
const li1 = ol.createEl("li");
|
|
li1.createEl("strong", { text: "If you are using a personal account:" });
|
|
li1.createEl("p", { text: "Your URL prefix: https://www.yuque.com/yourUserName/" });
|
|
li1.createEl("p", { text: "You can find your access token in: https://www.yuque.com/settings/tokens" });
|
|
const li2 = ol.createEl("li");
|
|
li2.createEl("strong", { text: "If you are using a team account:" });
|
|
li2.createEl("p", { text: "Your URL prefix: https://spaceName.yuque.com/groupName/" });
|
|
li2.createEl("p", { text: "You can find your access token in: https://spaceName.yuque.com/groupName/settings/tokens" });
|
|
new import_obsidian3.Setting(containerEl).setName("Add group").setDesc("Add a new Yuque group configuration").addButton((button) => {
|
|
button.setButtonText("Add group").onClick(async () => {
|
|
this.plugin.settings.groups.push({
|
|
urlPrefix: "",
|
|
authToken: ""
|
|
});
|
|
await this.plugin.saveSettings();
|
|
this.display();
|
|
});
|
|
});
|
|
this.plugin.settings.groups.forEach((group, index) => {
|
|
const groupDiv = containerEl.createDiv("yuque-group-setting");
|
|
new import_obsidian3.Setting(groupDiv).setName(`Group ${index + 1}`).setHeading();
|
|
new import_obsidian3.Setting(groupDiv).setName("URL prefix").setDesc("The URL prefix of your Yuque group (e.g., https://spaceName.yuque.com/groupName/)").addText((text) => text.setPlaceholder("Enter URL prefix").setValue(group.urlPrefix).onChange(async (value) => {
|
|
this.plugin.settings.groups[index].urlPrefix = value;
|
|
await this.plugin.saveSettings();
|
|
}));
|
|
new import_obsidian3.Setting(groupDiv).setName("Access token").setDesc("The access token for this group").addText((text) => text.setPlaceholder("Enter access token").setValue(group.authToken).onChange(async (value) => {
|
|
this.plugin.settings.groups[index].authToken = value;
|
|
await this.plugin.saveSettings();
|
|
}));
|
|
new import_obsidian3.Setting(groupDiv).addButton((button) => {
|
|
button.setButtonText("Test").onClick(async () => {
|
|
try {
|
|
await YuqueValidator.validate({
|
|
urlPrefix: group.urlPrefix,
|
|
authToken: group.authToken
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof Error) {
|
|
new import_obsidian3.Notice(error.message);
|
|
} else {
|
|
new import_obsidian3.Notice("Configuration validation failed: Unknown error");
|
|
}
|
|
}
|
|
});
|
|
}).addButton((button) => {
|
|
button.setButtonText("Delete").setWarning().onClick(async () => {
|
|
this.plugin.settings.groups.splice(index, 1);
|
|
await this.plugin.saveSettings();
|
|
this.display();
|
|
});
|
|
});
|
|
});
|
|
}
|
|
};
|
|
|
|
// src/main.ts
|
|
var YuquePublishPlugin = class extends import_obsidian4.Plugin {
|
|
constructor(app, manifest) {
|
|
super(app, manifest);
|
|
}
|
|
async onload() {
|
|
await this.loadSettings();
|
|
this.addSettingTab(new YuquePublishSettingTab(this.app, this));
|
|
this.addCommand({
|
|
id: "publish-to-yuque",
|
|
name: "Publish to Yuque",
|
|
callback: async () => {
|
|
const activeFile = this.app.workspace.getActiveFile();
|
|
if (!activeFile) {
|
|
new import_obsidian4.Notice("No active file found");
|
|
return;
|
|
}
|
|
try {
|
|
await this.publishToYuque(activeFile);
|
|
} catch (error) {
|
|
new import_obsidian4.Notice(`Failed to publish: ${error.message}`);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
async publishToYuque(file) {
|
|
var _a;
|
|
const content = await this.app.vault.read(file);
|
|
const frontMatter = (_a = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter;
|
|
if (!frontMatter) {
|
|
throw new Error("No front matter found in the document");
|
|
}
|
|
const yuqueDocUrl = frontMatter["yuque-doc-url"];
|
|
if (!yuqueDocUrl) {
|
|
throw new Error("yuque-doc-url is required in front matter");
|
|
}
|
|
const urlRegex = /^https:\/\/([^\/]+)\.yuque\.com\/([^\/]+)\/([^\/]+)\/([^\/]+)$/;
|
|
const match = yuqueDocUrl.match(urlRegex);
|
|
if (!match) {
|
|
throw new Error("Invalid yuque-doc-url format, should be like https://spaceName.yuque.com/groupName/bookSlug/docSlug");
|
|
}
|
|
const title = frontMatter["yuque-doc-title"] || file.basename;
|
|
const publicValue = frontMatter["yuque-doc-public"] || 1;
|
|
if (publicValue != 0 && publicValue != 1 && publicValue != 2) {
|
|
throw new Error("Invalid yuque-doc-public value, should be 0, 1, or 2; 0: private, 1: public, 2: public for space members");
|
|
}
|
|
const urlParts = yuqueDocUrl.split("/");
|
|
if (urlParts.length !== 6) {
|
|
throw new Error("Invalid yuque-doc-url format");
|
|
}
|
|
const domain = urlParts[2];
|
|
const groupLogin = urlParts[3];
|
|
const bookSlug = urlParts[4];
|
|
const docSlug = urlParts[5];
|
|
const groupConfig = this.settings.groups.find(
|
|
(group) => yuqueDocUrl.startsWith(group.urlPrefix)
|
|
);
|
|
if (!groupConfig) {
|
|
throw new Error(`No auth token configured for ${yuqueDocUrl}`);
|
|
}
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
"X-Auth-Token": groupConfig.authToken
|
|
};
|
|
const checkUrl = `https://${domain}/api/v2/repos/${groupLogin}/${bookSlug}/docs/${docSlug}`;
|
|
let checkResponse;
|
|
try {
|
|
checkResponse = await (0, import_obsidian4.requestUrl)({
|
|
url: checkUrl,
|
|
headers
|
|
});
|
|
} catch (error) {
|
|
if (error.status === 404) {
|
|
checkResponse = { status: 404 };
|
|
} else {
|
|
throw error;
|
|
}
|
|
}
|
|
const contentWithoutFrontMatter = content.split("---")[2] || content;
|
|
const payload = {
|
|
slug: docSlug,
|
|
title,
|
|
public: publicValue,
|
|
format: "markdown",
|
|
body: contentWithoutFrontMatter
|
|
};
|
|
let response;
|
|
if (checkResponse.status === 200) {
|
|
response = await (0, import_obsidian4.requestUrl)({
|
|
url: checkUrl,
|
|
method: "PUT",
|
|
headers,
|
|
body: JSON.stringify(payload)
|
|
});
|
|
} else {
|
|
const createUrl = `https://${domain}/api/v2/repos/${groupLogin}/${bookSlug}/docs`;
|
|
response = await (0, import_obsidian4.requestUrl)({
|
|
url: createUrl,
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(payload)
|
|
});
|
|
}
|
|
if (response.status < 200 || response.status >= 300) {
|
|
throw new Error(`Failed to publish document: ${response.status}`);
|
|
}
|
|
window.open(yuqueDocUrl, "_blank");
|
|
new import_obsidian4.Notice("Document published successfully!");
|
|
}
|
|
async loadSettings() {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
}
|
|
async saveSettings() {
|
|
await this.saveData(this.settings);
|
|
}
|
|
onunload() {
|
|
}
|
|
};
|
|
|
|
/* nosourcemap */ |