ΠΡΠΈΠ²Π΅Ρ,
ΠΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π³Π»ΡΠΏΡΠΌ (ΠΈΠ·Π²ΠΈΠ½ΡΡΡΡ Π·Π° ΡΡΠΎ), Π½ΠΎ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠ΅ΠΆΠΈΠΌ / ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° / Π°Π²ΡΠΎΠ·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠΎΠΆΠ΅Ρ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΌΠ½Π΅ ΠΏΠΎΠΌΠΎΡΡ? Π― Π½ΠΎΠ²ΠΈΡΠΎΠΊ Π² brace, ace ΠΈ react, Π½ΠΎ Ρ Π²ΠΈΠ΄Π΅Π» Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ace. Π§Π΅Π³ΠΎ Ρ Π½Π΅ ΠΌΠΎΠ³ ΠΏΠΎΠ½ΡΡΡ, ΡΠ°ΠΊ ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Ρ react-ace.
Π₯ΡΠΈΡΡΠΈΠ°Π½ΠΈΠ½
ΠΡΠΈΠ²Π΅Ρ,
Π° ΠΊΠ°ΠΊΠ°Ρ Ρ Π²Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ? Π― ΠΌΠΎΠ³Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΌΠ½Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ. Π’ΠΎΡΠ½ΠΎ Π½Π΅ ΠΏΠΎΠΌΠ½Ρ, Π½ΠΎ Π΄ΡΠΌΠ°Ρ, ΠΌΠ½Π΅ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΅ΡΠ΅ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ brace
. Π’Π°ΠΊ
npm install -D brace react-ace
Π ΡΡΠΎ ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΎΠΌ Ace:
import React from 'react'
import brace from 'brace'
import AceEditor from 'react-ace'
import 'brace/mode/javascript'
import 'brace/theme/tomorrow'
const MyEditor = () => {
return (
<AceEditor
name="my-editor"
mode="javascript"
theme="tomorrow"
value=""
width="100%"
height="500px" />
)
}
export default MyEditor
Π Π²ΠΎΡ ΡΠΊΡΠΈΠ½ΡΠΎΡ:
Π― Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠ³ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΠΆΠΈΠΌΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΠ· ΡΠΊΠΎΠ±ΠΊΠΈ. Π§ΡΠΎ ΠΌΠ½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΡΠ°ΠΊ ΡΡΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ? Π― ΡΠ°ΠΌ Π½Π°ΠΏΠΈΡΠ°Π» ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΠΈ Ρ ΠΎΡΡ Π²ΠΊΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ ΡΠΌΠΎΠ³ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ react-ace.
@sichvoge Π£ Π²Π°Ρ Π²ΠΎΠΎΠ±ΡΠ΅ Π² ΡΡΠΎΠΌ Π΄Π΅Π»Π°?
ΠΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π» ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Ace, Π° Π½Π΅ ΡΠΊΠΎΠ±ΠΊΡ.
ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ - ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΠ°Π²ΡΡΡΡ? Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @sichvoge
ΠΠΎΠ½Π΅ΡΠ½ΠΎ Ρ Π±ΡΠ΄Ρ.
@sichvoge , Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ?
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ :)
Π― ΠΏΡΡΠ°ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΈΠΌΠΏΠΎΡΡ ΡΠ΅ΠΆΠΈΠΌΠ° Π²ΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎ AceEditor ΠΈΡΠ΅Ρ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ» Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°. Π ΠΈΡΠΎΠ³Π΅ Ρ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ» ΡΠ°ΠΉΠ» ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΡ, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ. (ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±, Π½ΠΎ, ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ....)
Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, ΠΌΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ eikelang.
ΠΠΎΠΉ ΠΊΠΎΠ΄ React Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ
import React from 'react';
import AceEditor from 'react-ace';
import 'brace/theme/github';
export default ({value}) => {
<AceEditor
mode="eikelang"
theme="github"
width="auto"
height="200px"
value={value}
/>
};
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ°ΠΉΠ» js Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ 'mode-eikelang.js', ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΈΠ· ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΌΠΎΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΡΠΎΡΡΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠΊΠΎΠ±ΠΎΠΊ mysql Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ:
ace.define('ace/mode/doc_comment_highlight_rules',
['require', 'exports', 'module', 'ace/lib/oop', 'ace/mode/text_highlight_rules'],
function(acequire, exports, module) {
'use strict';
let oop = acequire('../lib/oop');
let TextHighlightRules = acequire('./text_highlight_rules').TextHighlightRules;
var DocCommentHighlightRules = function() {
this.$rules = {
'start': [{
token: 'comment.doc.tag',
regex: '@[\\w\\d_]+' // TODO: fix email addresses
},
DocCommentHighlightRules.getTagRule(),
{
defaultToken: 'comment.doc',
caseInsensitive: true
}]
};
};
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
DocCommentHighlightRules.getTagRule = function(start) {
return {
token: 'comment.doc.tag.storage.type',
regex: '\\b(?:TODO|FIXME|XXX|HACK)\\b'
};
};
DocCommentHighlightRules.getStartRule = function(start) {
return {
token: 'comment.doc', // doc comment
regex: '\\/\\*(?=\\*)',
next: start
};
};
DocCommentHighlightRules.getEndRule = function(start) {
return {
token: 'comment.doc', // closing comment
regex: '\\*\\/',
next: start
};
};
exports.DocCommentHighlightRules = DocCommentHighlightRules;
});
ace.define('ace/mode/eikelang_highlight_rules', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(acequire, exports, module) {
let oop = acequire('../lib/oop');
let lang = acequire('../lib/lang');
let DocCommentHighlightRules = acequire('./doc_comment_highlight_rules').DocCommentHighlightRules;
let TextHighlightRules = acequire('./text_highlight_rules').TextHighlightRules;
let EikelangHighlightRules = function() {
let builtins = 'drop|hash|keep|linear_transformation|map|rename|string_manipulation|string_submatcher';
let keywordMapper = this.createKeywordMapper({
'support.function': builtins
}, 'identifier', true);
function string(rule) {
let start = rule.start;
let escapeSeq = rule.escape;
return {
token: 'string.start',
regex: start,
next: [
{token: 'constant.language.escape', regex: escapeSeq},
{token: 'string.end', next: 'start', regex: start},
{defaultToken: 'string'}
]
};
}
this.$rules = {
'start': [{
token: 'comment', regex: '(?:-- |#).*$'
},
string({start: '"', escape: /\\[0'"bnrtZ\\%_]?/}),
string({start: '\'', escape: /\\[0'"bnrtZ\\%_]?/}),
DocCommentHighlightRules.getStartRule('doc-start'),
{
token: 'comment', // multi line comment
regex: /\/\*/,
next: 'comment'
}, {
token: 'constant.numeric', // hex
regex: /0[xX][0-9a-fA-F]+|[xX]'[0-9a-fA-F]+'|0[bB][01]+|[bB]'[01]+'/
}, {
token: 'constant.numeric', // float
regex: '[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b'
}, {
token: keywordMapper,
regex: '[a-zA-Z_$][a-zA-Z0-9_$]*\\b'
}, {
token: 'constant.class',
regex: '@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b'
}, {
token: 'constant.buildin',
regex: '`[^`]*`'
}, {
token: 'keyword.operator',
regex: '\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|='
}, {
token: 'paren.lparen',
regex: '[\\(]'
}, {
token: 'paren.rparen',
regex: '[\\)]'
}, {
token: 'text',
regex: '\\s+'
}],
'comment': [
{token: 'comment', regex: '\\*\\/', next: 'start'},
{defaultToken: 'comment'}
]
};
this.embedRules(DocCommentHighlightRules, 'doc-', [DocCommentHighlightRules.getEndRule('start')]);
this.normalizeRules();
};
oop.inherits(EikelangHighlightRules, TextHighlightRules);
exports.EikelangHighlightRules = EikelangHighlightRules;
});
ace.define('ace/mode/eikelang', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/mode/text', 'ace/mode/eikelang_highlight_rules'],
function(acequire, exports, module) {
let oop = acequire('../lib/oop');
let TextMode = acequire('../mode/text').Mode;
let EikelangHighlightRules = acequire('./eikelang_highlight_rules').EikelangHighlightRules;
let Mode = function() {
this.HighlightRules = EikelangHighlightRules;
this.$behaviour = this.$defaultBehaviour;
};
oop.inherits(Mode, TextMode);
(function() {
this.lineCommentStart = ['--', '#']; // todo space
this.blockComment = {start: '/*', end: '*/'};
this.$id = 'ace/mode/eikelang';
}).call(Mode.prototype);
exports.Mode = Mode;
});
ΠΡΠΈΠ²Π΅Ρ @ pollen8 ,
ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ΄ react-ace, Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²ΠΎΠ΅ ΠΈΠΌΡ.
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π²Π°Ρ ΡΠ΅ΠΆΠΈΠΌ ΡΠΆΠ΅ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΊΠ΅ΡΠ΅ Β«AceΒ», ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ace.define
ΠΈ oop.inherits(Mode, TextMode)
ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Ace, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΡΠΈΡΠ°Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΡΠ°ΡΡΠΌ, ΠΊΠΎΠ³Π΄Π° Π½Π° Π²Π°ΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅ ES6.
Π’Π°ΠΊ ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ Π½Π΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠ»Π°ΡΡ?
ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π»ΠΎ Π±Ρ Π²Π°Ρ ΠΊΠ»Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΡΡΡΠ΅
(ΠΌΠ΅Π½ΡΡΠ΅ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° + Π»ΡΡΡΠΈΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ => ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ)
Π’Π°ΠΊ ΡΡΠΎ Ρ:
componentDidMount
ΠΈ Π²ΡΠ·Π²Π°Π» session.setMode
Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°.ΠΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ:
export default class CustomSqlMode extends ace.acequire('ace/mode/text').Mode {
constructor(){
super();
// Your code goes here
}
}
Π ΠΌΠΎΠΉ ΠΊΠΎΠ΄ ΡΠ΅Π°ΠΊΡΠΈΠΈ-ace Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
render() {
return <div>
<AceEditor
ref="aceEditor"
mode="sql" // Default value since this props must be set.
theme="chrome" // Default value since this props must be set.
/>
</div>;
}
componentDidMount() {
const customMode = new CustomSqlMode();
this.refs.aceEditor.editor.getSession().setMode(customMode);
}
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ, - ΡΡΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ace.acequire('ace/mode/text').Mode
ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΠΊΠ»Π°ΡΡ ΡΠ΅ΠΆΠΈΠΌΠ°.
ΠΠΎ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ react-ace ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΌΠΎΠ΄ΡΠ»Ρ ace Π² window.ace (https://github.com/ajaxorg/ace/blob/4c7e5eb3f5d5ca9434847be51834a4e41661b852/lib/ace/worker/worker.js#L19)
@AlonBe @ ΠΏΡΠ»ΡΡΠ°8
Π£ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠΈΠΉ jsfiddle ΠΈΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ?
ΠΡΡΠ°Π»ΡΡ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΠΊΠ°Π·Π°Π½ΠΈΡΠΌ, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ @AlonBe, Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌ @ pollen8, ΠΈ Ρ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π΅ ΠΌΠΎΠ³Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ... :(
ΠΡΠ±Π°Ρ ΠΏΠΎΠΌΠΎΡΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΅Π½Π΅Π½Π° ΠΏΠΎ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Ρ.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ
ΠΠ΄Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΌΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ:
componentDidMount () {
const customMode = new CustomSqlMode();
this.refs.ace.editor.getSession().setMode(test);
console.log(customMode);
}
@solemnify , this.refs.ace.editor.getSession().setMode(customMode);
ΠΏΡΠΎΠ±ΠΎΠ²Π°Π»ΠΈ Π΄Π΅Π»Π°ΡΡ?
ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ Π·Π° ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΌ ΠΌΠ½ΠΎΠΉ ΠΊΠ»Π°ΡΡΠΎΠΌ CustomSqlMode.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈ ΠΎΠ½, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΡΠ°Π²ΠΈΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΡΠΎΠΊΡ:
this.lineCommentStart = '--';
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ this.HighlightRules
ΠΊΠ»Π°ΡΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°.
ΠΠ·Π³Π»ΡΠ½ΠΈΡΠ΅ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ΅ΠΊΡΡΠΈΡ ΡΠ΅ΠΆΠΈΠΌΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ sql_mode
@AlonBe
ΠΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ CustomSqlMode?
Π― Π½Π΅ Π·Π½Π°Ρ, ΠΊΠ°ΠΊ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ Π² es6 ...
ΠΠ°ΡΠ°Π½Π΅Π΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΠΎΠΌΠΎΡΡ.
Π£ ΠΌΠ΅Π½Ρ ΡΡΠ°Π±ΠΎΡΠ°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
App.js
import React, { Component } from 'react';
import brace from 'brace';
import AceEditor from 'react-ace';
import CustomSqlMode from './CustomSqlMode.js'
import 'brace/theme/github';
class App extends Component {
componentDidMount() {
const customMode = new CustomSqlMode();
this.refs.aceEditor.editor.getSession().setMode(customMode);
}
render() {
return (
<div className="App">
<AceEditor
ref="aceEditor"
mode="text"
theme="github"
name="UNIQUE_ID_OF_DIV"
editorProps={{ $blockScrolling: true }}
/>
</div>
);
}
}
export default App;
CustomSqlMode.js
import 'brace/mode/java';
export class CustomHighlightRules extends window.ace.acequire("ace/mode/text_highlight_rules").TextHighlightRules {
constructor() {
super();
this.$rules = {
"start": [{
token: "comment",
regex: "#.*$"
}, {
token: "string",
regex: '".*?"'
}]
};
}
}
export default class CustomSqlMode extends window.ace.acequire('ace/mode/java').Mode {
constructor() {
super();
this.HighlightRules = CustomHighlightRules;
}
}
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²ΡΠ΄Π΅Π»Π΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΡΡΡΠΎΠΊΠΈ. Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Ρ ΡΠ΄Π΅Π»Π°Π», Π±ΡΠ»ΠΎ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
@ newint33h ΡΠΏΠ°ΡΠΈΠ±ΠΎ! Π£ ΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
@ newint33h Π― ΠΏΡΡΠ°Π»ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ, Π½ΠΎ ΠΎΠ½Π° ΠΆΠ°Π»ΡΠ΅ΡΡΡ, ΡΡΠΎ TypeError: Π½Π΅
@shuotongli Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° this.refs
ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΡΠ°ΡΠ΅Π». ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ»ΠΊΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π²Π°ΠΌΠΈ Π²Π΅ΡΡΠΈΠΈ React. Π§ΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΌ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π΅, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ ΡΡΠΈΠΌ:
https://reactjs.org/docs/refs-and-the-dom.html#creating -refs
Π£ ΠΌΠ΅Π½Ρ ΡΡΠ°Π±ΠΎΡΠ°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
App.js
import React, { Component } from 'react'; import brace from 'brace'; import AceEditor from 'react-ace'; import CustomSqlMode from './CustomSqlMode.js' import 'brace/theme/github'; class App extends Component { componentDidMount() { const customMode = new CustomSqlMode(); this.refs.aceEditor.editor.getSession().setMode(customMode); } render() { return ( <div className="App"> <AceEditor ref="aceEditor" mode="text" theme="github" name="UNIQUE_ID_OF_DIV" editorProps={{ $blockScrolling: true }} /> </div> ); } } export default App;
CustomSqlMode.js
import 'brace/mode/java'; export class CustomHighlightRules extends window.ace.acequire("ace/mode/text_highlight_rules").TextHighlightRules { constructor() { super(); this.$rules = { "start": [{ token: "comment", regex: "#.*$" }, { token: "string", regex: '".*?"' }] }; } } export default class CustomSqlMode extends window.ace.acequire('ace/mode/java').Mode { constructor() { super(); this.HighlightRules = CustomHighlightRules; } }
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²ΡΠ΄Π΅Π»Π΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΡΡΡΠΎΠΊΠΈ. Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Ρ ΡΠ΄Π΅Π»Π°Π», Π±ΡΠ»ΠΎ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΏΠΎΡΠ΅ΠΌΡ ΡΠ΅ΠΆΠΈΠΌ = 'ΡΠ΅ΠΊΡΡ', ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡ?
@TaurusWood , ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠ΅ΡΠ²ΡΠΉ render
Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ componentDidMount
- Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ "ΡΠ΅ΠΆΠΈΠΌ" ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ react-ace.
ΠΏΠΎΠ·ΠΆΠ΅, Π½Π° componentDidMount
Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΊΠΎΠ΄ ΠΎΡΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠΎΡ ΡΠ΅ΠΆΠΈΠΌ ( setMode
)
ΠΈ, ΠΊΡΡΠ°ΡΠΈ, Π΅ΡΠ»ΠΈ Ρ Π½Π΅ ΠΎΡΠΈΠ±Π°ΡΡΡ, mode = 'text' - ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ΅ΠΆΠΈΠΌ Ace, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΡΠΌΠ΅Π½ΡΡΡ.
ΠΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΎΠ½ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π²ΡΠ΅ ΠΌΠΎΠΈ ΠΊΠΎΠ΄Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ ΡΠ΅ΠΊΡΡ, Π° Π½Π΅ ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ» java ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°? Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
Π£ ΠΌΠ΅Π½Ρ ΡΡΠ°Π±ΠΎΡΠ°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
App.js
import React, { Component } from 'react'; import brace from 'brace'; import AceEditor from 'react-ace'; import CustomSqlMode from './CustomSqlMode.js' import 'brace/theme/github'; class App extends Component { componentDidMount() { const customMode = new CustomSqlMode(); this.refs.aceEditor.editor.getSession().setMode(customMode); } render() { return ( <div className="App"> <AceEditor ref="aceEditor" mode="text" theme="github" name="UNIQUE_ID_OF_DIV" editorProps={{ $blockScrolling: true }} /> </div> ); } } export default App;
CustomSqlMode.js
import 'brace/mode/java'; export class CustomHighlightRules extends window.ace.acequire("ace/mode/text_highlight_rules").TextHighlightRules { constructor() { super(); this.$rules = { "start": [{ token: "comment", regex: "#.*$" }, { token: "string", regex: '".*?"' }] }; } } export default class CustomSqlMode extends window.ace.acequire('ace/mode/java').Mode { constructor() { super(); this.HighlightRules = CustomHighlightRules; } }
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²ΡΠ΄Π΅Π»Π΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΡΡΡΠΎΠΊΠΈ. Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Ρ ΡΠ΄Π΅Π»Π°Π», Π±ΡΠ»ΠΎ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π£ ΠΌΠ΅Π½Ρ ΡΡΠ°Π±ΠΎΡΠ°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
App.js
CustomSqlMode.js
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²ΡΠ΄Π΅Π»Π΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΡΡΡΠΎΠΊΠΈ. Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Ρ ΡΠ΄Π΅Π»Π°Π», Π±ΡΠ»ΠΎ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.