/** * FeHelper 代码美化工具 */ new Vue({ el: '#pageContainer', data: { selectedType: 'Javascript', sourceContent: '', resultContent: '', showCopyBtn: false, examples: { js: `function foo(){var x=10;if(x>5){return x*2;}else{return x/2;}}`, css: `.header{position:fixed;top:0;left:0;width:100%;background:#fff;z-index:100;}.header .logo{float:left;margin:10px;}.header .nav{float:right;}`, html: `

标题

内容区域

`, xml: `张三25北京李四30上海`, sql: `SELECT u.name,o.order_id,p.product_name FROM users u LEFT JOIN orders o ON u.id=o.user_id LEFT JOIN products p ON o.product_id=p.id WHERE u.status='active' AND o.create_time>='2024-01-01' ORDER BY o.create_time DESC;` } }, mounted: function () { // 在tab创建或者更新时候,监听事件,看看是否有参数传递过来 if (location.protocol === 'chrome-extension:') { chrome.tabs.query({currentWindow: true,active: true, }, (tabs) => { let activeTab = tabs.filter(tab => tab.active)[0]; chrome.runtime.sendMessage({ type: 'fh-dynamic-any-thing', thing: 'request-page-content', tabId: activeTab.id }).then(resp => { if(!resp || !resp.content) return ; this.sourceContent = resp.content; this.format(); }); }); } //输入框聚焦 this.$refs.codeSource.focus(); }, methods: { format: function () { if (!this.sourceContent.trim()) { return alert('内容为空,不需要美化处理!'); }else{ this.toast('格式化进行中...'); } let beauty = (result) => { result = result.replace(/>/g, '>').replace(/' + result + ''; this.resultContent = result; // 代码高亮 this.$nextTick(() => { Prism.highlightAll(); this.showCopyBtn = true; this.toast('格式化完成!'); }); }; switch (this.selectedType) { case 'Javascript': let opts = { brace_style: "collapse", break_chained_methods: false, indent_char: " ", indent_scripts: "keep", indent_size: "4", keep_array_indentation: true, preserve_newlines: true, space_after_anon_function: true, space_before_conditional: true, unescape_strings: false, wrap_line_length: "120", "max_preserve_newlines": "5", "jslint_happy": false, "end_with_newline": false, "indent_inner_html": false, "comma_first": false, "e4x": false }; beauty(js_beautify(this.sourceContent, opts)); break; case 'CSS': css_beautify(this.sourceContent, {}, result => beauty(result)); break; case 'HTML': beauty(html_beautify(this.sourceContent,{indent_size:4})); break; case 'SQL': beauty(vkbeautify.sql(this.sourceContent, 4)); break; default: beauty(vkbeautify.xml(this.sourceContent)); } }, copy: function () { let _copyToClipboard = function (text) { let input = document.createElement('textarea'); input.style.position = 'fixed'; input.style.opacity = 0; input.value = text; document.body.appendChild(input); input.select(); document.execCommand('Copy'); document.body.removeChild(input); alert('复制成功,随处粘贴可用!') }; let txt = this.$refs.jfContentBox.textContent; _copyToClipboard(txt); }, /** * 自动消失的Alert弹窗 * @param content */ toast (content) { window.clearTimeout(window.feHelperAlertMsgTid); let elAlertMsg = document.querySelector("#fehelper_alertmsg"); if (!elAlertMsg) { let elWrapper = document.createElement('div'); elWrapper.innerHTML = '
' + '

' + content + '

'; elAlertMsg = elWrapper.childNodes[0]; document.body.appendChild(elAlertMsg); } else { elAlertMsg.querySelector('p').innerHTML = content; elAlertMsg.style.display = 'block'; } window.feHelperAlertMsgTid = window.setTimeout(function () { elAlertMsg.style.display = 'none'; }, 3000); }, loadExample(type,event) { if(event){ event.preventDefault(); } const typeMap = { 'js': 'Javascript', 'css': 'CSS', 'html': 'HTML', 'xml': 'XML', 'sql': 'SQL' }; this.sourceContent = this.examples[type]; this.selectedType = typeMap[type]; this.$nextTick(() => { this.format(); }); }, openOptionsPage: function(event) { event.preventDefault(); event.stopPropagation(); chrome.runtime.openOptionsPage(); }, openDonateModal: function(event ){ event.preventDefault(); event.stopPropagation(); chrome.runtime.sendMessage({ type: 'fh-dynamic-any-thing', thing: 'open-donate-modal', params: { toolName: 'code-beautify' } }); } } });