src/Tools/VSCode/src/vscode_spell_checker.scala
author wenzelm
Fri, 01 Apr 2022 17:06:10 +0200
changeset 75393 87ebf5a50283
parent 72761 4519eeefe3b5
permissions -rw-r--r--
clarified formatting, for the sake of scala3;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/VSCode/src/vscode_spell_checker.scala
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     3
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     4
Specific spell-checker support for Isabelle/VSCode.
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     6
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle.vscode
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     8
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
     9
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    10
import isabelle._
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    11
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    12
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 72761
diff changeset
    13
object VSCode_Spell_Checker {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 72761
diff changeset
    14
  def decoration(rendering: VSCode_Rendering): VSCode_Model.Decoration = {
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    15
    val model = rendering.model
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    16
    val ranges =
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    17
      (for {
66143
51f74025a3e3 tuned signature;
wenzelm
parents: 66141
diff changeset
    18
        spell_checker <- rendering.resources.spell_checker.get.iterator
67395
b39d596b77ce more accurate spell-checking for nested quotations / antiquotations, notably in formal comments;
wenzelm
parents: 67014
diff changeset
    19
        spell <- rendering.spell_checker(model.content.text_range).iterator
b39d596b77ce more accurate spell-checking for nested quotations / antiquotations, notably in formal comments;
wenzelm
parents: 67014
diff changeset
    20
        text <- model.get_text(spell.range).iterator
b39d596b77ce more accurate spell-checking for nested quotations / antiquotations, notably in formal comments;
wenzelm
parents: 67014
diff changeset
    21
        info <- spell_checker.marked_words(spell.range.start, text).iterator
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    22
      } yield info.range).toList
72761
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    23
    VSCode_Model.Decoration.ranges("spell_checker", ranges)
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    24
  }
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    25
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    26
  def completion(rendering: VSCode_Rendering, caret: Text.Offset): Option[Completion.Result] =
66143
51f74025a3e3 tuned signature;
wenzelm
parents: 66141
diff changeset
    27
    rendering.resources.spell_checker.get.flatMap(_.completion(rendering, caret))
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    28
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 72761
diff changeset
    29
  def menu_items(rendering: VSCode_Rendering, caret: Text.Offset): List[LSP.CompletionItem] = {
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    30
    val result =
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    31
      for {
66143
51f74025a3e3 tuned signature;
wenzelm
parents: 66141
diff changeset
    32
        spell_checker <- rendering.resources.spell_checker.get
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    33
        range = rendering.before_caret_range(caret)
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    34
        Text.Info(_, word) <- Spell_Checker.current_word(rendering, range)
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    35
      } yield (spell_checker, word)
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    36
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    37
    result match {
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    38
      case Some((spell_checker, word)) =>
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    39
72761
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    40
        def item(command: LSP.Command): LSP.CompletionItem =
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    41
          LSP.CompletionItem(
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    42
            label = command.title,
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    43
            text = Some(""),
66143
51f74025a3e3 tuned signature;
wenzelm
parents: 66141
diff changeset
    44
            range = Some(rendering.model.content.doc.range(Text.Range(caret))),
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    45
            command = Some(command))
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    46
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    47
        val update_items =
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    48
          if (spell_checker.check(word))
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    49
            List(
72761
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    50
              item(LSP.Exclude_Word.command),
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    51
              item(LSP.Exclude_Word_Permanently.command))
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    52
          else
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    53
            List(
72761
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    54
              item(LSP.Include_Word.command),
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    55
              item(LSP.Include_Word_Permanently.command))
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    56
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    57
        val reset_items =
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    58
          spell_checker.reset_enabled() match {
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    59
            case 0 => Nil
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    60
            case n =>
72761
4519eeefe3b5 avoid conflicting base names;
wenzelm
parents: 71774
diff changeset
    61
              val command = LSP.Reset_Words.command
66141
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    62
              List(item(command).copy(label = command.title + " (" + n + ")"))
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    63
          }
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    64
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    65
        update_items ::: reset_items
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    66
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    67
      case None => Nil
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    68
    }
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    69
  }
81c8bb1d33b9 clarified modules;
wenzelm
parents:
diff changeset
    70
}