11import { Plugin } from 'bytemd' ;
22import Audio from './Audio.svelte' ;
33import Video from './Video.svelte' ;
4+ import AudioIcon from './AudioIcon.svelte' ;
5+ import VideoIcon from './VideoIcon.svelte' ;
6+
7+ type ClickHandler = Exclude < Plugin [ 'toolbarItems' ] , undefined > [ 0 ] [ 'onClick' ] ;
48
59export interface PluginOptions {
6- videoAttrs ?: Partial < HTMLVideoElement > ;
7- audioAttrs ?: Partial < HTMLAudioElement > ;
10+ video ?: {
11+ defaultAttrs ?: Partial < HTMLVideoElement > ;
12+ onClickIcon ?: ClickHandler ;
13+ } ;
14+ audio ?: {
15+ defaultAttrs ?: Partial < HTMLAudioElement > ;
16+ onClickIcon ?: ClickHandler ;
17+ } ;
18+ }
19+
20+ function getClickHandler ( type : string ) : ClickHandler {
21+ return cm => {
22+ const pos = cm . getCursor ( 'from' ) ;
23+ cm . replaceRange ( `<${ type } src=""></${ type } >` , pos ) ;
24+ cm . setCursor ( { line : pos . line , ch : pos . ch + 12 } ) ;
25+ cm . focus ( ) ;
26+ } ;
827}
928
1029export default function media ( {
11- videoAttrs = { controls : true } ,
12- audioAttrs = { controls : true } ,
30+ video : {
31+ defaultAttrs : videoAttrs = { controls : true } ,
32+ onClickIcon : onClickVideo = getClickHandler ( 'video' ) ,
33+ } = { } ,
34+ audio : {
35+ defaultAttrs : audioAttrs = { controls : true } ,
36+ onClickIcon : onClickAudio = getClickHandler ( 'audio' ) ,
37+ } = { } ,
1338} : PluginOptions = { } ) : Plugin {
1439 return {
1540 render ( node ) {
@@ -33,5 +58,15 @@ export default function media({
3358 }
3459 }
3560 } ,
61+ toolbarItems : [
62+ {
63+ component : AudioIcon ,
64+ onClick : onClickAudio ,
65+ } ,
66+ {
67+ component : VideoIcon ,
68+ onClick : onClickVideo ,
69+ } ,
70+ ] ,
3671 } ;
3772}
0 commit comments