Первый запуск токенизации при выполнении setValue в редакторе не работает как последовательные изменения - PullRequest
0 голосов
/ 03 мая 2018

Я тестирую редактор свойств с темой «из коробки» (сумерки) - которая работает как положено - и из режима свойств из коробки. Задание исходного текста свойств в редакторе с помощью javascript (editor.setValue ()) анализируется как обычный текст (тип: текст) при токенизации вместо свойств (переменная, ключевое слово, строка)

(см. Также следующий код: https://codepen.io/anon/pen/xjrvvG?editors=1111)


ОБНОВЛЕНИЕ : загрузка следующих скриптов на странице решает проблему, но это не может быть реальной идеей

<script src="./ace/theme-twilight.js" type="text/javascript" charset="utf-8"></script>
<script src="./ace/mode-properties.js" type="text/javascript" charset="utf-8"></script>

HTML:

 <div id="code" style="position: relative; width: 500px; height: 400px;"></div>

Javascript:

var editor = ace.edit("code");
var session = editor.getSession();

editor.setTheme("ace/theme/twilight");
session.setMode({
    path: "ace/mode/properties",
    v: Date.now()
});

session.on('change', function (e) {
    console.log(e);
    console.log(session.getLine(e.end.row).length);
    var TokenIterator = ace.require("ace/token_iterator").TokenIterator;
    var iterator = new TokenIterator(editor.getSession(), e.end.row, 0);
    var token = iterator.getCurrentToken();
    while (token && iterator.getCurrentTokenRow() === e.end.row) {
        console.log(token);
        token = iterator.stepForward();
    }
});

editor.getSession().setValue("#just a comment\n" +
    "database=localhost\n" +
    "database=remotehost\n" +
    "dbuser=uuu\n" +
    "dbpassword=password", 1);

Журнал консоли при загрузке страницы (не ожидается, так как type = text не подходит для режима свойств):

Object {
  action: "insert",
  end: Object {
    column: 19,
    row: 4
  },
  id: 1,
  lines: ["#just a comment", "database=localhost", "database=remotehost", "dbuser=uuu", "dbpassword=password"],
  start: Object {
    column: 0,
    row: 0
  }
}
19
Object {
  index: 0,
  start: 0,
  type: "text",
  value: "dbpassword=password"
}

При непосредственном изменении редактора свойство анализируется правильно (переменная, ключевое слово, строка):

Object {
  action: "insert",
  end: Object {
    column: 20,
    row: 4
  },
  id: 2,
  lines: ["d"],
  start: Object {
    column: 19,
    row: 4
  }
}
20
Object {
  index: 0,
  start: 0,
  type: "variable",
  value: "dbpassword"
}
Object {
  type: "keyword",
  value: "="
}
Object {
  type: "string",
  value: "passwordd"
}

1 Ответ

0 голосов
/ 09 мая 2018

при использовании setMode режим загружается асинхронно, поэтому в первый раз он анализируется как текст.

Когда вы включаете <script src="./ace/mode-properties.js" type="text/javascript" charset="utf-8"></script>, режим загружается до остального кода, поэтому при первом запуске редактор уже использует правильный режим

...