88} from "obsidian" ;
99import {
1010 Admonition ,
11- INestedAdmonition ,
12- ObsidianAdmonitionPlugin
11+ ObsidianAdmonitionPlugin ,
12+ ISettingsData
1313} from "../@types/types" ;
1414import {
1515 getAdmonitionElement ,
@@ -48,12 +48,16 @@ Object.fromEntries =
4848 return obj ;
4949 } ;
5050
51- /* const compareVersions = (a: string, b: string) => {
52- return a.localeCompare(b, undefined, { numeric: true }) === 1;
53- }; */
54-
5551import "./main.css" ;
5652import AdmonitionSetting from "./settings" ;
53+ import { findIconDefinition , icon } from "@fortawesome/fontawesome-svg-core" ;
54+
55+ const DEFAULT_APP_SETTINGS : ISettingsData = {
56+ userAdmonitions : { } ,
57+ syntaxHighlight : false ,
58+ copyButton : false ,
59+ version : ""
60+ } ;
5761
5862const ADMONITION_MAP : {
5963 [ admonitionType : string ] : Admonition ;
@@ -104,69 +108,63 @@ const ADMONITION_MAP: {
104108} ;
105109export default class ObsidianAdmonition
106110 extends Plugin
107- implements ObsidianAdmonitionPlugin {
111+ implements ObsidianAdmonitionPlugin
112+ {
108113 admonitions : { [ admonitionType : string ] : Admonition } = { } ;
109- userAdmonitions : { [ admonitionType : string ] : Admonition } = { } ;
110- syntaxHighlight : boolean ;
114+ /* userAdmonitions: { [admonitionType: string]: Admonition } = {};
115+ syntaxHighlight: boolean; */
116+ data : ISettingsData ;
111117 get types ( ) {
112118 return Object . keys ( this . admonitions ) ;
113119 }
114120 async saveSettings ( ) {
115- await this . saveData ( {
116- syntaxHighlight : this . syntaxHighlight || false ,
117- userAdmonitions : this . userAdmonitions || { } ,
118- version : this . manifest . version
119- } ) ;
121+ await this . saveData ( this . data ) ;
120122 }
121- async loadSettings ( ) {
122- let data = Object . assign ( { } , await this . loadData ( ) ) ;
123123
124- if ( ! Object . prototype . hasOwnProperty . call ( data , "syntaxHighlight" ) ) {
125- data = {
126- userAdmonitions : data ,
127- syntaxHighlight : false
128- } ;
129- }
124+ async loadSettings ( ) {
125+ let data = Object . assign (
126+ { } ,
127+ DEFAULT_APP_SETTINGS ,
128+ await this . loadData ( )
129+ ) ;
130130
131- let { userAdmonitions = { } , syntaxHighlight = false } = data || { } ;
132- this . userAdmonitions = userAdmonitions ;
133- this . syntaxHighlight = syntaxHighlight ;
131+ this . data = data ;
134132
135133 this . admonitions = {
136134 ...ADMONITION_MAP ,
137- ...this . userAdmonitions
135+ ...this . data . userAdmonitions
138136 } ;
139137 await this . saveSettings ( ) ;
140138 }
141139 async addAdmonition ( admonition : Admonition ) : Promise < void > {
142- this . userAdmonitions = {
143- ...this . userAdmonitions ,
140+ this . data . userAdmonitions = {
141+ ...this . data . userAdmonitions ,
144142 [ admonition . type ] : admonition
145143 } ;
146144 this . admonitions = {
147145 ...ADMONITION_MAP ,
148- ...this . userAdmonitions
146+ ...this . data . userAdmonitions
149147 } ;
150148 this . registerMarkdownCodeBlockProcessor (
151149 `ad-${ admonition . type } ` ,
152150 this . postprocessor . bind ( this , admonition . type )
153151 ) ;
154- if ( this . syntaxHighlight ) {
152+ if ( this . data . syntaxHighlight ) {
155153 this . turnOnSyntaxHighlighting ( [ admonition . type ] ) ;
156154 }
157155 await this . saveSettings ( ) ;
158156 }
159157
160158 async removeAdmonition ( admonition : Admonition ) {
161- if ( this . userAdmonitions [ admonition . type ] ) {
162- delete this . userAdmonitions [ admonition . type ] ;
159+ if ( this . data . userAdmonitions [ admonition . type ] ) {
160+ delete this . data . userAdmonitions [ admonition . type ] ;
163161 }
164162 this . admonitions = {
165163 ...ADMONITION_MAP ,
166- ...this . userAdmonitions
164+ ...this . data . userAdmonitions
167165 } ;
168166
169- if ( this . syntaxHighlight ) {
167+ if ( this . data . syntaxHighlight ) {
170168 this . turnOffSyntaxHighlighting ( [ admonition . type ] ) ;
171169 }
172170
@@ -185,7 +183,7 @@ export default class ObsidianAdmonition
185183 this . postprocessor . bind ( this , type )
186184 ) ;
187185 } ) ;
188- if ( this . syntaxHighlight ) {
186+ if ( this . data . syntaxHighlight ) {
189187 this . turnOnSyntaxHighlighting ( ) ;
190188 }
191189
@@ -196,9 +194,8 @@ export default class ObsidianAdmonition
196194 let view = this . app . workspace . getActiveViewOfType ( MarkdownView ) ;
197195 if ( ! view || ! ( view instanceof MarkdownView ) ) return ;
198196
199- let admonitions = view . contentEl . querySelectorAll (
200- "details[open]"
201- ) ;
197+ let admonitions =
198+ view . contentEl . querySelectorAll ( "details[open]" ) ;
202199 for ( let i = 0 ; i < admonitions . length ; i ++ ) {
203200 let admonition = admonitions [ i ] ;
204201 admonition . removeAttribute ( "open" ) ;
@@ -223,9 +220,9 @@ export default class ObsidianAdmonition
223220 } ) ;
224221 }
225222 turnOnSyntaxHighlighting ( types : string [ ] = Object . keys ( this . admonitions ) ) {
226- if ( ! this . syntaxHighlight ) return ;
223+ if ( ! this . data . syntaxHighlight ) return ;
227224 types . forEach ( ( type ) => {
228- if ( this . syntaxHighlight ) {
225+ if ( this . data . syntaxHighlight ) {
229226 /** Process from @deathau's syntax highlight plugin */
230227 CodeMirror . defineMode ( `ad-${ type } ` , ( config , options ) => {
231228 return CodeMirror . getMode ( config , "hypermd" ) ;
@@ -334,15 +331,32 @@ export default class ObsidianAdmonition
334331 markdownRenderChild
335332 ) ;
336333
334+ if ( this . data . copyButton ) {
335+ let copy = admonitionContent
336+ . createDiv ( "admonition-content-copy" )
337+ . appendChild (
338+ icon (
339+ findIconDefinition ( {
340+ iconName : "copy" ,
341+ prefix : "far"
342+ } )
343+ ) . node [ 0 ]
344+ ) ;
345+ copy . addEventListener ( "click" , ( ) => {
346+ navigator . clipboard . writeText ( content ) . then ( ( ) => {
347+ new Notice ( "Admonition content copied to clipboard." ) ;
348+ } ) ;
349+ } ) ;
350+ }
351+
337352 const taskLists = admonitionContent . querySelectorAll (
338353 ".contains-task-list"
339354 ) ;
340355 const splitContent = content . split ( "\n" ) ;
341356
342357 for ( let i = 0 ; i < taskLists . length ; i ++ ) {
343- let tasks : NodeListOf < HTMLLIElement > = taskLists [
344- i
345- ] . querySelectorAll ( ".task-list-item" ) ;
358+ let tasks : NodeListOf < HTMLLIElement > =
359+ taskLists [ i ] . querySelectorAll ( ".task-list-item" ) ;
346360 if ( ! tasks . length ) continue ;
347361 for ( let j = 0 ; j < tasks . length ; j ++ ) {
348362 let task = tasks [ j ] ;
0 commit comments