React-ace: Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнный Ρ€Π΅ΠΆΠΈΠΌ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 6 июл. 2016  Β·  19ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: securingsincity/react-ace

ΠŸΡ€ΠΈΠ²Π΅Ρ‚,

Мой вопрос ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π³Π»ΡƒΠΏΡ‹ΠΌ (извиняюсь Π·Π° это), Π½ΠΎ я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ настраиваСмый Ρ€Π΅ΠΆΠΈΠΌ / подсвСтку синтаксиса / Π°Π²Ρ‚ΠΎΠ·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠœΠΎΠΆΠ΅Ρ‚ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΌΠ½Π΅ ΠΏΠΎΠΌΠΎΡ‡ΡŒ? Π― Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ Π² brace, ace ΠΈ react, Π½ΠΎ я Π²ΠΈΠ΄Π΅Π» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ свой собствСнный Ρ€Π΅ΠΆΠΈΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ace. Π§Π΅Π³ΠΎ я Π½Π΅ ΠΌΠΎΠ³ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‚Π°ΠΊ это Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС с react-ace.

Π₯ристианин

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π£ мСня сработал ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

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;
    }
}

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ строки. Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я сдСлал, Π±Ρ‹Π»ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π½ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ВсС 19 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚,

Π° какая Ρƒ вас рСализация? Π― ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π’ΠΎΡ‡Π½ΠΎ Π½Π΅ помню, Π½ΠΎ Π΄ΡƒΠΌΠ°ΡŽ, ΠΌΠ½Π΅ сначала ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ 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

А Π²ΠΎΡ‚ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚:
screen shot 2016-07-19 at 18 23 14

Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ³ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌΡ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ· скобки. Π§Ρ‚ΠΎ ΠΌΠ½Π΅ интСрСсно, Ρ‚Π°ΠΊ это ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой собствСнный Ρ€Π΅ΠΆΠΈΠΌ? Π― сам написал собствСнный Ρ€Π΅ΠΆΠΈΠΌ ΠΈ Ρ…ΠΎΡ‡Ρƒ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ смог ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 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.
Π’Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой собствСнный Ρ€Π΅ΠΆΠΈΠΌ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ пишСм любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс?
Π­Ρ‚ΠΎ сдСлало Π±Ρ‹ ваш класс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅
(мСньшС строк ΠΊΠΎΠ΄Π° + Π»ΡƒΡ‡ΡˆΠΈΠΉ синтаксис => мСньшС обслуТивания)

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ я:

  1. Π‘ΠΎΠ·Π΄Π°Π» свой класс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° (чистый ΠΊΠΎΠ΄ ES6)
  2. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "sql")
  3. Использовал Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ 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;
  }
}

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ строки. Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я сдСлал, Π±Ρ‹Π»ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π½ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