/** * Paste plugin. * * Listens on paste event and pastes content from: * - Instagram * - Twitter * - VK * - Facebook * - Image * - External Link * */ /** * @protected * * Main tool settings. */ var pasteTool = { }; /** * Make elements to insert or switch * * @uses Core codex.draw module */ pasteTool.ui = { /** * Upload image by URL * * @uses codex Image tool * @param filename * @returns {Element} */ uploadedImage : function(filename) { var data = { background: false, border: false, isStretch: false, file: { url: "upload/redactor_images/" + filename, bigUrl: "upload/redactor_images/" + filename, width: null, height: null, additionalData: "null" }, caption: '', cover: null }; /** Using Image plugin make method */ var image = codex.tools.image.make(data); return image; } }; /** * * Callbacks */ pasteTool.callbacks = { /** * Saves data * @param event */ pasted : function(event) { var clipBoardData = event.clipboardData || window.clipboardData, content = clipBoardData.getData('Text'); pasteTool.callbacks.analize(content); }, /** * Analizes pated string and calls necessary method */ analize : function(string) { var regexTemplates = { image : /(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*\.(?:jpe?g|gif|png))(?:\?([^#]*))?(?:#(.*))?/i, instagram : new RegExp("http?.+instagram.com\/p?."), twitter : new RegExp("http?.+twitter.com?.+\/"), facebook : /https?.+facebook.+\/\d+\?/, vk : /https?.+vk?.com\/feed\?w=wall\d+_\d+/, video : { vimeo: { regex: /(?:http[s]?:\/\/)?(?:www.)?vimeo\.co(?:.+\/([^\/]\d+)(?:#t=[\d]+)?s?$)/, html: "" }, youtube: { regex: /^.*(?:(?:youtu\.be\/)|(?:youtube\.com)\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*)(?:[\?\&]t\=(\d*)|)/, html: "", timestamp: '?t=' }, coub: { regex: /https?:\/\/coub\.com\/view\/([^\/\?\&]+)/, html: "" }, vine: { regex: /https?:\/\/vine\.co\/v\/([^\/\?\&]+)/, html: "" }, vk: { regex: /https?:\/\/vk\.com\/.*(?:video)([-_0-9]+)/, html: "" }, imgur: { regex: /https?:\/\/(?:i\.)?imgur\.com.*\/([a-zA-Z0-9]+)(?:\.gifv)?/, html: "
\" data-context=\"false\">
", square: true }, gfycat: { regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, html: "", square: true } } }, image = regexTemplates.image.test(string), instagram = regexTemplates.instagram.exec(string), twitter = regexTemplates.twitter.exec(string), facebook = regexTemplates.facebook.test(string), vk = regexTemplates.vk.test(string); /** * Video testing */ var youtube = regexTemplates.video.youtube.regex.test(string); var vimeo = regexTemplates.video.vimeo.regex.test(string); var coub = regexTemplates.video.coub.regex.test(string); var vine = regexTemplates.video.vine.regex.test(string); if (image) { pasteTool.callbacks.uploadImage(string); } else if (instagram) { pasteTool.callbacks.instagramMedia(instagram); } else if (twitter) { pasteTool.callbacks.twitterMedia(twitter); } else if (facebook) { pasteTool.callbacks.facebookMedia(string); } else if (vk) { pasteTool.callbacks.vkMedia(string); } else if (youtube) { pasteTool.callbacks.youtubeMedia(string); } else if (vimeo) { } else if (vine) { } else if (coub) { } }, /** * Direct upload * @param url */ uploadImage : function(path) { var ajaxUrl = location.protocol + '//' + location.hostname + ':32769', file, image, current = codex.content.currentNode, beforeSend, success_callback; /** When image is uploaded to redactors folder */ success_callback = function(data) { console.log(data); return; var file = JSON.parse(data); image = pasteTool.ui.uploadedImage(file.filename); codex.content.switchBlock(current, image, 'image'); }; /** Before sending XMLHTTP request */ beforeSend = function() { var content = current.querySelector('.ce-block__content'); content.classList.add('ce-plugin-image__loader'); }; /** Preparing data for XMLHTTP */ var data = { url: '/club/fetchImage', type: "POST", data : { url: path }, beforeSend : beforeSend, success : success_callback }; codex.core.ajax(data); }, /** * callback for instagram url's * Using instagram Embed Widgete to render * @uses Instagram tool * @param url */ instagramMedia : function(url) { var fullUrl = url.input, data; data = { instagram_url: fullUrl }; codex.tools.instagram.make(data, true); }, /** * callback for youtube url's * Using iframe to render * @uses video tool * @param url */ youtubeMedia : function(url) { var data = { video_url: url }; codex.tools.video.make(data, true); }, /** * callback for tweets * Using Twittter Widget to render * @uses Twitter tool * @param url */ twitterMedia : function(url) { var fullUrl = url.input, tweetId, arr, data; arr = fullUrl.split('/'); tweetId = arr.pop(); /** Example */ data = { media:true, conversation:false, user:{ profile_image_url:"http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", profile_image_url_https:"https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", screen_name:"Niketas", name:"Никита Лихачёв" }, id: tweetId, text:"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", created_at:"Tue Jun 28 14:09:12 +0000 2016", status_url:"https:\/\/twitter.com\/Niketas\/status\/747793978511101953", caption:"Caption" }; codex.tools.twitter.make(data); } };