aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorLibravatar Titus Wormer <tituswormer@gmail.com>2022-07-18 14:13:43 +0200
committerLibravatar Titus Wormer <tituswormer@gmail.com>2022-07-18 14:13:43 +0200
commit03544cafaa82ba4bd7e0bc3372fc59549a8dc0cc (patch)
tree4e917199d347d9c51c52fb8bdf3bf8606470c8de /src/lib.rs
parentaf05141ad1a3850e273f2992fe3ceb85747f4d62 (diff)
downloadmarkdown-rs-03544cafaa82ba4bd7e0bc3372fc59549a8dc0cc.tar.gz
markdown-rs-03544cafaa82ba4bd7e0bc3372fc59549a8dc0cc.tar.bz2
markdown-rs-03544cafaa82ba4bd7e0bc3372fc59549a8dc0cc.zip
Refactor to move options to `lib/`
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs160
1 files changed, 159 insertions, 1 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 1f49303..ff8e938 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -16,8 +16,166 @@ mod unicode;
mod util;
use crate::compiler::compile;
-pub use crate::compiler::{LineEnding, Options};
use crate::parser::parse;
+use crate::tokenizer::Code;
+
+/// Type of line endings in markdown.
+#[derive(Debug, Clone, PartialEq)]
+pub enum LineEnding {
+ /// Both a carriage return (`\r`) and a line feed (`\n`).
+ ///
+ /// ## Example
+ ///
+ /// ```markdown
+ /// a␍␊
+ /// b
+ /// ```
+ CarriageReturnLineFeed,
+ /// Sole carriage return (`\r`).
+ ///
+ /// ## Example
+ ///
+ /// ```markdown
+ /// a␍
+ /// b
+ /// ```
+ CarriageReturn,
+ /// Sole line feed (`\n`).
+ ///
+ /// ## Example
+ ///
+ /// ```markdown
+ /// a␊
+ /// b
+ /// ```
+ LineFeed,
+}
+
+impl LineEnding {
+ /// Turn the line ending into a [str].
+ fn as_str(&self) -> &str {
+ match self {
+ LineEnding::CarriageReturnLineFeed => "\r\n",
+ LineEnding::CarriageReturn => "\r",
+ LineEnding::LineFeed => "\n",
+ }
+ }
+ /// Turn a [Code] into a line ending.
+ ///
+ /// ## Panics
+ ///
+ /// Panics if `code` is not `\r\n`, `\r`, or `\n`.
+ fn from_code(code: Code) -> LineEnding {
+ match code {
+ Code::CarriageReturnLineFeed => LineEnding::CarriageReturnLineFeed,
+ Code::Char('\r') => LineEnding::CarriageReturn,
+ Code::Char('\n') => LineEnding::LineFeed,
+ _ => unreachable!("invalid code"),
+ }
+ }
+}
+
+/// Configuration (optional).
+#[derive(Default, Debug)]
+pub struct Options {
+ /// Whether to allow (dangerous) HTML.
+ /// The default is `false`, you can turn it on to `true` for trusted
+ /// content.
+ ///
+ /// ## Examples
+ ///
+ /// ```rust
+ /// use micromark::{micromark, micromark_with_options, Options};
+ ///
+ /// // micromark is safe by default:
+ /// assert_eq!(
+ /// micromark("Hi, <i>venus</i>!"),
+ /// "<p>Hi, &lt;i&gt;venus&lt;/i&gt;!</p>"
+ /// );
+ ///
+ /// // Turn `allow_dangerous_html` on to allow potentially dangerous HTML:
+ /// assert_eq!(
+ /// micromark_with_options(
+ /// "Hi, <i>venus</i>!",
+ /// &Options {
+ /// allow_dangerous_html: true,
+ /// allow_dangerous_protocol: false,
+ /// default_line_ending: None,
+ /// }
+ /// ),
+ /// "<p>Hi, <i>venus</i>!</p>"
+ /// );
+ /// ```
+ pub allow_dangerous_html: bool,
+
+ /// Whether to allow (dangerous) protocols in links and images.
+ /// The default is `false`, you can turn it on to `true` for trusted
+ /// content.
+ ///
+ /// ## Examples
+ ///
+ /// ```rust
+ /// use micromark::{micromark, micromark_with_options, Options};
+ ///
+ /// // micromark is safe by default:
+ /// assert_eq!(
+ /// micromark("<javascript:alert(1)>"),
+ /// "<p><a href=\"\">javascript:alert(1)</a></p>"
+ /// );
+ ///
+ /// // Turn `allow_dangerous_protocol` on to allow potentially dangerous protocols:
+ /// assert_eq!(
+ /// micromark_with_options(
+ /// "<javascript:alert(1)>",
+ /// &Options {
+ /// allow_dangerous_html: false,
+ /// allow_dangerous_protocol: true,
+ /// default_line_ending: None,
+ /// }
+ /// ),
+ /// "<p><a href=\"javascript:alert(1)\">javascript:alert(1)</a></p>"
+ /// );
+ /// ```
+ pub allow_dangerous_protocol: bool,
+
+ /// Default line ending to use, for line endings not in `value`.
+ ///
+ /// Generally, micromark copies line endings (`\r`, `\n`, `\r\n`) in the
+ /// markdown document over to the compiled HTML.
+ /// In some cases, such as `> a`, CommonMark requires that extra line
+ /// endings are added: `<blockquote>\n<p>a</p>\n</blockquote>`.
+ ///
+ /// To create that line ending, the document is checked for the first line
+ /// ending that is used.
+ /// If there is no line ending, `default_line_ending` is used.
+ /// If that isn’t configured, `\n` is used.
+ ///
+ /// ## Examples
+ ///
+ /// ```rust
+ /// use micromark::{micromark, micromark_with_options, Options, LineEnding};
+ ///
+ /// // micromark uses `\n` by default:
+ /// assert_eq!(
+ /// micromark("> a"),
+ /// "<blockquote>\n<p>a</p>\n</blockquote>"
+ /// );
+ ///
+ /// // Define `default_line_ending` to configure the default:
+ /// assert_eq!(
+ /// micromark_with_options(
+ /// "> a",
+ /// &Options {
+ /// allow_dangerous_html: false,
+ /// allow_dangerous_protocol: false,
+ /// default_line_ending: Some(LineEnding::CarriageReturnLineFeed),
+ /// }
+ /// ),
+ /// "<blockquote>\r\n<p>a</p>\r\n</blockquote>"
+ /// );
+ /// ```
+ pub default_line_ending: Option<LineEnding>,
+}
/// Turn markdown into HTML.
///