如何在 Ace Editor 中使用美化功能?
How do I use beautify in Ace Editor?
我在 Ace 编辑器中找到了美化扩展程序,但我没有看到任何有关如何使用它的示例。这是我目前所拥有的:
var beautiful = ace.require("ace/ext/beautify");
beautiful.beautify();
但我收到错误:
Result of expression 'e' [undefined] is not an object.
看起来像这样:
var beautify = ace.require("ace/ext/beautify"); // get reference to extension
var editor = ace.edit("editor"); // get reference to editor
beautify.beautify(editor.session);
它要求您将 Ace Editor 会话作为第一个参数传入。在我最初的问题中,我没有传入任何变量,这会引发错误。
注意:扩展发行说明中提到的效果不佳。它运行得不够好,无法使用。
我没有让它工作
var beautify = ace.require("ace/ext/beautify"); // get reference to extension
美化总是undefined
。
过了一会儿我放弃了。
并使用了外部美化库(Link)
function beatify() {
var val = editor.session.getValue();
//Remove leading spaces
var array = val.split(/\n/);
array[0] = array[0].trim();
val = array.join("\n");
//Actual beautify (prettify)
val = js_beautify(val);
//Change current text to formatted text
editor.session.setValue(val);
}
在美化文件中只需将美化指向windows(全局对象),然后您就可以从全局对象调用美化。
第 330 行的 ext-beautify.js 添加
window.beautify = exports;
那你就可以用了
vm.session = vm.editor.getSession();
beautify.beautify(vm.session);
有同样的问题。最终 构建了一个简化的美化方法 来满足我的需要(不是让所有东西都在同一行上)。
注意我使用的是 Ace Editor 的 react version,但同样适用于 JS。它不支持注释,因为我生成的代码不包含它们,如果您希望支持它们,您可能需要扩展该方法。
const html = prettifyHtml('<div id="root"><div class="container"><div class="row"><div class="col-lg-6"><a href="#">hello there</a><p>What <strong>is</strong> this? <br /> yes</p></div><div class="col-lg-6"></div></div></div></div>');
const scss = prettifyScss('.container { strong {color:green; background-color:white; border:1px solid green; &:hover {cursor:pointer} } }');
<AceEditor
mode="html" // or "scss"
theme="github"
defaultValue={html} // or scss
onChange={this.onChange.bind(this)}
/>
html:
export const prettifyHtml = (html) => {
let indent = 0,
mode = 'IDLE',
inTag = false,
tag = '',
tagToCome = '',
shouldBreakBefore = false,
shouldBreakAfter = false,
breakBefore = ['p', 'ul', 'li'],
breakAfter = ['div', 'h1', 'h2', 'h3', 'h4', 'p', 'ul', 'li'];
return html
.split('')
.reduce((output, char, index) => {
if (char === '<') {
tagToCome = whichTag(html, index);
shouldBreakBefore = tagToCome && breakBefore.indexOf(tagToCome) >= 0;
mode = 'TAG';
inTag = true;
output += (shouldBreakBefore ? br(indent) : '') + '<';
} else if (char === '/' && mode == 'TAG') {
mode = 'CLOSING_TAG'
inTag = true;
output += '/';
} else if (char === ' ') {
inTag = false;
output += ' ';
} else if (char === '>') {
if (mode === 'TAG' || mode === 'CLOSING_TAG') {
indent += mode === 'TAG' ? +1 : -1;
shouldBreakAfter = breakAfter.indexOf(tag) >= 0;
inTag = false;
tag = '';
}
output += '>';
output += shouldBreakAfter ? br(indent) : '';
} else {
output += char;
if (inTag) {
tag += char;
}
}
return output;
}, '');
}
sass:
export const prettifyScss = (scss) => {
let indent = 0,
closeBefore = 0;
return scss
.split('')
.reduce((output, char) => {
closeBefore++;
if (char === '{') {
indent++;
output += '{' + br(indent);
} else if (char === '}') {
indent--;
output += br(indent) + '}' + (closeBefore > 3 ? '\n' : '') + _tabs(indent);
closeBefore = 0;
} else if (char === '.') {
output += br(indent) + '.';
} else if (char === ';') {
output += ';' + br(indent);
} else {
output += char;
}
return output;
}, '');
}
辅助方法:
const _tabs = (number) => {
let output = '';
for (let cnt = 0; cnt < number; cnt++) {
output += '\t';
}
return output;
}
const br = (indent) => {
return '\n' + _tabs(indent);
}
export const whichTag = (html, index) => {
let inTag = true,
tag = '';
const arr = html.split('');
for (let i = index + 1; i < index + 10; i++) {
const char = arr[i];
if (char >= 'a' && char <= 'z' && inTag) {
tag += char;
} else if (char !== '/') {
inTag = false;
}
}
return tag;
}
Ace 编辑器仅对 php
使用美化,- 它是在 ace 文档中编写的。
对我来说,最好的解决方案是 https://github.com/beautify-web/js-beautify
有很多设置,Js/CSS/HTML
美化,配合npm
,配合python
,配合import
,配合required
等
import beautify from 'js-beautify';
// your code
beautifyHTML() {
this.html = beautify.html(this.html, {
indent_size: '2',
indent_char: ' ',
max_preserve_newlines: '5',
preserve_newlines: true,
keep_array_indentation: false,
break_chained_methods: false,
indent_scripts: 'normal',
brace_style: 'expand',
space_before_conditional: true,
unescape_strings: false,
jslint_happy: false,
end_with_newline: false,
wrap_line_length: '80',
indent_inner_html: true,
comma_first: false,
e4x: false
});
}
查看更多文档和设置here
您可能需要在打开页面时加载window后执行beautify.beautify
,以便初始化editor.session
。
window.addEventListener('load', () => {
beautify.beautify(editor.session)
})
遇到了同样的问题,但通过添加两个脚本文件修复了它。
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ext-beautify.js"></script>
我在 Ace 编辑器中找到了美化扩展程序,但我没有看到任何有关如何使用它的示例。这是我目前所拥有的:
var beautiful = ace.require("ace/ext/beautify");
beautiful.beautify();
但我收到错误:
Result of expression 'e' [undefined] is not an object.
看起来像这样:
var beautify = ace.require("ace/ext/beautify"); // get reference to extension
var editor = ace.edit("editor"); // get reference to editor
beautify.beautify(editor.session);
它要求您将 Ace Editor 会话作为第一个参数传入。在我最初的问题中,我没有传入任何变量,这会引发错误。
注意:扩展发行说明中提到的效果不佳。它运行得不够好,无法使用。
我没有让它工作
var beautify = ace.require("ace/ext/beautify"); // get reference to extension
美化总是undefined
。
过了一会儿我放弃了。
并使用了外部美化库(Link)
function beatify() {
var val = editor.session.getValue();
//Remove leading spaces
var array = val.split(/\n/);
array[0] = array[0].trim();
val = array.join("\n");
//Actual beautify (prettify)
val = js_beautify(val);
//Change current text to formatted text
editor.session.setValue(val);
}
在美化文件中只需将美化指向windows(全局对象),然后您就可以从全局对象调用美化。 第 330 行的 ext-beautify.js 添加
window.beautify = exports;
那你就可以用了
vm.session = vm.editor.getSession();
beautify.beautify(vm.session);
有同样的问题。最终 构建了一个简化的美化方法 来满足我的需要(不是让所有东西都在同一行上)。
注意我使用的是 Ace Editor 的 react version,但同样适用于 JS。它不支持注释,因为我生成的代码不包含它们,如果您希望支持它们,您可能需要扩展该方法。
const html = prettifyHtml('<div id="root"><div class="container"><div class="row"><div class="col-lg-6"><a href="#">hello there</a><p>What <strong>is</strong> this? <br /> yes</p></div><div class="col-lg-6"></div></div></div></div>');
const scss = prettifyScss('.container { strong {color:green; background-color:white; border:1px solid green; &:hover {cursor:pointer} } }');
<AceEditor
mode="html" // or "scss"
theme="github"
defaultValue={html} // or scss
onChange={this.onChange.bind(this)}
/>
html:
export const prettifyHtml = (html) => {
let indent = 0,
mode = 'IDLE',
inTag = false,
tag = '',
tagToCome = '',
shouldBreakBefore = false,
shouldBreakAfter = false,
breakBefore = ['p', 'ul', 'li'],
breakAfter = ['div', 'h1', 'h2', 'h3', 'h4', 'p', 'ul', 'li'];
return html
.split('')
.reduce((output, char, index) => {
if (char === '<') {
tagToCome = whichTag(html, index);
shouldBreakBefore = tagToCome && breakBefore.indexOf(tagToCome) >= 0;
mode = 'TAG';
inTag = true;
output += (shouldBreakBefore ? br(indent) : '') + '<';
} else if (char === '/' && mode == 'TAG') {
mode = 'CLOSING_TAG'
inTag = true;
output += '/';
} else if (char === ' ') {
inTag = false;
output += ' ';
} else if (char === '>') {
if (mode === 'TAG' || mode === 'CLOSING_TAG') {
indent += mode === 'TAG' ? +1 : -1;
shouldBreakAfter = breakAfter.indexOf(tag) >= 0;
inTag = false;
tag = '';
}
output += '>';
output += shouldBreakAfter ? br(indent) : '';
} else {
output += char;
if (inTag) {
tag += char;
}
}
return output;
}, '');
}
sass:
export const prettifyScss = (scss) => {
let indent = 0,
closeBefore = 0;
return scss
.split('')
.reduce((output, char) => {
closeBefore++;
if (char === '{') {
indent++;
output += '{' + br(indent);
} else if (char === '}') {
indent--;
output += br(indent) + '}' + (closeBefore > 3 ? '\n' : '') + _tabs(indent);
closeBefore = 0;
} else if (char === '.') {
output += br(indent) + '.';
} else if (char === ';') {
output += ';' + br(indent);
} else {
output += char;
}
return output;
}, '');
}
辅助方法:
const _tabs = (number) => {
let output = '';
for (let cnt = 0; cnt < number; cnt++) {
output += '\t';
}
return output;
}
const br = (indent) => {
return '\n' + _tabs(indent);
}
export const whichTag = (html, index) => {
let inTag = true,
tag = '';
const arr = html.split('');
for (let i = index + 1; i < index + 10; i++) {
const char = arr[i];
if (char >= 'a' && char <= 'z' && inTag) {
tag += char;
} else if (char !== '/') {
inTag = false;
}
}
return tag;
}
Ace 编辑器仅对 php
使用美化,- 它是在 ace 文档中编写的。
对我来说,最好的解决方案是 https://github.com/beautify-web/js-beautify
有很多设置,Js/CSS/HTML
美化,配合npm
,配合python
,配合import
,配合required
等
import beautify from 'js-beautify';
// your code
beautifyHTML() {
this.html = beautify.html(this.html, {
indent_size: '2',
indent_char: ' ',
max_preserve_newlines: '5',
preserve_newlines: true,
keep_array_indentation: false,
break_chained_methods: false,
indent_scripts: 'normal',
brace_style: 'expand',
space_before_conditional: true,
unescape_strings: false,
jslint_happy: false,
end_with_newline: false,
wrap_line_length: '80',
indent_inner_html: true,
comma_first: false,
e4x: false
});
}
查看更多文档和设置here
您可能需要在打开页面时加载window后执行beautify.beautify
,以便初始化editor.session
。
window.addEventListener('load', () => {
beautify.beautify(editor.session)
})
遇到了同样的问题,但通过添加两个脚本文件修复了它。
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ace.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.6/ext-beautify.js"></script>