From 4638ea78556e36604a044104bac76210d3f0353f Mon Sep 17 00:00:00 2001 From: chrislicodes Date: Thu, 18 May 2023 14:43:46 +0200 Subject: [PATCH] chore: rename to chessStudy --- README.md | 22 ++++----- imgs/chess-study-codeblock.png | Bin 0 -> 43888 bytes ...chessify-demo.gif => chess-study-demo.gif} | Bin ...essify-modal.png => chess-study-modal.png} | Bin imgs/chessify-codeblock.png | Bin 14138 -> 0 bytes manifest.json | 4 +- package-lock.json | 6 +-- package.json | 4 +- src/components/ReactView.tsx | 22 ++++----- src/components/obsidian/SettingsTab.ts | 12 ++--- .../react/{Chessify.tsx => ChessStudy.tsx} | 42 +++++++++--------- .../react/ChessgroundWrapper/index.tsx | 6 +-- src/main.tsx | 41 ++++++++--------- src/utils/index.ts | 34 +++++++------- 14 files changed, 97 insertions(+), 96 deletions(-) create mode 100644 imgs/chess-study-codeblock.png rename imgs/{chessify-demo.gif => chess-study-demo.gif} (100%) rename imgs/{chessify-modal.png => chess-study-modal.png} (100%) delete mode 100644 imgs/chessify-codeblock.png rename src/components/react/{Chessify.tsx => ChessStudy.tsx} (82%) diff --git a/README.md b/README.md index 0afce24..6bba268 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Chessify +# Obsidian Chess Study > A chess study helper and PGN viewer/editor for [Obsidian](https://obsidian.md/). @@ -26,23 +26,23 @@ I love [Obsidian](https://obsidian.md/) and its tools, but managing screenshots ## Installation -Once you have disabled Safe Mode, you can find third-party plugins by navigating to Settings > Community Plugins > Browse and search for "Chessify". Once you have installed the plugin, you can access it under Settings > Community Plugins. Please note that you must enable the plugin to use it. You can also unsintall the plugin from there. +Once you have disabled Safe Mode, you can find third-party plugins by navigating to Settings > Community Plugins > Browse and search for "Chess Study". Once you have installed the plugin, you can access it under Settings > Community Plugins. Please note that you must enable the plugin to use it. You can also unsintall the plugin from there. ## Usage -To start, position your cursor where you want to place the PGN viewer/editor within your note. Execute the Obsidian command `Chessify: Insert PGN-Editor at cursor position`. +To start, position your cursor where you want to place the PGN viewer/editor within your note. Execute the Obsidian command `Chess Study: Insert PGN-Editor at cursor position`. This action will trigger a modal window, where you have the option to paste your PGN or leave it empty for a fresh new game. Here is what it will look like: -![chessify-modal](imgs/chessify-modal.png) +![chess-study-modal](imgs/chess-study-modal.png) -Once you click `Submit`, Chessify will parse the PGN, generate a new JSON file in your vault located at `.obsidian/plugins/obsidian-chessify/storage/{id}.json`, and insert a chessify codeblock at the cursor's position. Here's an example of the chessify codeblock: +Once you click `Submit`, Obsidian will parse the PGN, generate a new JSON file in your vault located at `.obsidian/plugins/obsidian-chess-study/storage/{id}.json`, and insert a chessStudy codeblock at the cursor's position. Here's an example of the chessStudy codeblock: -![chessify-codeblock](imgs/chessify-codeblock.png) +![chess-study-codeblock](imgs/chess-study-codeblock.png) After that the PGN viewer/editor will render and you are good to go: -![chessify-codeblock](imgs/chessify-demo.gif) +![cchess-study-codeblock](imgs/chess-study-demo.gif) ## Features @@ -56,15 +56,15 @@ After that the PGN viewer/editor will render and you are good to go: ## Settings -Here are the available settings for a `chessify` code block: +Here are the available settings for a `chessStudy` code block: | Setting | Possible Values | Description | | ------------------ | ------------------ | ------------------------------------------------ | -| `chessifyId` | Valid nanoid | Valid ID for a file stored in the plugin storage | +| `chessStudyId` | Valid nanoid | Valid ID for a file stored in the plugin storage | | `boardOrientation` | `white` \| `black` | Orientation of the board | | `boardColor` | `green` \| `brown` | Color of the board | -You can permanently set some settings in the [Obsidian](https://obsidian.md/) plugin settings for Chessify. +You can permanently set some settings in the [Obsidian](https://obsidian.md/) plugin settings for Obsidian Chess Study. ## Roadmap @@ -91,4 +91,4 @@ If you want to have a look at FENs instead, check out these alternative Obsidian ## License -[Chessify](https://github.com/chrislicodes/obsidian-chessify) is licensed under the MIT license. Refer to [LICENSE](https://github.com/chrislicodes/obsidian-chessify/blob/trunk/LICENSE.TXT) for more informations. +[Obsidian Chess Study](https://github.com/chrislicodes/obsidian-chess-study) is licensed under the GPL-3.0 license. Refer to [LICENSE](https://github.com/chrislicodes/obsidian-chess-study/blob/trunk/LICENSE.TXT) for more informations. diff --git a/imgs/chess-study-codeblock.png b/imgs/chess-study-codeblock.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2cb9553bbeb42d0b00cb88636acf15f8ad702a GIT binary patch literal 43888 zcmeEtcQ_nv+rC5y5fLIpZz&QjI;%&EPV`kadbi4It0hE9bb{!j_r7{dLA2SmCA2D;ykr zFb>W&0RnvB456XgC=SkT2^(o?bp>f@Ms*jcrH#D>4$jN>@wzwlG`lI%4Pv7utv@Rf zwh#^zGCq1oAqgk7fA>(5l^Z|c1D%nU(~jvin#N~Y6W1zPJ_N~DpgRKIRB=*l_oR>y zxgim6 z%515u{P2xM!G*V%$34d3aQoeK7&OjPbXaedIc#>}QD72u=6X?1p) z6nSZM;POaXyyUfZH(5xB!rJXacM&U>cjU#AGf$MGJ_PICTO_%j-bZixG4>Im(#PrS z;29r^KB~dD6YskSKfIZ^yLi{cQ7b1vZQ$;^3Z`JT8)=VOUq6v7xw+5m=jYV?)iTV} zCG{&MIFZSc`~Epzq~5CT=GNzjPhtuO{nI+E*ihVKStakxL!aI?Aioux#i$cB!7cGb z{Dlc`BWu`wesh+D?+QzGZ-gSbZWDjpG7F+wj1~&=wK2vH`c!i0Uw8j_oq_#_B0=2R zO}kYW^ZjoPuXlWyc%5H{WJn0OSaXW{saN>y>XAS`Jt!YMWqd{u9v9W|G;8KTkeFlV z0CD_*<=v(g%1*Y~ z+>6Oj+TXVqMekm7S!j_FP!!tcAQTM>|HUvTT;XEU+)$y2xfGN5?q~HW`n}fkSf(f# zf=S8rId|v-x!X)ri}>{nyMgjw?Qlvsg>cc-$z2}aUwL2LT;N{7{~YIJ6`QGduKCeS z^2sQP#xnCom*FoR^$|Lf@4lZwTAglAxWC>sNl7TrFu>hI*p*1@_}EYxHJ1W`4C%pN zBe!Mbx*L~qs`>|5w0E>-L$q@mu-p;{dLto+{nWdslM-7Y+lQ}d_NyP&5{SG*ytb+c zn{Y0nAFR~W!$p2bi(Xt9JJPCc3~uh|UhIAg3h+OnfmaPHuZoNb9f5pf(D#4mE6fkQ z;n(LgV*kE{FC~iE;fvAFtIrePko0>=8DEGqu;fqn@!jYk%+wmqv(z^4B#VNgM+F z1xD(JZ^)mM%4OhG8*}=Ss)}s# zjlFD94DJt&<=ZZ#8QPIZB{0D>`>i4yX_+OL`YOvy3WRY552VLuz$iaV$mTw8

