editor-video.js 1.57 KB
'use strict'

import $ from 'jquery'
import Vue from 'vue'
import _ from 'lodash'

const videoRules = {
  'youtube': new RegExp(/(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|&v(?:i)?=))([^#&?]*).*/, 'i'),
  'vimeo': new RegExp(/vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^/]*)\/videos\/|album\/(?:\d+)\/video\/|)(\d+)(?:$|\/|\?)/, 'i'),
  'dailymotion': new RegExp(/(?:dailymotion\.com(?:\/embed)?(?:\/video|\/hub)|dai\.ly)\/([0-9a-z]+)(?:[-_0-9a-zA-Z]+(?:#video=)?([a-z0-9]+)?)?/, 'i')
}

module.exports = (mde, mdeModalOpenState) => {
  // Vue Video instance

  let vueVideo = new Vue({
    el: '#modal-editor-video',
    data: {
      link: ''
    },
    methods: {
      open: (ev) => {
        $('#modal-editor-video').addClass('is-active')
        $('#modal-editor-video input').focus()
      },
      cancel: (ev) => {
        mdeModalOpenState = false // eslint-disable-line no-undef
        $('#modal-editor-video').removeClass('is-active')
        vueVideo.link = ''
      },
      insertVideo: (ev) => {
        if (mde.codemirror.doc.somethingSelected()) {
          mde.codemirror.execCommand('singleSelection')
        }

        // Guess video type

        let videoType = _.findKey(videoRules, (vr) => {
          return vr.test(vueVideo.link)
        })
        if (_.isNil(videoType)) {
          videoType = 'video'
        }

        // Insert video tag

        let videoText = '[video](' + vueVideo.link + '){.' + videoType + '}\n'

        mde.codemirror.doc.replaceSelection(videoText)
        vueVideo.cancel()
      }
    }
  })
  return vueVideo
}