2014-02-21 2 views
1

Могу ли я применить наложение зеркала кода вне определения режима? Код ниже работает, но кажется излишним и медленным. Я определяю режим для каждого редактора/зрителя на странице, которая может быть нулевой для многих. Как это можно оптимизировать?Нанесено зеркальное покрытие кода

В идеале, я хотел бы определить режим один раз, а затем применить наложение по мере необходимости.

Я не смог найти ответ, если смогу. Я хочу определить режим (он выделяет поисковый запрос (see this question)), а затем я хочу применить этот режим для многих редакторов/зрителей на странице. Каждый редактор/просмотрщик имеет другой язык и установлен на элемент DOM (например, <pre class="sourcecode" language="javascript">code</pr>).

Я думаю, что решение будет иметь дело с return CodeMirror.overlayMode(CodeMirror.getMode(config, mode),searchOverlay, true);, но я не смог заставить его работать.

$('.sourcecode').each(function() { 
     var value = $(this).text(), 
      search = (typeof keyword === 'undefined') ? false : true, 
      mode = $(this).attr('language'), 
      pre = $(this).get(0), 
      line = ($(this).attr('firstLineNumber') == undefined) ? 1 : parseInt($(this).attr('firstLineNumber'), 10); 

     // CodeMirror search highlighing 

     // this seems redundent, slow, and messy 
     if (search) { 
      CodeMirror.defineMode("highlightSearch", function(config, parserConfig) { 
       var searchOverlay = { 
       token: function(stream, state) { 
        if (stream.match(keyword)) { 
         return "highlightSearch"; 
        } 

        while (stream.next() != null && !stream.match(keyword, false)) {} 
        return null; 
       } 
       }; 
       return CodeMirror.overlayMode(CodeMirror.getMode(config, mode),searchOverlay, true); 
      }); 
     } 

     var viewer = CodeMirror(function(elt) { 
      pre.parentNode.replaceChild(elt, pre); 
     }, { 
      value: value, 
      lineNumbers: true, 
      firstLineNumber: line, 
      matchBrackets: true, 
      lineWrapping: true, 
      readOnly: true, 
      mode: (search) ? 'highlightSearch' : mode, 
     }); 
    }); 

Благодарим за любую помощь.

+0

это может быть лучше уместиться на [codereview.stackexchange. ком] (http://codereview.stackexchange.com/). –

ответ

0

Это вряд ли будет очень дорого (если вы не создаете сотни редакторов в секунду), но более элегантным решением будет определение режима обертывания один раз и чтение внутреннего режима (mode) в коде. его parserConfig объект, скажем parserConfig.inner. Затем вы просто передали {name: "highlightSearch", inner: mode} в качестве вашего mode.

+0

Спасибо, Marijn. Работает отлично. Мне не хватало возможности передать объект в качестве режима в документах? Также я могу найти дополнительную информацию об объекте parserConfig? – khornberg

+0

В документах для опции mode указывается следующее: http://codemirror.net/doc/manual.html#option_mode. Объект parserConfig - это в значительной степени объект, переданный в качестве режима. – Marijn

0

Для полноты я определил режим снаружи .each. В определении режима я заменил

return CodeMirror.overlayMode(CodeMirror.getMode(config, mode),searchOverlay, true); 

с

return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.inner),searchOverlay, true); 

и заменил

mode: (search) ? 'highlightSearch' : mode, 

с

mode: (search) ? {name: 'highlightSearch', inner: mode} : mode, 
Смежные вопросы