7>iRWUKc!e#)F@`YDtw`3iZTS#f4UdB!vuG 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/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 o|Eg=6G@RwXr2PL=R - diff --git a/src/components/obsidian/SettingsTab.ts b/src/components/obsidian/SettingsTab.ts index 5406478..38b5081 100644 --- a/src/components/obsidian/SettingsTab.ts +++ b/src/components/obsidian/SettingsTab.ts @@ -1,20 +1,20 @@ import { App, PluginSettingTab, Setting } from 'obsidian'; -import ChessifyPlugin from 'src/main'; +import ChessStudyPlugin from 'src/main'; -export interface ChessifyPluginSettings { +export interface ChessStudyPluginSettings { boardOrientation: 'white' | 'black'; boardColor: 'green' | 'brown'; } -export const DEFAULT_SETTINGS: ChessifyPluginSettings = { +export const DEFAULT_SETTINGS: ChessStudyPluginSettings = { boardOrientation: 'white', boardColor: 'green', }; export class SettingsTab extends PluginSettingTab { - plugin: ChessifyPlugin; + plugin: ChessStudyPlugin; - constructor(app: App, plugin: ChessifyPlugin) { + constructor(app: App, plugin: ChessStudyPlugin) { super(app, plugin); this.plugin = plugin; } @@ -24,7 +24,7 @@ export class SettingsTab extends PluginSettingTab { containerEl.empty(); - containerEl.createEl('h2', { text: 'Obsidian Chessify Settings' }); + containerEl.createEl('h2', { text: 'Obsidian Chess Study Settings' }); new Setting(containerEl) .setName('Board Orientation') diff --git a/src/components/react/Chessify.tsx b/src/components/react/ChessStudy.tsx similarity index 82% rename from src/components/react/Chessify.tsx rename to src/components/react/ChessStudy.tsx index fe2e377..29eeea0 100644 --- a/src/components/react/Chessify.tsx +++ b/src/components/react/ChessStudy.tsx @@ -5,46 +5,46 @@ import { DrawShape } from 'chessground/draw'; import { App, Notice } from 'obsidian'; import * as React from 'react'; import { useCallback, useMemo, useState } from 'react'; -import { ChessifyPluginSettings } from 'src/components/obsidian/SettingsTab'; +import { ChessStudyPluginSettings } from 'src/components/obsidian/SettingsTab'; import { - ChessifyDataAdapter, - ChessifyFileData, + ChessStudyDataAdapter, + ChessStudyFileData, parseUserConfig, } from 'src/utils'; import { ChessGroundSettings, ChessgroundWrapper } from './ChessgroundWrapper'; import { CommentSection } from './CommentSection'; import { PgnViewer } from './PgnViewer'; -export type ChessifyConfig = ChessGroundSettings; +export type ChessStudyConfig = ChessGroundSettings; interface AppProps { source: string; app: App; - pluginSettings: ChessifyPluginSettings; - chessifyData: ChessifyFileData; - dataAdapter: ChessifyDataAdapter; + pluginSettings: ChessStudyPluginSettings; + chessStudyData: ChessStudyFileData; + dataAdapter: ChessStudyDataAdapter; } -export const Chessify = ({ +export const ChessStudy = ({ source, pluginSettings, - chessifyData, + chessStudyData, dataAdapter, }: AppProps) => { // Parse Obsidian / Code Block Settings - const { boardColor, boardOrientation, chessifyId } = parseUserConfig( + const { boardColor, boardOrientation, chessStudyId } = parseUserConfig( pluginSettings, source ); - const [chessifyDataModified] = useState(chessifyData); + const [chessStudyDataModified] = useState(chessStudyData); // Setup Chessboard and Chess.js APIs const [chessView, setChessView] = useState(null); const chessLogic = useMemo(() => { const chess = new Chess(); - chessifyData.moves.forEach((move) => { + chessStudyData.moves.forEach((move) => { chess.move({ from: move.from, to: move.to, @@ -52,17 +52,17 @@ export const Chessify = ({ }); }); return chess; - }, [chessifyData.moves]); + }, [chessStudyData.moves]); // Track Application State const [history, setHistory] = useState([]); const [isViewOnly, setIsViewOnly] = useState(false); const [currentMove, setCurrentMove] = useState(0); const [shapes, setShapes] = useState( - chessifyData.moves.map((data) => data.shapes) + chessStudyData.moves.map((data) => data.shapes) ); const [comments, setComments] = useState<(JSONContent | null)[]>( - chessifyData.moves.map((data) => data.comment) + chessStudyData.moves.map((data) => data.comment) ); //PgnViewer Functions @@ -118,8 +118,8 @@ export const Chessify = ({ ); const onSaveButtonClick = useCallback(async () => { - const chessifyData: ChessifyFileData = { - header: chessifyDataModified.header, + const chessStudyData: ChessStudyFileData = { + header: chessStudyDataModified.header, moves: chessLogic.history({ verbose: true }).map((move, index) => ({ ...move, variants: [], @@ -128,13 +128,13 @@ export const Chessify = ({ })), }; - await dataAdapter.saveFile(chessifyData, chessifyId); + await dataAdapter.saveFile(chessStudyData, chessStudyId); new Notice('Save successfull!'); }, [ chessLogic, - chessifyDataModified.header, - chessifyId, + chessStudyDataModified.header, + chessStudyId, comments, dataAdapter, shapes, @@ -157,7 +157,7 @@ export const Chessify = ({ >; - chessifyId: string; + chessStudyId: string; config?: Config; boardColor?: 'brown' | 'green'; chess: Chess; @@ -27,7 +27,7 @@ export const ChessgroundWrapper = React.memo( ({ api, setApi, - chessifyId, + chessStudyId, boardColor = 'green', config = {}, chess, @@ -78,7 +78,7 @@ export const ChessgroundWrapper = React.memo( ref, chess, api, - chessifyId, + chessStudyId, config, setApi, setHistory, diff --git a/src/main.tsx b/src/main.tsx index 8ce22e1..cd2a2c0 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,13 +3,13 @@ import { Editor, Notice, Plugin } from 'obsidian'; import { ReactView } from './components/ReactView'; import { PgnModal } from './components/obsidian/PgnModal'; import { - ChessifyPluginSettings, + ChessStudyPluginSettings, DEFAULT_SETTINGS, SettingsTab, } from './components/obsidian/SettingsTab'; import { - ChessifyDataAdapter, - ChessifyFileData, + ChessStudyDataAdapter, + ChessStudyFileData, parseUserConfig, } from './utils'; @@ -20,9 +20,9 @@ import 'chessground/assets/chessground.brown.css'; import 'chessground/assets/chessground.cburnett.css'; import './main.css'; -export default class ChessifyPlugin extends Plugin { - settings: ChessifyPluginSettings; - dataAdapter: ChessifyDataAdapter; +export default class ChessStudyPlugin extends Plugin { + settings: ChessStudyPluginSettings; + dataAdapter: ChessStudyDataAdapter; storagePath = `${this.app.vault.configDir}/plugins/${this.manifest.id}/storage/`; async onload() { @@ -30,7 +30,7 @@ export default class ChessifyPlugin extends Plugin { await this.loadSettings(); // Register Data Adapter - this.dataAdapter = new ChessifyDataAdapter( + this.dataAdapter = new ChessStudyDataAdapter( this.app.vault.adapter, this.storagePath ); @@ -40,7 +40,7 @@ export default class ChessifyPlugin extends Plugin { // Add command this.addCommand({ - id: 'insert-chesser', + id: 'insert-chess-study', name: 'Insert PGN-Editor at cursor position', editorCallback: (editor: Editor) => { const cursorPosition = editor.getCursor(); @@ -56,7 +56,7 @@ export default class ChessifyPlugin extends Plugin { }); } - const chessifyFileData: ChessifyFileData = { + const chessStudyFileData: ChessStudyFileData = { header: { title: chess.header()['opening'] || null, }, @@ -68,13 +68,14 @@ export default class ChessifyPlugin extends Plugin { })), }; - const id = await this.dataAdapter.saveFile(chessifyFileData); + const id = await this.dataAdapter.saveFile(chessStudyFileData); editor.replaceRange( - `\`\`\`chessify\nchessifyId: ${id}\n\`\`\``, + `\`\`\`chessStudy\nchessStudyId: ${id}\nboardOrientation: white\nboardColor: green\n\`\`\``, cursorPosition ); } catch (e) { + console.log(e); new Notice('There was an error during PGN parsing.', 0); } }; @@ -83,20 +84,20 @@ export default class ChessifyPlugin extends Plugin { }, }); - // Add chessify code block processor + // Add chess study code block processor this.registerMarkdownCodeBlockProcessor( - 'chessify', + 'chessStudy', async (source, el, ctx) => { - const { chessifyId } = parseUserConfig(this.settings, source); + const { chessStudyId } = parseUserConfig(this.settings, source); - if (!chessifyId.trim().length) + if (!chessStudyId.trim().length) return new Notice( - "No chessifyId parameter found, please add one manually if the file already exists or add it via the 'Insert PGN-Editor at cursor position' command.", + "No chessStudyId parameter found, please add one manually if the file already exists or add it via the 'Insert PGN-Editor at cursor position' command.", 0 ); try { - const data = await this.dataAdapter.loadFile(chessifyId); + const data = await this.dataAdapter.loadFile(chessStudyId); ctx.addChild( new ReactView( @@ -110,18 +111,18 @@ export default class ChessifyPlugin extends Plugin { ); } catch (e) { new Notice( - `There was an error while trying to load ${chessifyId}.json. You can check the plugin folder if the file exist and if not add one via the 'Insert PGN-Editor at cursor position' command.`, + `There was an error while trying to load ${chessStudyId}.json. You can check the plugin folder if the file exist and if not add one via the 'Insert PGN-Editor at cursor position' command.`, 0 ); } } ); - console.log('Chessify successfully loaded'); + console.log('Chess Study Plugin successfully loaded'); } async onunload() { - console.log('Chessify successfully unloaded'); + console.log('Chess Study Plugin successfully unloaded'); } async loadSettings() { diff --git a/src/utils/index.ts b/src/utils/index.ts index 4d38fd7..b047d93 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -5,25 +5,25 @@ import { Config } from 'chessground/config'; import { DrawShape } from 'chessground/draw'; import { nanoid } from 'nanoid'; import { DataAdapter, parseYaml } from 'obsidian'; -import { ChessifyPluginSettings } from 'src/components/obsidian/SettingsTab'; +import { ChessStudyPluginSettings } from 'src/components/obsidian/SettingsTab'; //Chess Logic -type ChessifyAppConfig = ChessifyPluginSettings & { - chessifyId: string; +type ChessStudyAppConfig = ChessStudyPluginSettings & { + chessStudyId: string; }; export const parseUserConfig = ( - settings: ChessifyPluginSettings, + settings: ChessStudyPluginSettings, content: string -): ChessifyAppConfig => { - const chessifyConfig: ChessifyAppConfig = { +): ChessStudyAppConfig => { + const chessStudyConfig: ChessStudyAppConfig = { ...settings, - chessifyId: '', + chessStudyId: '', }; try { return { - ...chessifyConfig, + ...chessStudyConfig, ...parseYaml(content), }; } catch (e) { @@ -77,17 +77,17 @@ export function playOtherSide(cg: Api, chess: Chess) { //Storage Logic -interface ChessifyMove extends Move { +interface ChessStudyMove extends Move { variants: Move[][]; shapes: DrawShape[]; comment: JSONContent | null; } -export interface ChessifyFileData { +export interface ChessStudyFileData { header: { title: string | null }; - moves: ChessifyMove[]; + moves: ChessStudyMove[]; } -export class ChessifyDataAdapter { +export class ChessStudyDataAdapter { adapter: DataAdapter; storagePath: string; @@ -96,18 +96,18 @@ export class ChessifyDataAdapter { this.storagePath = storagePath; } - async saveFile(data: ChessifyFileData, id?: string) { - const chessifyId = id || nanoid(); + async saveFile(data: ChessStudyFileData, id?: string) { + const chessStudyId = id || nanoid(); await this.adapter.write( - `${this.storagePath}/${chessifyId}.json`, + `${this.storagePath}/${chessStudyId}.json`, JSON.stringify(data, null, 2), {} ); - return chessifyId; + return chessStudyId; } - async loadFile(id: string): Promise { + async loadFile(id: string): Promise { const data = await this.adapter.read(`${this.storagePath}/${id}.json`); return JSON.parse(data); }