From eb79cf8cab1afa95517296d686b2d99d363064d4 Mon Sep 17 00:00:00 2001 From: liquidev Date: Mon, 28 Aug 2023 15:30:15 +0200 Subject: [PATCH] add support for crlf, add support for changing port --- .gitattributes | 1 + README.md | 4 ++-- crates/treehouse-format/src/pull.rs | 28 ++++++++++++++++++++++++---- crates/treehouse/src/cli/generate.rs | 6 +++--- crates/treehouse/src/cli/mod.rs | 4 ++-- crates/treehouse/src/main.rs | 4 ++-- 6 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..be4ce1d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.tree text=auto eol=lf diff --git a/README.md b/README.md index 3a42f7c..d188f38 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,10 @@ cargo run -p treehouse generate This will spit out a directory `target/site` containing the static pages. You're free to use any HTTP server you wish, but for development purposes treehouse includes one in the CLI: ```sh -cargo run -p treehouse generate --serve +cargo run -p treehouse generate --serve 8080 ``` -This will fire up a server on port 8080. No way to change that, sorry. Edit the source code. +This will fire up a server on port 8080. If you're developing, you may wanna use [`cargo-watch`](https://crates.io/crates/cargo-watch): diff --git a/crates/treehouse-format/src/pull.rs b/crates/treehouse-format/src/pull.rs index 0060b73..a8c7ea1 100644 --- a/crates/treehouse-format/src/pull.rs +++ b/crates/treehouse-format/src/pull.rs @@ -81,6 +81,26 @@ impl<'a> Parser<'a> { self.advance(); } + fn eat_until_line_break(&mut self) { + loop { + match self.current() { + Some('\r') => { + self.advance(); + if self.current() == Some('\n') { + self.advance(); + break; + } + } + Some('\n') => { + self.advance(); + break; + } + Some(_) => self.advance(), + None => break, + } + } + } + pub fn peek_indent_level(&mut self) -> usize { let position = self.position; let indent_level = self.eat_as_long_as(' '); @@ -101,10 +121,10 @@ impl<'a> Parser<'a> { if self.current_starts_with("```") { code_block = None; self.position += 3; - self.eat_until(|c| c == '\n'); + self.eat_until_line_break(); continue; } - self.eat_until(|c| c == '\n'); + self.eat_until_line_break(); if self.current().is_none() { return Err(ParseErrorKind::UnterminatedCodeBlock.at(range.clone())); @@ -117,14 +137,14 @@ impl<'a> Parser<'a> { continue; } - self.eat_until(|c| c == '\n'); + self.eat_until_line_break(); let before_indentation = self.position; let line_indent_level = self.eat_as_long_as(' '); let after_indentation = self.position; if self.current().map(&cond).is_some_and(identity) || self.current().is_none() { self.position = before_indentation; break; - } else if !matches!(self.current(), Some('\n')) && line_indent_level < indent_level + } else if !matches!(self.current(), Some('\n') | Some('\r')) && line_indent_level < indent_level { return Err(ParseErrorKind::InconsistentIndentation { got: line_indent_level, diff --git a/crates/treehouse/src/cli/generate.rs b/crates/treehouse/src/cli/generate.rs index 7295349..2ebff7b 100644 --- a/crates/treehouse/src/cli/generate.rs +++ b/crates/treehouse/src/cli/generate.rs @@ -249,14 +249,14 @@ pub fn regenerate_or_report_error(paths: &Paths<'_>) { } } -pub async fn web_server() -> anyhow::Result<()> { +pub async fn web_server(port: u16) -> anyhow::Result<()> { let app = Router::new().nest_service("/", ServeDir::new("target/site")); #[cfg(debug_assertions)] let app = app.layer(LiveReloadLayer::new()); - info!("serving on port 8080"); - Ok(axum::Server::bind(&([0, 0, 0, 0], 8080).into()) + info!("serving on port {port}"); + Ok(axum::Server::bind(&([0, 0, 0, 0], port).into()) .serve(app.into_make_service()) .await?) } diff --git a/crates/treehouse/src/cli/mod.rs b/crates/treehouse/src/cli/mod.rs index 5970a7d..c0fd3d4 100644 --- a/crates/treehouse/src/cli/mod.rs +++ b/crates/treehouse/src/cli/mod.rs @@ -28,9 +28,9 @@ pub enum Command { #[derive(Args)] pub struct GenerateArgs { - /// Start a web server serving the static files. Useful with `cargo watch`. + /// Start a web server serving the static files on the given port. Useful with `cargo watch`. #[clap(short, long)] - pub serve: bool, + pub serve: Option, } #[derive(Args)] diff --git a/crates/treehouse/src/main.rs b/crates/treehouse/src/main.rs index a398b12..f73736f 100644 --- a/crates/treehouse/src/main.rs +++ b/crates/treehouse/src/main.rs @@ -35,8 +35,8 @@ async fn fallible_main() -> anyhow::Result<()> { regenerate_or_report_error(&paths); - if regenerate_args.serve { - generate::web_server().await?; + if let Some(port) = regenerate_args.serve { + generate::web_server(port).await?; } }