Initial upload
This commit is contained in:
parent
2f542a691b
commit
5b23027983
|
@ -0,0 +1,10 @@
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = spaces
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 4
|
|
@ -0,0 +1,2 @@
|
||||||
|
npm node_modules
|
||||||
|
build
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"root": true,
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"env": { "node": true },
|
||||||
|
"plugins": [
|
||||||
|
"@typescript-eslint"
|
||||||
|
],
|
||||||
|
"extends": [
|
||||||
|
"eslint:recommended",
|
||||||
|
"plugin:@typescript-eslint/eslint-recommended",
|
||||||
|
"plugin:@typescript-eslint/recommended"
|
||||||
|
],
|
||||||
|
"parserOptions": {
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"no-unused-vars": "off",
|
||||||
|
"@typescript-eslint/no-unused-vars": ["error", { "args": "none" }],
|
||||||
|
"@typescript-eslint/ban-ts-comment": "off",
|
||||||
|
"no-prototype-builtins": "off",
|
||||||
|
"@typescript-eslint/no-empty-function": "off"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
# vscode
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
# Intellij
|
||||||
|
*.iml
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# npm
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# Don't include the compiled main.js file in the repo.
|
||||||
|
# They should be uploaded to GitHub releases instead.
|
||||||
|
main.js
|
||||||
|
|
||||||
|
# Exclude sourcemaps
|
||||||
|
*.map
|
||||||
|
|
||||||
|
# obsidian
|
||||||
|
data.json
|
||||||
|
|
||||||
|
# Exclude macOS Finder (System Explorer) View States
|
||||||
|
.DS_Store
|
|
@ -0,0 +1,42 @@
|
||||||
|
import esbuild from "esbuild";
|
||||||
|
import process from "process";
|
||||||
|
import builtins from 'builtin-modules'
|
||||||
|
|
||||||
|
const banner =
|
||||||
|
`/*
|
||||||
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||||
|
if you want to view the source, please visit the github repository of this plugin
|
||||||
|
*/
|
||||||
|
`;
|
||||||
|
|
||||||
|
const prod = (process.argv[2] === 'production');
|
||||||
|
|
||||||
|
esbuild.build({
|
||||||
|
banner: {
|
||||||
|
js: banner,
|
||||||
|
},
|
||||||
|
entryPoints: ['source/MicroPlugin.ts'],
|
||||||
|
bundle: true,
|
||||||
|
external: [
|
||||||
|
'obsidian',
|
||||||
|
'electron',
|
||||||
|
'@codemirror/autocomplete',
|
||||||
|
'@codemirror/collab',
|
||||||
|
'@codemirror/commands',
|
||||||
|
'@codemirror/language',
|
||||||
|
'@codemirror/lint',
|
||||||
|
'@codemirror/search',
|
||||||
|
'@codemirror/state',
|
||||||
|
'@codemirror/view',
|
||||||
|
'@lezer/common',
|
||||||
|
'@lezer/highlight',
|
||||||
|
'@lezer/lr',
|
||||||
|
...builtins],
|
||||||
|
format: 'cjs',
|
||||||
|
watch: !prod,
|
||||||
|
target: 'es2018',
|
||||||
|
logLevel: "info",
|
||||||
|
sourcemap: prod ? false : 'inline',
|
||||||
|
treeShaking: true,
|
||||||
|
outfile: 'main.js',
|
||||||
|
}).catch(() => process.exit(1));
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"id": "microblog-publish-plugin",
|
||||||
|
"name": "Micro.blog Publish",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"minAppVersion": "0.15.0",
|
||||||
|
"description": "Publish Note to Micro.blog",
|
||||||
|
"author": "Otavio Cordeiro",
|
||||||
|
"authorUrl": "https://otavio.cc",
|
||||||
|
"isDesktopOnly": false
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"name": "microblog-publish-plugin",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Publish Note to Micro.blog",
|
||||||
|
"main": "main.js",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "node esbuild.config.mjs",
|
||||||
|
"build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production",
|
||||||
|
"version": "node version-bump.mjs && git add manifest.json versions.json"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^16.11.6",
|
||||||
|
"@typescript-eslint/eslint-plugin": "5.29.0",
|
||||||
|
"@typescript-eslint/parser": "5.29.0",
|
||||||
|
"builtin-modules": "3.3.0",
|
||||||
|
"esbuild": "0.14.47",
|
||||||
|
"obsidian": "latest",
|
||||||
|
"tslib": "2.4.0",
|
||||||
|
"typescript": "4.7.4"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
import { App, Modal } from 'obsidian'
|
||||||
|
|
||||||
|
export class ConfirmationModal extends Modal {
|
||||||
|
|
||||||
|
constructor(app: App) {
|
||||||
|
super(app)
|
||||||
|
}
|
||||||
|
|
||||||
|
onOpen() {
|
||||||
|
const {contentEl} = this
|
||||||
|
|
||||||
|
contentEl.createEl('h2', {text: 'Published!'})
|
||||||
|
contentEl.createEl('a', {text: 'Go to Posts', href: 'https://micro.blog/account/posts/'})
|
||||||
|
}
|
||||||
|
|
||||||
|
onClose() {
|
||||||
|
const {contentEl} = this
|
||||||
|
|
||||||
|
contentEl.empty()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
import { Editor, MarkdownView, Plugin } from 'obsidian'
|
||||||
|
import { ConfirmationModal } from 'source/ConfirmationModal'
|
||||||
|
import { NetworkClient } from 'source/NetworkClient'
|
||||||
|
import { makePublishRequest, PublishResponse } from 'source/NetworkRequest.Publish'
|
||||||
|
import { StoredSettings, defaultSettings } from 'source/StoredSettings'
|
||||||
|
import { MicroPluginSettingsTab } from 'source/MicroPluginSettingsTab'
|
||||||
|
|
||||||
|
export default class MicroPlugin extends Plugin {
|
||||||
|
settings: StoredSettings
|
||||||
|
networkClient: NetworkClient
|
||||||
|
|
||||||
|
async onload() {
|
||||||
|
await this.loadSettings()
|
||||||
|
await this.loadNetworkClient()
|
||||||
|
|
||||||
|
this.addCommand({
|
||||||
|
id: 'microblog-publish-command',
|
||||||
|
name: 'Post to Micro.blog',
|
||||||
|
editorCallback: (editor: Editor, view: MarkdownView) => {
|
||||||
|
const request = makePublishRequest(editor.getValue(), this.settings.postVisibility)
|
||||||
|
this.networkClient.run<PublishResponse>(request)
|
||||||
|
new ConfirmationModal(this.app).open();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.addSettingTab(new MicroPluginSettingsTab(this.app, this))
|
||||||
|
}
|
||||||
|
|
||||||
|
onunload() {}
|
||||||
|
|
||||||
|
async loadSettings() {
|
||||||
|
this.settings = Object.assign({}, defaultSettings, await this.loadData())
|
||||||
|
}
|
||||||
|
|
||||||
|
async loadNetworkClient() {
|
||||||
|
this.networkClient = new NetworkClient(this.settings)
|
||||||
|
}
|
||||||
|
|
||||||
|
async saveSettings() {
|
||||||
|
await this.saveData(this.settings)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
import { App, PluginSettingTab, Setting } from 'obsidian'
|
||||||
|
import MicroPlugin from 'source/MicroPlugin'
|
||||||
|
|
||||||
|
export class MicroPluginSettingsTab extends PluginSettingTab {
|
||||||
|
plugin: MicroPlugin
|
||||||
|
|
||||||
|
constructor(app: App, plugin: MicroPlugin) {
|
||||||
|
super(app, plugin)
|
||||||
|
|
||||||
|
this.plugin = plugin
|
||||||
|
}
|
||||||
|
|
||||||
|
display(): void {
|
||||||
|
const {containerEl} = this
|
||||||
|
|
||||||
|
containerEl.empty()
|
||||||
|
containerEl.createEl('h2', {text: 'Micro.blog Publish'})
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName('App Token')
|
||||||
|
.setDesc('Visit Micro.blog\'s Account page to generate one')
|
||||||
|
.addText(text => text
|
||||||
|
.setPlaceholder('Enter app token')
|
||||||
|
.setValue(this.plugin.settings.appToken)
|
||||||
|
.onChange(async (value) => {
|
||||||
|
console.log('App Token: ' + value)
|
||||||
|
this.plugin.settings.appToken = value
|
||||||
|
await this.plugin.saveSettings()
|
||||||
|
}))
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName('Tags')
|
||||||
|
.setDesc('Default list of tags for new posts')
|
||||||
|
.addText(text => text
|
||||||
|
.setPlaceholder('tag1, tag2, tag3')
|
||||||
|
.setValue(this.plugin.settings.defaultTags)
|
||||||
|
.onChange(async (value) => {
|
||||||
|
console.log('Tags: ' + value)
|
||||||
|
this.plugin.settings.defaultTags = value
|
||||||
|
await this.plugin.saveSettings()
|
||||||
|
}))
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName('Post visibility')
|
||||||
|
.setDesc('Default visibility for new posts')
|
||||||
|
.addDropdown(dropDown => dropDown
|
||||||
|
.addOption('draft', 'Draft')
|
||||||
|
.addOption('published', 'Public')
|
||||||
|
.setValue(this.plugin.settings.postVisibility)
|
||||||
|
.onChange(async (value) => {
|
||||||
|
console.log('Post Visibility: '+ value)
|
||||||
|
this.plugin.settings.postVisibility = value
|
||||||
|
await this.plugin.saveSettings()
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
import { StoredSettings } from 'source/StoredSettings'
|
||||||
|
import { NetworkRequest } from 'source/NetworkRequest'
|
||||||
|
|
||||||
|
export class NetworkClient {
|
||||||
|
settings: StoredSettings
|
||||||
|
|
||||||
|
constructor(settings: StoredSettings) {
|
||||||
|
this.settings = settings
|
||||||
|
}
|
||||||
|
|
||||||
|
async run<T>(request: NetworkRequest): Promise<string | T> {
|
||||||
|
try {
|
||||||
|
const encodedParameters = new URLSearchParams(request.parameters)
|
||||||
|
const url = `https://micro.blog${request.path}?${encodedParameters}`
|
||||||
|
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: request.method,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Authorization': `Bearer ${this.settings.appToken}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Error! status: ${response.status}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = (await response.json()) as T
|
||||||
|
console.log('result is: ', JSON.stringify(result, null, 4))
|
||||||
|
|
||||||
|
return result
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof Error) {
|
||||||
|
console.log('error message: ', error.message)
|
||||||
|
return error.message
|
||||||
|
} else {
|
||||||
|
console.log('unexpected error: ', error)
|
||||||
|
return 'An unexpected error occurred'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { NetworkRequest } from 'source/NetworkRequest'
|
||||||
|
|
||||||
|
export function makePublishRequest(content: string, visiblity: string): NetworkRequest {
|
||||||
|
return new NetworkRequest(
|
||||||
|
"/micropub",
|
||||||
|
{
|
||||||
|
"h": "entry",
|
||||||
|
"content": content,
|
||||||
|
"post-status": visiblity
|
||||||
|
},
|
||||||
|
"POST"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export type PublishResponse = {
|
||||||
|
url: string
|
||||||
|
preview: string
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
export class NetworkRequest {
|
||||||
|
path: string
|
||||||
|
parameters: Record<string, string>
|
||||||
|
method: string
|
||||||
|
body?: string
|
||||||
|
|
||||||
|
constructor(path: string, parameters: Record<string, string>, method: string, body?: string) {
|
||||||
|
this.path = path
|
||||||
|
this.parameters = parameters
|
||||||
|
this.body = body
|
||||||
|
this.method = method
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
export interface StoredSettings {
|
||||||
|
appToken: string
|
||||||
|
defaultTags: string
|
||||||
|
postVisibility: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const defaultSettings: StoredSettings = {
|
||||||
|
appToken: '',
|
||||||
|
defaultTags: '',
|
||||||
|
postVisibility: 'draft'
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": ".",
|
||||||
|
"inlineSourceMap": true,
|
||||||
|
"inlineSources": true,
|
||||||
|
"module": "ESNext",
|
||||||
|
"target": "ES6",
|
||||||
|
"allowJs": true,
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"importHelpers": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"strictNullChecks": true,
|
||||||
|
"lib": [
|
||||||
|
"DOM",
|
||||||
|
"ES5",
|
||||||
|
"ES6",
|
||||||
|
"ES7"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"**/*.ts"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
import { readFileSync, writeFileSync } from "fs";
|
||||||
|
|
||||||
|
const targetVersion = process.env.npm_package_version;
|
||||||
|
|
||||||
|
let manifest = JSON.parse(readFileSync("manifest.json", "utf8"));
|
||||||
|
const { minAppVersion } = manifest;
|
||||||
|
manifest.version = targetVersion;
|
||||||
|
writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t"));
|
||||||
|
|
||||||
|
let versions = JSON.parse(readFileSync("versions.json", "utf8"));
|
||||||
|
versions[targetVersion] = minAppVersion;
|
||||||
|
writeFileSync("versions.json", JSON.stringify(versions, null, "\t"));
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"1.0.0": "0.15.0"
|
||||||
|
}
|
Loading…
Reference in New Issue