summaryrefslogtreecommitdiff
path: root/support/texlab/src/symbol/latex_section/float.rs
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-12-03 03:01:24 +0000
committerNorbert Preining <norbert@preining.info>2019-12-03 03:01:24 +0000
commitb8d4bb76703bcb15578e2b23c5d256532180b894 (patch)
treebedd1df7a00521a2bd986b3c0289d6556a59e39b /support/texlab/src/symbol/latex_section/float.rs
parent02e4625a78a5029e8b5dc2a4ec70193b232f497e (diff)
CTAN sync 201912030301
Diffstat (limited to 'support/texlab/src/symbol/latex_section/float.rs')
-rw-r--r--support/texlab/src/symbol/latex_section/float.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/support/texlab/src/symbol/latex_section/float.rs b/support/texlab/src/symbol/latex_section/float.rs
new file mode 100644
index 0000000000..9356d0ed3e
--- /dev/null
+++ b/support/texlab/src/symbol/latex_section/float.rs
@@ -0,0 +1,57 @@
+use super::{label_name, selection_range};
+use crate::symbol::{LatexSymbol, LatexSymbolKind};
+use crate::syntax::*;
+use crate::workspace::*;
+
+pub fn symbols(view: &DocumentView, tree: &LatexSyntaxTree) -> Vec<LatexSymbol> {
+ tree.structure
+ .captions
+ .iter()
+ .filter_map(|caption| make_symbol(view, tree, caption))
+ .collect()
+}
+
+fn make_symbol(
+ view: &DocumentView,
+ tree: &LatexSyntaxTree,
+ caption: &LatexCaption,
+) -> Option<LatexSymbol> {
+ let environment = tree
+ .env
+ .environments
+ .iter()
+ .find(|env| tree.is_direct_child(env, caption.start()))?;
+ let text = extract_group(&caption.command.args[caption.index]);
+
+ let kind = environment
+ .left
+ .name()
+ .map(LatexToken::text)
+ .and_then(OutlineCaptionKind::parse)?;
+
+ let label = tree.find_label_by_environment(environment);
+ let number = label
+ .as_ref()
+ .and_then(|label| OutlineContext::find_number(view, label));
+
+ let name = match &number {
+ Some(number) => format!("{} {}: {}", kind.as_str(), number, text),
+ None => format!("{}: {}", kind.as_str(), text),
+ };
+
+ let symbol = LatexSymbol {
+ name,
+ label: label_name(label),
+ kind: match kind {
+ OutlineCaptionKind::Figure => LatexSymbolKind::Figure,
+ OutlineCaptionKind::Table => LatexSymbolKind::Table,
+ OutlineCaptionKind::Listing => LatexSymbolKind::Listing,
+ OutlineCaptionKind::Algorithm => LatexSymbolKind::Algorithm,
+ },
+ deprecated: false,
+ full_range: environment.range(),
+ selection_range: selection_range(environment.range(), label),
+ children: Vec::new(),
+ };
+ Some(symbol)
+}