#[cfg(any(feature = "inline-images", feature = "visitor"))]
use std::cell::RefCell;
use std::collections::{BTreeMap, HashSet};
use std::rc::Rc;
#[cfg(feature = "inline-images")]
use crate::inline_images::InlineImageCollector;
use crate::converter::reference_collector::ReferenceCollectorHandle;
use crate::types::structure_collector::StructureCollectorHandle;
#[cfg(feature = "inline-images")]
pub type InlineCollectorHandle = Rc<RefCell<InlineImageCollector>>;
#[cfg(not(feature = "inline-images"))]
pub type InlineCollectorHandle = ();
#[cfg(feature = "metadata")]
pub type ImageMetadataPayload = (BTreeMap<String, String>, Option<u32>, Option<u32>);
#[derive(Clone)]
pub struct Context {
pub(crate) in_code: bool,
pub(crate) list_counter: usize,
pub(crate) in_ordered_list: bool,
pub(crate) blockquote_depth: usize,
pub(crate) in_table_cell: bool,
pub(crate) convert_as_inline: bool,
pub(crate) inline_depth: usize,
pub(crate) in_list_item: bool,
pub(crate) list_depth: usize,
pub(crate) ul_depth: usize,
pub(crate) in_list: bool,
pub(crate) loose_list: bool,
pub(crate) prev_item_had_blocks: bool,
pub(crate) in_heading: bool,
pub(crate) heading_allow_inline_images: bool,
pub(crate) in_paragraph: bool,
pub(crate) block_content_start: usize,
pub(crate) in_ruby: bool,
pub(crate) in_strong: bool,
pub(crate) in_link: bool,
pub(crate) strip_tags: Rc<HashSet<String>>,
pub(crate) preserve_tags: Rc<HashSet<String>>,
pub(crate) keep_inline_images_in: Rc<HashSet<String>>,
pub(crate) excluded_node_ids: Rc<HashSet<u32>>,
#[cfg(feature = "inline-images")]
pub(crate) inline_collector: Option<InlineCollectorHandle>,
#[cfg(feature = "metadata")]
pub(crate) metadata_collector: Option<crate::metadata::MetadataCollectorHandle>,
#[cfg(feature = "metadata")]
pub(crate) metadata_wants_document: bool,
#[cfg(feature = "metadata")]
pub(crate) metadata_wants_headers: bool,
#[cfg(feature = "metadata")]
pub(crate) metadata_wants_links: bool,
#[cfg(feature = "metadata")]
pub(crate) metadata_wants_images: bool,
#[cfg(feature = "metadata")]
pub(crate) metadata_wants_structured_data: bool,
#[cfg(feature = "visitor")]
pub(crate) visitor: Option<crate::visitor::VisitorHandle>,
#[cfg(feature = "visitor")]
pub(crate) visitor_error: Rc<RefCell<Option<String>>>,
pub(crate) structure_collector: Option<StructureCollectorHandle>,
pub(crate) reference_collector: Option<ReferenceCollectorHandle>,
}
impl Context {
pub(crate) fn set_excluded_node_ids(&mut self, ids: HashSet<u32>) {
self.excluded_node_ids = Rc::new(ids);
}
#[allow(clippy::too_many_arguments)]
#[cfg_attr(
any(not(feature = "inline-images"), not(feature = "metadata"), not(feature = "visitor")),
allow(unused_variables)
)]
pub fn new(
options: &crate::options::ConversionOptions,
inline_collector: Option<InlineCollectorHandle>,
#[cfg(feature = "metadata")] metadata_collector: Option<crate::metadata::MetadataCollectorHandle>,
#[cfg(not(feature = "metadata"))] _metadata_collector: Option<()>,
#[cfg(feature = "visitor")] visitor: Option<crate::visitor::VisitorHandle>,
#[cfg(not(feature = "visitor"))] _visitor: Option<()>,
structure_collector: Option<StructureCollectorHandle>,
reference_collector: Option<ReferenceCollectorHandle>,
) -> Self {
#[cfg(feature = "metadata")]
let (
metadata_wants_document,
metadata_wants_headers,
metadata_wants_links,
metadata_wants_images,
metadata_wants_structured_data,
) = if let Some(ref collector) = metadata_collector {
let guard = collector.borrow();
(
guard.wants_document(),
guard.wants_headers(),
guard.wants_links(),
guard.wants_images(),
guard.wants_structured_data(),
)
} else {
(false, false, false, false, false)
};
Self {
in_code: false,
list_counter: 0,
in_ordered_list: false,
blockquote_depth: 0,
in_table_cell: false,
convert_as_inline: options.convert_as_inline,
inline_depth: 0,
in_list_item: false,
list_depth: 0,
ul_depth: 0,
in_list: false,
loose_list: false,
prev_item_had_blocks: false,
in_heading: false,
heading_allow_inline_images: false,
in_paragraph: false,
block_content_start: 0,
in_ruby: false,
in_strong: false,
in_link: false,
strip_tags: Rc::new(options.strip_tags.iter().cloned().collect()),
preserve_tags: Rc::new(options.preserve_tags.iter().cloned().collect()),
keep_inline_images_in: Rc::new(options.keep_inline_images_in.iter().cloned().collect()),
excluded_node_ids: Rc::new(HashSet::new()),
#[cfg(feature = "inline-images")]
inline_collector,
#[cfg(feature = "metadata")]
metadata_collector,
#[cfg(feature = "metadata")]
metadata_wants_document,
#[cfg(feature = "metadata")]
metadata_wants_headers,
#[cfg(feature = "metadata")]
metadata_wants_links,
#[cfg(feature = "metadata")]
metadata_wants_images,
#[cfg(feature = "metadata")]
metadata_wants_structured_data,
#[cfg(feature = "visitor")]
visitor: visitor.clone(),
#[cfg(feature = "visitor")]
visitor_error: Rc::new(RefCell::new(None)),
structure_collector,
reference_collector,
}
}
}