Skip to content

Commit

Permalink
feat: Add new method IsBlock::declared_style
Browse files Browse the repository at this point in the history
  • Loading branch information
scouten committed Jan 6, 2025
1 parent b013c57 commit 8bd8067
Show file tree
Hide file tree
Showing 13 changed files with 82 additions and 6 deletions.
17 changes: 17 additions & 0 deletions parser/src/blocks/is_block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,23 @@ pub trait IsBlock<'src>: HasSpan<'src> + Clone + Debug + Eq + PartialEq {
/// built-in context. That transformation is not performed by this function.
fn raw_context(&self) -> CowStr<'src>;

/// Returns the declared (uninterpreted) style for this block.
///
/// Above some blocks, you may notice a name at the start of the block
/// attribute list (e.g., `[source]` or `[verse]`). The first positional
/// (unnamed) attribute in the block attribute list is used to declare the
/// block style.
///
/// The declared block style is the value the author supplies.
///
/// That value is then interpreted and resolved. That interpretation is not
/// performed by this function.
fn declared_style(&'src self) -> Option<Span<'src>> {
self.attrlist()
.and_then(|attrlist| attrlist.nth_attribute(1))
.and_then(|attr| attr.block_style())
}

/// Returns an iterator over the nested blocks contained within
/// this block.
///
Expand Down
20 changes: 14 additions & 6 deletions parser/src/tests/asciidoc_lang/blocks/index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ You can think of the context as the block's type.
.unwrap();

assert_eq!(mi.item.raw_context().deref(), "section");
assert!(mi.item.declared_style().is_none());
}

#[test]
Expand Down Expand Up @@ -309,8 +310,8 @@ In the converter, these blocks must be accessed from their parent block.

mod block_style {
use crate::{
blocks::{Block, IsBlock},
tests::sdd::{non_normative, to_do_verifies},
blocks::{Block, ContentModel, IsBlock},
tests::{fixtures::TSpan, sdd::{non_normative, verifies}},
Span,
};

Expand All @@ -335,9 +336,8 @@ The resolved block style, if non-empty, specializes the block's context.
);

#[test]
#[ignore]
fn source_block() {
to_do_verifies!(
verifies!(
r#"
Consider the following example of a source block:
Expand All @@ -364,8 +364,16 @@ The context of the block is still the same, but it has additional metadata to in
.unwrap();

assert_eq!(mi.item.raw_context().as_ref(), "listing");
// assert_eq!(mi.item.style(), "source");
// assert_eq!(mi.item.content_model(), ContentModel::Verbatim);

assert_eq!(mi.item.declared_style().unwrap(),
TSpan {
data: "source",
line: 1,
col: 2,
offset: 1,
});

assert_eq!(mi.item.content_model(), ContentModel::Verbatim);
}

// TO DO: Cover the remainder ...
Expand Down
1 change: 1 addition & 0 deletions parser/src/tests/blocks/block/compound_delimited.rs
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ mod example {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "example");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.nested_blocks().next().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down
3 changes: 3 additions & 0 deletions parser/src/tests/blocks/block/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ mod error_cases {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().deref(), "section");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -153,6 +154,7 @@ mod error_cases {

assert_eq!(mi.item.content_model(), ContentModel::Simple);
assert_eq!(mi.item.raw_context().deref(), "paragraph");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -215,6 +217,7 @@ mod error_cases {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().deref(), "section");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());

assert_eq!(
Expand Down
12 changes: 12 additions & 0 deletions parser/src/tests/blocks/block/raw_delimited.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ mod comment {

assert_eq!(mi.item.content_model(), ContentModel::Raw);
assert_eq!(mi.item.raw_context().as_ref(), "comment");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
}
Expand Down Expand Up @@ -257,6 +258,7 @@ mod comment {

assert_eq!(mi.item.content_model(), ContentModel::Raw);
assert_eq!(mi.item.raw_context().as_ref(), "comment");
assert!(mi.item.declared_style().is_none());

assert_eq!(
mi.item.title().unwrap(),
Expand Down Expand Up @@ -309,6 +311,7 @@ mod comment {

assert_eq!(mi.item.content_model(), ContentModel::Raw);
assert_eq!(mi.item.raw_context().as_ref(), "comment");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
}
Expand Down Expand Up @@ -357,6 +360,7 @@ mod comment {

assert_eq!(mi.item.content_model(), ContentModel::Raw);
assert_eq!(mi.item.raw_context().as_ref(), "comment");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
}
Expand Down Expand Up @@ -400,6 +404,7 @@ mod listing {

assert_eq!(mi.item.content_model(), ContentModel::Verbatim);
assert_eq!(mi.item.raw_context().as_ref(), "listing");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
}
Expand Down Expand Up @@ -442,6 +447,7 @@ mod listing {

assert_eq!(mi.item.content_model(), ContentModel::Verbatim);
assert_eq!(mi.item.raw_context().as_ref(), "listing");
assert!(mi.item.declared_style().is_none());
assert_eq!(mi.item.nested_blocks().next(), None);
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down Expand Up @@ -500,6 +506,7 @@ mod listing {

assert_eq!(mi.item.content_model(), ContentModel::Verbatim);
assert_eq!(mi.item.raw_context().as_ref(), "listing");
assert!(mi.item.declared_style().is_none());
assert_eq!(mi.item.nested_blocks().next(), None);

assert_eq!(
Expand Down Expand Up @@ -569,6 +576,7 @@ mod listing {

assert_eq!(mi.item.content_model(), ContentModel::Verbatim);
assert_eq!(mi.item.raw_context().as_ref(), "listing");
assert!(mi.item.declared_style().is_none());
assert_eq!(mi.item.nested_blocks().next(), None);
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down Expand Up @@ -623,6 +631,7 @@ mod pass {

assert_eq!(mi.item.content_model(), ContentModel::Raw);
assert_eq!(mi.item.raw_context().as_ref(), "pass");
assert!(mi.item.declared_style().is_none());
assert_eq!(mi.item.nested_blocks().next(), None);
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down Expand Up @@ -676,6 +685,7 @@ mod pass {

assert_eq!(mi.item.content_model(), ContentModel::Raw);
assert_eq!(mi.item.raw_context().as_ref(), "pass");
assert!(mi.item.declared_style().is_none());
assert_eq!(mi.item.nested_blocks().next(), None);
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down Expand Up @@ -734,6 +744,7 @@ mod pass {

assert_eq!(mi.item.content_model(), ContentModel::Raw);
assert_eq!(mi.item.raw_context().as_ref(), "pass");
assert!(mi.item.declared_style().is_none());
assert_eq!(mi.item.nested_blocks().next(), None);

assert_eq!(
Expand Down Expand Up @@ -803,6 +814,7 @@ mod pass {

assert_eq!(mi.item.content_model(), ContentModel::Raw);
assert_eq!(mi.item.raw_context().as_ref(), "pass");
assert!(mi.item.declared_style().is_none());
assert_eq!(mi.item.nested_blocks().next(), None);
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down
3 changes: 3 additions & 0 deletions parser/src/tests/blocks/block/section.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ fn simplest_section_block() {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().deref(), "section");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -116,6 +117,7 @@ fn has_child_block() {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().deref(), "section");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -209,6 +211,7 @@ fn title() {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().deref(), "section");
assert!(mi.item.declared_style().is_none());

assert_eq!(
mi.item,
Expand Down
1 change: 1 addition & 0 deletions parser/src/tests/blocks/block/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ fn single_line() {

assert_eq!(mi.item.content_model(), ContentModel::Simple);
assert_eq!(mi.item.raw_context().deref(), "paragraph");
assert!(mi.item.declared_style().is_none());
assert_eq!(mi.item.nested_blocks().next(), None);
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down
12 changes: 12 additions & 0 deletions parser/src/tests/blocks/compound_delimited.rs
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ mod example {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "example");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.nested_blocks().next().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down Expand Up @@ -316,6 +317,7 @@ mod example {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "example");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -434,6 +436,7 @@ mod example {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "example");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -561,6 +564,7 @@ mod open {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "open");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.nested_blocks().next().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down Expand Up @@ -624,6 +628,7 @@ mod open {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "open");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -753,6 +758,7 @@ mod open {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "open");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -859,6 +865,7 @@ mod sidebar {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "sidebar");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.nested_blocks().next().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down Expand Up @@ -922,6 +929,7 @@ mod sidebar {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "sidebar");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -1040,6 +1048,7 @@ mod sidebar {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "sidebar");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -1179,6 +1188,7 @@ mod quote {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "quote");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.nested_blocks().next().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());
Expand Down Expand Up @@ -1242,6 +1252,7 @@ mod quote {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "quote");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down Expand Up @@ -1360,6 +1371,7 @@ mod quote {

assert_eq!(mi.item.content_model(), ContentModel::Compound);
assert_eq!(mi.item.raw_context().as_ref(), "quote");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down
1 change: 1 addition & 0 deletions parser/src/tests/blocks/macro.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ fn simplest_block_macro() {

assert_eq!(mi.item.content_model(), ContentModel::Simple);
assert_eq!(mi.item.raw_context().deref(), "paragraph");
assert!(mi.item.declared_style().is_none());
assert!(mi.item.title().is_none());
assert!(mi.item.attrlist().is_none());

Expand Down
Loading

0 comments on commit 8bd8067

Please sign in to comment.