Merge pull request #1714 from joshrotenberg/draft-no-index
Check for the index.html file before trying to opener::open it
This commit is contained in:
commit
f8782666ba
|
@ -1,7 +1,8 @@
|
||||||
use crate::{get_book_dir, open};
|
use crate::{first_chapter, get_book_dir, open};
|
||||||
use clap::{arg, App, Arg, ArgMatches};
|
use clap::{arg, App, Arg, ArgMatches};
|
||||||
use mdbook::errors::Result;
|
use mdbook::errors::Result;
|
||||||
use mdbook::MDBook;
|
use mdbook::MDBook;
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
// Create clap subcommand arguments
|
// Create clap subcommand arguments
|
||||||
pub fn make_subcommand<'help>() -> App<'help> {
|
pub fn make_subcommand<'help>() -> App<'help> {
|
||||||
|
@ -38,7 +39,15 @@ pub fn execute(args: &ArgMatches) -> Result<()> {
|
||||||
|
|
||||||
if args.is_present("open") {
|
if args.is_present("open") {
|
||||||
// FIXME: What's the right behaviour if we don't use the HTML renderer?
|
// FIXME: What's the right behaviour if we don't use the HTML renderer?
|
||||||
open(book.build_dir_for("html").join("index.html"));
|
match first_chapter(&book)
|
||||||
|
.map(|path| book.build_dir_for("html").join(path).with_extension("html"))
|
||||||
|
{
|
||||||
|
Some(path) if Path::new(&path).exists() => open(path),
|
||||||
|
_ => {
|
||||||
|
error!("No chapter available to open");
|
||||||
|
std::process::exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#[cfg(feature = "watch")]
|
#[cfg(feature = "watch")]
|
||||||
use super::watch;
|
use super::watch;
|
||||||
use crate::{get_book_dir, open};
|
use crate::{first_chapter, get_book_dir, open};
|
||||||
use clap::{arg, App, Arg, ArgMatches};
|
use clap::{arg, App, Arg, ArgMatches};
|
||||||
use futures_util::sink::SinkExt;
|
use futures_util::sink::SinkExt;
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
|
@ -102,10 +102,12 @@ pub fn execute(args: &ArgMatches) -> Result<()> {
|
||||||
serve(build_dir, sockaddr, reload_tx, &file_404);
|
serve(build_dir, sockaddr, reload_tx, &file_404);
|
||||||
});
|
});
|
||||||
|
|
||||||
let serving_url = format!("http://{}", address);
|
|
||||||
info!("Serving on: {}", serving_url);
|
|
||||||
|
|
||||||
if open_browser {
|
if open_browser {
|
||||||
|
let serving_url = match first_chapter(&book).map(|path| path.with_extension("html")) {
|
||||||
|
Some(path) => format!("http://{}/{}", address, path.display()),
|
||||||
|
_ => format!("http://{}", address),
|
||||||
|
};
|
||||||
|
info!("Serving on: {}", serving_url);
|
||||||
open(serving_url);
|
open(serving_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::first_chapter;
|
||||||
use crate::{get_book_dir, open};
|
use crate::{get_book_dir, open};
|
||||||
use clap::{arg, App, Arg, ArgMatches};
|
use clap::{arg, App, Arg, ArgMatches};
|
||||||
use mdbook::errors::Result;
|
use mdbook::errors::Result;
|
||||||
|
@ -45,7 +46,12 @@ pub fn execute(args: &ArgMatches) -> Result<()> {
|
||||||
|
|
||||||
if args.is_present("open") {
|
if args.is_present("open") {
|
||||||
book.build()?;
|
book.build()?;
|
||||||
open(book.build_dir_for("html").join("index.html"));
|
match first_chapter(&book)
|
||||||
|
.map(|path| book.build_dir_for("html").join(path).with_extension("html"))
|
||||||
|
{
|
||||||
|
Some(path) if Path::new(&path).exists() => open(path),
|
||||||
|
_ => warn!("No chapter available to open"),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trigger_on_change(&book, |paths, book_dir| {
|
trigger_on_change(&book, |paths, book_dir| {
|
||||||
|
|
14
src/main.rs
14
src/main.rs
|
@ -9,7 +9,10 @@ use clap::{App, AppSettings, Arg, ArgMatches};
|
||||||
use clap_complete::Shell;
|
use clap_complete::Shell;
|
||||||
use env_logger::Builder;
|
use env_logger::Builder;
|
||||||
use log::LevelFilter;
|
use log::LevelFilter;
|
||||||
|
use mdbook::book::Chapter;
|
||||||
use mdbook::utils;
|
use mdbook::utils;
|
||||||
|
use mdbook::BookItem;
|
||||||
|
use mdbook::MDBook;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
@ -137,6 +140,17 @@ fn get_book_dir(args: &ArgMatches) -> PathBuf {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the first displayable chapter of the given book, or None if no displayable
|
||||||
|
// chapter is found (i.e. only drafts).
|
||||||
|
fn first_chapter(book: &MDBook) -> Option<&PathBuf> {
|
||||||
|
book.iter().find_map(|item| match item {
|
||||||
|
BookItem::Chapter(Chapter {
|
||||||
|
path: Some(path), ..
|
||||||
|
}) => Some(path),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn open<P: AsRef<OsStr>>(path: P) {
|
fn open<P: AsRef<OsStr>>(path: P) {
|
||||||
info!("Opening web browser");
|
info!("Opening web browser");
|
||||||
if let Err(e) = opener::open(path) {
|
if let Err(e) = opener::open(path) {
|
||||||
|
|
Loading…
Reference in New Issue