Search code examples
javascriptcodemirror

codemirror: search and highlight multipule words without dialog


Objective: I am using codemirror as editor. I want to

  1. Search and highlight multiple strings
  2. I want to be able to iterate each number of matches found and print its line number.
  3. I want to do it programatically and do no want to use dialog as in example https://codemirror.net/demo/search.html

Issue:

  1. during while loop only last match is selected, previous ones are cleared , but i also want it hightlighted yellow like https://codemirror.net/demo/search.html

JSFIDDLE: https://jsfiddle.net/bababalcksheep/p7xg1utn/30/

CODE:

$(document).ready(function() {
  //
  var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
    mode: "text/html",
    lineNumbers: true,
  });
  //
  function search(val) {
    var cursor = editor.getSearchCursor(val);
    while (cursor.findNext()) {
      editor.setSelection(cursor.from(), cursor.to());
        console.log('found at line ', cursor.pos.from.line + 1);
    }
  }
  //
  $('#search').click(function(event) {
    event.preventDefault();
    search(/^alpha|^beta/);
  });

  //
});

Solution

  • Calling setSelection can only highlight one continuous substring at a time. Instead, you can use the markText method for this, passing in cursor.from() and cursor.to() to get the locations you want to highlight:

    $(document).ready(function() {
      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
        mode: "text/html",
        lineNumbers: true,
      });
      function search(val) {
        var cursor = editor.getSearchCursor(val);
        while (cursor.findNext()) {
            editor.markText(
              cursor.from(),
              cursor.to(),
              { className: 'highlight' }
            );
        }
      }
      //
      $('#search').click(function(event) {
        event.preventDefault();
        search(/^alpha|^beta/);
      });
    });
    .CodeMirror {
      border-top: 1px solid black;
      border-bottom: 1px solid black;
      height: 200px;
    }
    .highlight {
      color: orange;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/codemirror.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/addon/search/searchcursor.min.js"></script>
    <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/codemirror.min.css">
    
    <div class="container">
      <p><strong>Objective:</strong></p>
      <p>Find/search and highlight both words <strong>alpha</strong> and <strong>beta</strong> in codemirror editor</p>
      <button id="search" type="button" class="btn btn-primary">Search and highlight</button>
      <br><br>
      <textarea id="code" name="code" rows="8">Text line
    alpha 1
    Text line
    Text line
    alpha 2
    Text line
    Text line
    beta 1
    Text line</textarea>