@notehub.md/cli 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/templates/PLUGIN_GUIDE.md +21 -22
- package/templates/PLUGIN_GUIDE_RU.md +22 -21
- package/templates/docs/en/04-widgets.md +26 -30
- package/templates/docs/ru/04-widgets.md +26 -30
package/package.json
CHANGED
|
@@ -276,19 +276,18 @@ const theme = await ctx.invokeApi<string>('theme:get-current');
|
|
|
276
276
|
const themes = await ctx.invokeApi<string[]>('theme:list');
|
|
277
277
|
```
|
|
278
278
|
|
|
279
|
-
## Editor
|
|
279
|
+
## Editor Portal API
|
|
280
280
|
|
|
281
281
|
```typescript
|
|
282
|
-
// Register widget
|
|
283
|
-
await ctx.invokeApi(
|
|
284
|
-
'
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
);
|
|
282
|
+
// Register portal (inline widget)
|
|
283
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
284
|
+
id: 'my-plugin:progress-bar',
|
|
285
|
+
regex: /\[progress:(\d+)\]/g,
|
|
286
|
+
component: ProgressBarComponent
|
|
287
|
+
});
|
|
289
288
|
|
|
290
|
-
// Unregister (optional - auto-cleaned)
|
|
291
|
-
await ctx.invokeApi('editor:unregister-
|
|
289
|
+
// Unregister (optional - auto-cleaned on plugin unload)
|
|
290
|
+
await ctx.invokeApi('editor:unregister-portal', 'my-plugin:progress-bar');
|
|
292
291
|
```
|
|
293
292
|
|
|
294
293
|
## Settings API
|
|
@@ -407,14 +406,15 @@ const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
407
406
|
);
|
|
408
407
|
};
|
|
409
408
|
|
|
409
|
+
// Plugin
|
|
410
410
|
export default class ProgressBarPlugin extends NotehubPlugin {
|
|
411
411
|
async onload(ctx: PluginContext): Promise<void> {
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
'progress-bar',
|
|
415
|
-
/\[progress:(\d+)\]/g,
|
|
416
|
-
ProgressBar
|
|
417
|
-
);
|
|
412
|
+
// Match: [progress:XX] where XX is a number
|
|
413
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
414
|
+
id: 'progress-bar',
|
|
415
|
+
regex: /\[progress:(\d+)\]/g,
|
|
416
|
+
component: ProgressBar
|
|
417
|
+
});
|
|
418
418
|
}
|
|
419
419
|
|
|
420
420
|
async onunload(): Promise<void> {}
|
|
@@ -523,12 +523,11 @@ const WordCounter: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
523
523
|
};
|
|
524
524
|
|
|
525
525
|
// Register with pattern: {{count: your text here}}
|
|
526
|
-
await ctx.invokeApi(
|
|
527
|
-
'
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
);
|
|
526
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
527
|
+
id: 'word-counter',
|
|
528
|
+
regex: /\{\{count:\s*(.+?)\}\}/g,
|
|
529
|
+
component: WordCounter
|
|
530
|
+
});
|
|
532
531
|
```
|
|
533
532
|
|
|
534
533
|
## Full-Featured Plugin
|
|
@@ -276,19 +276,18 @@ const theme = await ctx.invokeApi<string>('theme:get-current');
|
|
|
276
276
|
const themes = await ctx.invokeApi<string[]>('theme:list');
|
|
277
277
|
```
|
|
278
278
|
|
|
279
|
-
## Editor
|
|
279
|
+
## Editor Portal API
|
|
280
280
|
|
|
281
281
|
```typescript
|
|
282
|
-
// Регистрация
|
|
283
|
-
await ctx.invokeApi(
|
|
284
|
-
'
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
);
|
|
282
|
+
// Регистрация портала (инлайн-виджета)
|
|
283
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
284
|
+
id: 'my-plugin:progress-bar',
|
|
285
|
+
regex: /\[progress:(\d+)\]/g,
|
|
286
|
+
component: ProgressBarComponent
|
|
287
|
+
});
|
|
289
288
|
|
|
290
289
|
// Отмена регистрации (опционально - очищается автоматически)
|
|
291
|
-
await ctx.invokeApi('editor:unregister-
|
|
290
|
+
await ctx.invokeApi('editor:unregister-portal', 'my-plugin:progress-bar');
|
|
292
291
|
```
|
|
293
292
|
|
|
294
293
|
## Settings API
|
|
@@ -407,14 +406,17 @@ const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
407
406
|
);
|
|
408
407
|
};
|
|
409
408
|
|
|
409
|
+
// Плагин
|
|
410
410
|
export default class ProgressBarPlugin extends NotehubPlugin {
|
|
411
411
|
async onload(ctx: PluginContext): Promise<void> {
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
'progress-bar',
|
|
415
|
-
/\[progress:(\d+)\]/g,
|
|
416
|
-
ProgressBar
|
|
417
|
-
);
|
|
412
|
+
// Совпадение: [progress:XX] где XX — число
|
|
413
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
414
|
+
id: 'progress-bar',
|
|
415
|
+
regex: /\[progress:(\d+)\]/g,
|
|
416
|
+
component: ProgressBar
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
await ctx.invokeApi('logger:info', 'ProgressBar', 'Портал зарегистрирован');
|
|
418
420
|
}
|
|
419
421
|
|
|
420
422
|
async onunload(): Promise<void> {}
|
|
@@ -523,12 +525,11 @@ const WordCounter: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
523
525
|
};
|
|
524
526
|
|
|
525
527
|
// Регистрация с паттерном: {{count: ваш текст здесь}}
|
|
526
|
-
await ctx.invokeApi(
|
|
527
|
-
'
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
);
|
|
528
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
529
|
+
id: 'word-counter',
|
|
530
|
+
regex: /\{\{count:\s*(.+?)\}\}/g,
|
|
531
|
+
component: WordCounter
|
|
532
|
+
});
|
|
532
533
|
```
|
|
533
534
|
|
|
534
535
|
## Полноценный плагин
|
|
@@ -14,17 +14,16 @@ View Mode: [████████░░] 80% ← Your rendered compon
|
|
|
14
14
|
Edit Mode: [progress:80] ← Source text visible when cursor inside
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
## Registering a
|
|
17
|
+
## Registering a Portal
|
|
18
18
|
|
|
19
|
-
Use the `editor:register-
|
|
19
|
+
Use the `editor:register-portal` API:
|
|
20
20
|
|
|
21
21
|
```typescript
|
|
22
|
-
await ctx.invokeApi(
|
|
23
|
-
'
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
);
|
|
22
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
23
|
+
id: 'unique-id', // Unique identifier
|
|
24
|
+
regex: /regex-pattern/g, // Pattern to match (MUST have global flag 'g')
|
|
25
|
+
component: ReactComponent // Component to render
|
|
26
|
+
});
|
|
28
27
|
```
|
|
29
28
|
|
|
30
29
|
## Component Props
|
|
@@ -87,18 +86,17 @@ const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
87
86
|
export default class ProgressBarPlugin extends NotehubPlugin {
|
|
88
87
|
async onload(ctx: PluginContext): Promise<void> {
|
|
89
88
|
// Match: [progress:XX] where XX is a number
|
|
90
|
-
await ctx.invokeApi(
|
|
91
|
-
'
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
);
|
|
89
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
90
|
+
id: 'progress-bar',
|
|
91
|
+
regex: /\[progress:(\d+)\]/g,
|
|
92
|
+
component: ProgressBar
|
|
93
|
+
});
|
|
96
94
|
|
|
97
|
-
await ctx.invokeApi('logger:info', 'ProgressBar', '
|
|
95
|
+
await ctx.invokeApi('logger:info', 'ProgressBar', 'Portal registered');
|
|
98
96
|
}
|
|
99
97
|
|
|
100
98
|
async onunload(): Promise<void> {
|
|
101
|
-
//
|
|
99
|
+
// Portal is automatically unregistered!
|
|
102
100
|
}
|
|
103
101
|
}
|
|
104
102
|
```
|
|
@@ -142,12 +140,11 @@ const ButtonWidget: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
142
140
|
};
|
|
143
141
|
|
|
144
142
|
// Register
|
|
145
|
-
await ctx.invokeApi(
|
|
146
|
-
'
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
);
|
|
143
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
144
|
+
id: 'btn-widget',
|
|
145
|
+
regex: /\[btn:([^\]:]+):([^\]]+)\]/g,
|
|
146
|
+
component: ButtonWidget
|
|
147
|
+
});
|
|
151
148
|
```
|
|
152
149
|
|
|
153
150
|
**Usage:**
|
|
@@ -185,12 +182,11 @@ const StatusBadge: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
185
182
|
);
|
|
186
183
|
};
|
|
187
184
|
|
|
188
|
-
await ctx.invokeApi(
|
|
189
|
-
'
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
);
|
|
185
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
186
|
+
id: 'status-badge',
|
|
187
|
+
regex: /\[status:([^\]]+)\]/g,
|
|
188
|
+
component: StatusBadge
|
|
189
|
+
});
|
|
194
190
|
```
|
|
195
191
|
|
|
196
192
|
**Usage:**
|
|
@@ -305,12 +301,12 @@ onClick={(e) => {
|
|
|
305
301
|
|
|
306
302
|
## Unregistering Widgets
|
|
307
303
|
|
|
308
|
-
|
|
304
|
+
Portals are **automatically unregistered** when your plugin unloads.
|
|
309
305
|
|
|
310
306
|
For manual unregistration:
|
|
311
307
|
|
|
312
308
|
```typescript
|
|
313
|
-
await ctx.invokeApi('editor:unregister-
|
|
309
|
+
await ctx.invokeApi('editor:unregister-portal', 'my-portal-id');
|
|
314
310
|
```
|
|
315
311
|
|
|
316
312
|
---
|
|
@@ -14,17 +14,16 @@
|
|
|
14
14
|
Режим редактирования: [progress:80] ← Исходный текст виден когда курсор внутри
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
## Регистрация
|
|
17
|
+
## Регистрация портала
|
|
18
18
|
|
|
19
|
-
Используйте API `editor:register-
|
|
19
|
+
Используйте API `editor:register-portal`:
|
|
20
20
|
|
|
21
21
|
```typescript
|
|
22
|
-
await ctx.invokeApi(
|
|
23
|
-
'
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
);
|
|
22
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
23
|
+
id: 'unique-id', // Уникальный идентификатор
|
|
24
|
+
regex: /regex-pattern/g, // Паттерн для поиска (ДОЛЖЕН иметь флаг 'g')
|
|
25
|
+
component: ReactComponent // Компонент для рендеринга
|
|
26
|
+
});
|
|
28
27
|
```
|
|
29
28
|
|
|
30
29
|
## Пропсы компонента
|
|
@@ -87,18 +86,17 @@ const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
87
86
|
export default class ProgressBarPlugin extends NotehubPlugin {
|
|
88
87
|
async onload(ctx: PluginContext): Promise<void> {
|
|
89
88
|
// Совпадение: [progress:XX] где XX — число
|
|
90
|
-
await ctx.invokeApi(
|
|
91
|
-
'
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
);
|
|
89
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
90
|
+
id: 'progress-bar',
|
|
91
|
+
regex: /\[progress:(\d+)\]/g,
|
|
92
|
+
component: ProgressBar
|
|
93
|
+
});
|
|
96
94
|
|
|
97
|
-
await ctx.invokeApi('logger:info', 'ProgressBar', '
|
|
95
|
+
await ctx.invokeApi('logger:info', 'ProgressBar', 'Портал зарегистрирован');
|
|
98
96
|
}
|
|
99
97
|
|
|
100
98
|
async onunload(): Promise<void> {
|
|
101
|
-
//
|
|
99
|
+
// Портал автоматически отменяет регистрацию!
|
|
102
100
|
}
|
|
103
101
|
}
|
|
104
102
|
```
|
|
@@ -140,12 +138,11 @@ const ButtonWidget: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
140
138
|
};
|
|
141
139
|
|
|
142
140
|
// Регистрация
|
|
143
|
-
await ctx.invokeApi(
|
|
144
|
-
'
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
);
|
|
141
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
142
|
+
id: 'btn-widget',
|
|
143
|
+
regex: /\[btn:([^\]:]+):([^\]]+)\]/g,
|
|
144
|
+
component: ButtonWidget
|
|
145
|
+
});
|
|
149
146
|
```
|
|
150
147
|
|
|
151
148
|
**Использование:**
|
|
@@ -183,12 +180,11 @@ const StatusBadge: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
|
|
|
183
180
|
);
|
|
184
181
|
};
|
|
185
182
|
|
|
186
|
-
await ctx.invokeApi(
|
|
187
|
-
'
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
);
|
|
183
|
+
await ctx.invokeApi('editor:register-portal', {
|
|
184
|
+
id: 'status-badge',
|
|
185
|
+
regex: /\[status:([^\]]+)\]/g,
|
|
186
|
+
component: StatusBadge
|
|
187
|
+
});
|
|
192
188
|
```
|
|
193
189
|
|
|
194
190
|
**Использование:**
|
|
@@ -276,12 +272,12 @@ style={{
|
|
|
276
272
|
|
|
277
273
|
## Отмена регистрации виджетов
|
|
278
274
|
|
|
279
|
-
|
|
275
|
+
Порталы **автоматически отменяют регистрацию** при выгрузке вашего плагина.
|
|
280
276
|
|
|
281
277
|
Для ручной отмены:
|
|
282
278
|
|
|
283
279
|
```typescript
|
|
284
|
-
await ctx.invokeApi('editor:unregister-
|
|
280
|
+
await ctx.invokeApi('editor:unregister-portal', 'my-portal-id');
|
|
285
281
|
```
|
|
286
282
|
|
|
287
283
|
---
|