summaryrefslogtreecommitdiff
path: root/support/texlab/src/syntax/latex/glossary.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/syntax/latex/glossary.rs')
-rw-r--r--support/texlab/src/syntax/latex/glossary.rs58
1 files changed, 58 insertions, 0 deletions
diff --git a/support/texlab/src/syntax/latex/glossary.rs b/support/texlab/src/syntax/latex/glossary.rs
new file mode 100644
index 0000000000..14f87ef130
--- /dev/null
+++ b/support/texlab/src/syntax/latex/glossary.rs
@@ -0,0 +1,58 @@
+use super::ast::*;
+use crate::syntax::language::*;
+use crate::syntax::text::SyntaxNode;
+use lsp_types::Range;
+use std::sync::Arc;
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+pub struct LatexGlossaryEntry {
+ pub command: Arc<LatexCommand>,
+ pub label_index: usize,
+ pub kind: LatexGlossaryEntryKind,
+}
+
+impl SyntaxNode for LatexGlossaryEntry {
+ fn range(&self) -> Range {
+ self.command.range()
+ }
+}
+
+impl LatexGlossaryEntry {
+ pub fn label(&self) -> &LatexToken {
+ self.command.extract_word(self.label_index).unwrap()
+ }
+
+ fn parse(commands: &[Arc<LatexCommand>]) -> Vec<Self> {
+ let mut entries = Vec::new();
+ for command in commands {
+ for LatexGlossaryEntryDefinitionCommand {
+ name,
+ label_index,
+ kind,
+ } in &LANGUAGE_DATA.glossary_entry_definition_commands
+ {
+ if command.name.text() == name && command.has_word(*label_index) {
+ entries.push(Self {
+ command: Arc::clone(&command),
+ label_index: *label_index,
+ kind: *kind,
+ });
+ }
+ }
+ }
+ entries
+ }
+}
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+pub struct LatexGlossaryInfo {
+ pub entries: Vec<LatexGlossaryEntry>,
+}
+
+impl LatexGlossaryInfo {
+ pub fn parse(commands: &[Arc<LatexCommand>]) -> Self {
+ Self {
+ entries: LatexGlossaryEntry::parse(commands),
+ }
+ }
+}