(function($) {
'use strict';
var _rootWin = window;
var regBackgroundRepeat = new RegExp('background-repeat: no-repeat no-repeat;', 'ig')
window.mrdocClipper = {
init: function() {
var self = this;
$(document).keydown(function(e) {
// console.log(e)
if (e.ctrlKey && e.shiftKey && e.keyCode == 88 /*x*/ ) {
var port = chrome.extension.connect({
name: 'createpopup'
});
port.postMessage();
self.createPopup(); //创建popup弹出窗口
}
});
self.addWindowEventListener();
},
//html转Markdown
html2md : function(html){
// 实例化一个turndown
var turndownService = new TurndownService({
headingStyle:'atx', // 标题风格
hr:'---', // 水平分割线
bulletListMarker:'-', // 列表项
codeBlockStyle:'fenced', //代码块样式
})
var md = turndownService.turndown(html)
return md
},
//图片URL转base64
img2base : function(url){
//发送请求到background
chrome.runtime.sendMessage({
name: 'image2base64',
data: url
});
},
// 获取选择的内容
getSelectedContent: function() {
var self = this,
commonAncestorContainer = self.getSelectionContainer(),
content = '',
title = '';
if (commonAncestorContainer === null || $(commonAncestorContainer).text() === '') {
content = false;
} else if (commonAncestorContainer.nodeType === 3) {
content = $(commonAncestorContainer).text();
title = document.title; //content
} else if (commonAncestorContainer.nodeType === 1) {
var selectedHTML = self.getSelectedHTML();
var tempNode = $('
', {
html: selectedHTML
}).insertAfter($(commonAncestorContainer));
self.getHTMLByNode(tempNode);
var html = tempNode.html();
// console.log(md)
title = document.title; //tempNode.text();
tempNode.remove();
content = html;
}
if (content) {
var port = chrome.extension.connect({
name: 'getselectedcontent'
});
port.postMessage({
title: title,
sourceurl: location.href,
content: content
});
}
},
// 获取选择容器
getSelectionContainer: function() {
var container = null;
if (window.getSelection) {
var selectionRange = window.getSelection();
if (selectionRange.rangeCount > 0) {
var range = selectionRange.getRangeAt(0);
container = range.commonAncestorContainer;
}
} else {
if (document.selection) {
var textRange = document.selection.createRange();
container = textRange.parentElement();
}
}
return container;
},
// 获取选择的HTML
getSelectedHTML: function() {
var userSelection;
if (window.getSelection) {
//W3C Ranges
userSelection = window.getSelection();
//Get the range:
if (userSelection.getRangeAt) {
var range = userSelection.getRangeAt(0);
} else {
var range = document.createRange();
range.setStart(userSelection.anchorNode, userSelection.anchorOffset);
range.setEnd(userSelection.focusNode, userSelection.focusOffset);
}
//And the HTML:
var clonedSelection = range.cloneContents();
var div = document.createElement('div');
div.appendChild(clonedSelection);
return div.innerHTML;
} else if (document.selection) {
//Explorer selection, return the HTML
userSelection = document.selection.createRange();
return userSelection.htmlText;
} else {
return '';
}
},
// 获取页面内容
getPageContent: function() {
var self = this,
port = chrome.extension.connect({
name: 'getpagecontent'
});
var h1 = $('h1').eq(0);
port.postMessage({
title: document.title,
sourceurl: location.href,
content: self.getHTMLByNode($(document.body))
});
},
//创建剪藏
createMrClipWrap: function(zIndex, height) {
if ($(document.body).is('frameset')) {
return null;
}
var self = this;
if (!self.closePopup) {
self.closePopup = function() {
$(document).unbind('keydown.mrdocclipperpopup');
self.removeInspector();
self.isCreatedPopup = false;
self.popupInstance.fadeOut(function(e) {
$(this).remove();
});
}
}
var el = $('
').css('z-index', zIndex).hide().appendTo(document.body).fadeIn();
var iframe = $('
').appendTo(el),
iframeWin = iframe[0].contentWindow,
iframeDoc = iframe[0].contentDocument || iframeWin.document;
return {
wrap: el,
iframe: iframe
}
},
//创建打开加载页面
createLoadingEl: function(zIndex) {
var obj = this.createMrClipWrap(zIndex, 150);
if (obj == null) return null;
obj.iframe[0].src = chrome.extension.getURL('loading.html');
return obj.wrap;
},
//创建打开popup页面
createClipEl: function(zIndex) {
var self = this;
var obj = this.createMrClipWrap(zIndex, 450);
if (obj == null) return null;
obj.iframe[0].src = chrome.extension.getURL('popup.html');
self.initDivHeight = parseInt(obj.wrap.css('height'));
var judgeHeight = function(h) {
if (h < 304) return 304;
if (h > 644) return 644;
return h;
}
self.changeHeight = function(changeStep) {
obj.wrap.css('height', judgeHeight(self.initDivHeight + changeStep));
}
$(document).bind('keydown.mrdocclipperpopup', function(e) {
if (e.keyCode == 27) {
self.closePopup();
}
});
return obj.wrap;
},
//创建popup
createPopup: function() {
var self = this;
if (self.isCreatedPopup) return;
self.popupZIndex = 20120726;
self.isCreatedPopup = true;
var errorMessage = "page isn't be support",
loadingEl, ClipEl;
function showPage() {
if (self.isLoadComplated == true) {
if (ClipEl) return true;
if (loadingEl) loadingEl.remove();
self.popupInstance = ClipEl = self.createClipEl(self.popupZIndex);
if (ClipEl == null) throw Error(errorMessage);
return true;
} else {
if (loadingEl) return false;
self.popupInstance = loadingEl = self.createLoadingEl(self.popupZIndex);
if (loadingEl == null) throw Error(errorMessage);
return false;
}
}
try {
showPage();
var handler = setInterval(function() {
if (showPage()) {
clearInterval(handler);
}
}, 500);
} catch (e) {
self.isCreatedPopup = false;
if (e.message == errorMessage) {
self.tipsReadyError();
}
}
},
//parent.postMessage窗口事件监听
addWindowEventListener: function() {
var self = this;
window.addEventListener('message', function(e) {
switch (e.data.name) {
case 'createinspectorfrommrdocpopup':
self.createInspector(e.data.autoExtractContent);
break;
case 'changeheightfrommrdocpopup':
self.changeHeight(e.data.param);
break;
case 'stopchangeheightfrommrdocpopup':
self.initDivHeight = parseInt(self.popupInstance.css('height'));
break;
case 'closefrommrdocpopup':
self.closePopup();
break;
case 'resetfrommrdocpopup':
self.clearMarks();
break;
case 'savenotefrommrdocpopup':
self.saveNote(e.data.notedata);
break;
case 'showinspectorfrommrdocpopup':
self.showInspector();
break;
case 'hideinspectorfrommrdocpopup':
self.hideInspector();
break;
case 'hidemaskfrommrdocpopup':
self.mask && self.mask.hide();
break;
case 'pageCompleted':
self.isLoadComplated = true;
break;
default:
break;
}
}, true);
},
//创建注入器
createInspector: function(autoExtractContent) {
var self = this,
body = $(document.body);
self.cover = $('
').css({
position: 'absolute',
top: 0,
left: 0,
opacity: 0,
'z-index': self.popupZIndex - 1
});
self.mask = $('
').css({
'border-radius': 5,
border: '3px dashed black',
position: 'absolute',
top: -9999,
left: -9999,
width: 0,
height: 0,
'z-index': self.popupZIndex - 1,
background: 'transparent'
});
// var backgroundImageSrc = chrome.extension.getURL('css/images/sprite.png'),
//'chrome-extension://__MSG_@@extension_id__/sprites.png'
//遮罩半透明
var markInner = $('
').css({
background: '#ccffcc',
height: '100%',
position: 'absolute',
left: 0,
top: 0,
opacity: 0.35,
width: '100%'
})
// //扩大选区按钮
// markExpandor = $('
').css({
// background: 'url(' + backgroundImageSrc + ') -120px -66px no-repeat',
// height: 20,
// width: 20,
// cursor: 'pointer',
// position: 'absolute',
// top: 1,
// left: 1,
// 'z-index': self.popupZIndex - 1
// }).attr('title', chrome.i18n.getMessage('MarkExpandorTip')),
// //关闭按钮
// markClose = $('
').css({
'border-radius': 3,
border: '3px dashed black',
position: 'absolute',
top: -9999,
left: -9999,
'z-index': self.popupZIndex - 1,
background: 'transparent'
}).append(markInner)
//有些网页会把div强制为position:relative 导致选择区显示出错
//手动将position强制为默认值
//测试 http://www.smashingmagazine.com/2013/02/28/desktop-wallpaper-calendar-march-2013/
self.markContainer = $('