Skip to content

Commit

Permalink
Use favicon as icon for Twitter preview (ordinals#1425)
Browse files Browse the repository at this point in the history
  • Loading branch information
raphjaph authored Jan 31, 2023
1 parent bbe4fdf commit b2d2562
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 43 deletions.
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ mod media;
mod object;
mod options;
mod outgoing;
mod page_config;
mod rarity;
mod representation;
mod sat;
Expand Down
7 changes: 7 additions & 0 deletions src/page_config.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
use super::*;

#[derive(Clone)]
pub(crate) struct PageConfig {
pub(crate) chain: Chain,
pub(crate) domain: Option<String>,
}
64 changes: 35 additions & 29 deletions src/subcommand/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use {
error::{OptionExt, ServerError, ServerResult},
},
super::*,
crate::page_config::PageConfig,
crate::templates::{
BlockHtml, ClockSvg, HomeHtml, InputHtml, InscriptionHtml, InscriptionsHtml, OutputHtml,
PageContent, PageHtml, PreviewAudioHtml, PreviewImageHtml, PreviewPdfHtml, PreviewTextHtml,
Expand Down Expand Up @@ -134,6 +135,12 @@ impl Server {
});

let config = options.load_config()?;
let acme_domains = self.acme_domains()?;

let page_config = Arc::new(PageConfig {
chain: options.chain(),
domain: acme_domains.first().cloned(),
});

let router = Router::new()
.route("/", get(Self::home))
Expand Down Expand Up @@ -162,7 +169,7 @@ impl Server {
.route("/status", get(Self::status))
.route("/tx/:txid", get(Self::transaction))
.layer(Extension(index))
.layer(Extension(options.chain()))
.layer(Extension(page_config))
.layer(Extension(Arc::new(config)))
.layer(SetResponseHeaderLayer::if_not_present(
header::CONTENT_SECURITY_POLICY,
Expand Down Expand Up @@ -197,8 +204,6 @@ impl Server {
}
(Some(http_port), Some(https_port)) => {
let http_spawn_config = if self.redirect_http_to_https {
let acme_domains = self.acme_domains()?;

SpawnConfig::Redirect(if https_port == 443 {
format!("https://{}", acme_domains[0])
} else {
Expand Down Expand Up @@ -364,7 +369,7 @@ impl Server {
}

async fn sat(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
Path(DeserializeFromStr(sat)): Path<DeserializeFromStr<Sat>>,
) -> ServerResult<PageHtml<SatHtml>> {
Expand All @@ -377,7 +382,7 @@ impl Server {
blocktime: index.blocktime(sat.height())?,
inscription: index.get_inscription_id_by_sat(sat)?,
}
.page(chain, index.has_sat_index()?),
.page(page_config, index.has_sat_index()?),
)
}

Expand All @@ -386,7 +391,7 @@ impl Server {
}

async fn output(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
Path(outpoint): Path<OutPoint>,
) -> ServerResult<PageHtml<OutputHtml>> {
Expand Down Expand Up @@ -426,15 +431,15 @@ impl Server {
outpoint,
inscriptions,
list,
chain,
chain: page_config.chain,
output,
}
.page(chain, index.has_sat_index()?),
.page(page_config, index.has_sat_index()?),
)
}

async fn range(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
Path((DeserializeFromStr(start), DeserializeFromStr(end))): Path<(
DeserializeFromStr<Sat>,
Expand All @@ -446,7 +451,7 @@ impl Server {
Ordering::Greater => Err(ServerError::BadRequest(
"range start greater than range end".to_string(),
)),
Ordering::Less => Ok(RangeHtml { start, end }.page(chain, index.has_sat_index()?)),
Ordering::Less => Ok(RangeHtml { start, end }.page(page_config, index.has_sat_index()?)),
}
}

Expand All @@ -459,12 +464,12 @@ impl Server {
}

async fn home(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
) -> ServerResult<PageHtml<HomeHtml>> {
Ok(
HomeHtml::new(index.blocks(100)?, index.get_homepage_inscriptions()?)
.page(chain, index.has_sat_index()?),
.page(page_config, index.has_sat_index()?),
)
}

Expand All @@ -473,7 +478,7 @@ impl Server {
}

async fn block(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
Path(DeserializeFromStr(query)): Path<DeserializeFromStr<BlockQuery>>,
) -> ServerResult<PageHtml<BlockHtml>> {
Expand All @@ -500,13 +505,13 @@ impl Server {

Ok(
BlockHtml::new(block, Height(height), Self::index_height(&index)?)
.page(chain, index.has_sat_index()?),
.page(page_config, index.has_sat_index()?),
)
}

async fn transaction(
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
Extension(chain): Extension<Chain>,
Path(txid): Path<Txid>,
) -> ServerResult<PageHtml<TransactionHtml>> {
let inscription = index.get_inscription_by_id(txid.into())?;
Expand All @@ -520,9 +525,9 @@ impl Server {
.ok_or_not_found(|| format!("transaction {txid}"))?,
blockhash,
inscription.map(|_| txid.into()),
chain,
page_config.chain,
)
.page(chain, index.has_sat_index()?),
.page(page_config, index.has_sat_index()?),
)
}

Expand Down Expand Up @@ -611,11 +616,12 @@ impl Server {
}

async fn feed(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
) -> ServerResult<Response> {
let mut builder = rss::ChannelBuilder::default();

let chain = page_config.chain;
match chain {
Chain::Mainnet => builder.title("Inscriptions"),
_ => builder.title(format!("Inscriptions – {chain:?}")),
Expand Down Expand Up @@ -673,7 +679,7 @@ impl Server {
}

async fn input(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
Path(path): Path<(u64, usize, usize)>,
) -> Result<PageHtml<InputHtml>, ServerError> {
Expand All @@ -695,7 +701,7 @@ impl Server {
.nth(path.2)
.ok_or_not_found(not_found)?;

Ok(InputHtml { path, input }.page(chain, index.has_sat_index()?))
Ok(InputHtml { path, input }.page(page_config, index.has_sat_index()?))
}

async fn faq() -> Redirect {
Expand Down Expand Up @@ -807,7 +813,7 @@ impl Server {
}

async fn inscription(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
Path(inscription_id): Path<InscriptionId>,
) -> ServerResult<PageHtml<InscriptionHtml>> {
Expand Down Expand Up @@ -845,7 +851,7 @@ impl Server {

Ok(
InscriptionHtml {
chain,
chain: page_config.chain,
genesis_fee: entry.fee,
genesis_height: entry.height,
inscription,
Expand All @@ -858,27 +864,27 @@ impl Server {
satpoint,
timestamp: timestamp(entry.timestamp),
}
.page(chain, index.has_sat_index()?),
.page(page_config, index.has_sat_index()?),
)
}

async fn inscriptions(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
) -> ServerResult<PageHtml<InscriptionsHtml>> {
Self::inscriptions_inner(chain, index, None).await
Self::inscriptions_inner(page_config, index, None).await
}

async fn inscriptions_from(
Extension(chain): Extension<Chain>,
Extension(page_config): Extension<Arc<PageConfig>>,
Extension(index): Extension<Arc<Index>>,
Path(from): Path<u64>,
) -> ServerResult<PageHtml<InscriptionsHtml>> {
Self::inscriptions_inner(chain, index, Some(from)).await
Self::inscriptions_inner(page_config, index, Some(from)).await
}

async fn inscriptions_inner(
chain: Chain,
page_config: Arc<PageConfig>,
index: Arc<Index>,
from: Option<u64>,
) -> ServerResult<PageHtml<InscriptionsHtml>> {
Expand All @@ -889,7 +895,7 @@ impl Server {
next,
prev,
}
.page(chain, index.has_sat_index()?),
.page(page_config, index.has_sat_index()?),
)
}

Expand Down
62 changes: 53 additions & 9 deletions src/templates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ pub(crate) use {
inscription::InscriptionHtml,
inscriptions::InscriptionsHtml,
output::OutputHtml,
page_config::PageConfig,
preview::{
PreviewAudioHtml, PreviewImageHtml, PreviewPdfHtml, PreviewTextHtml, PreviewUnknownHtml,
PreviewVideoHtml,
Expand All @@ -35,32 +36,48 @@ mod transaction;

#[derive(Boilerplate)]
pub(crate) struct PageHtml<T: PageContent> {
chain: Chain,
content: T,
has_sat_index: bool,
page_config: Arc<PageConfig>,
}

impl<T> PageHtml<T>
where
T: PageContent,
{
pub(crate) fn new(content: T, chain: Chain, has_sat_index: bool) -> Self {
pub(crate) fn new(content: T, page_config: Arc<PageConfig>, has_sat_index: bool) -> Self {
Self {
content,
has_sat_index,
chain,
page_config,
}
}

fn og_image(&self) -> String {
if let Some(domain) = &self.page_config.domain {
format!("https://{domain}/static/favicon.png")
} else {
"https://ordinals.com/static/favicon.png".into()
}
}

fn superscript(&self) -> String {
if self.page_config.chain == Chain::Mainnet {
"alpha".into()
} else {
self.page_config.chain.to_string()
}
}
}

pub(crate) trait PageContent: Display + 'static {
fn title(&self) -> String;

fn page(self, chain: Chain, has_sat_index: bool) -> PageHtml<Self>
fn page(self, page_config: Arc<PageConfig>, has_sat_index: bool) -> PageHtml<Self>
where
Self: Sized,
{
PageHtml::new(self, chain, has_sat_index)
PageHtml::new(self, page_config, has_sat_index)
}

fn preview_image_url(&self) -> Option<Trusted<String>> {
Expand Down Expand Up @@ -89,13 +106,22 @@ mod tests {
#[test]
fn page() {
assert_regex_match!(
Foo.page(Chain::Mainnet, true),
Foo.page(
Arc::new(PageConfig {
chain: Chain::Mainnet,
domain: Some("signet.ordinals.com".into())
}),
true
),
r"<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<meta name=format-detection content='telephone=no'>
<meta name=viewport content='width=device-width,initial-scale=1.0'>
<meta property=og:title content='Foo'>
<meta property=og:image content='https://signet.ordinals.com/static/favicon.png'>
<meta property=twitter:card content=summary>
<title>Foo</title>
<link rel=alternate href=/feed.xml type=application/rss\+xml title='Inscription RSS Feed'>
<link rel=stylesheet href=/static/index.css>
Expand Down Expand Up @@ -127,23 +153,41 @@ mod tests {
#[test]
fn page_mainnet() {
assert_regex_match!(
Foo.page(Chain::Mainnet, true),
Foo.page(
Arc::new(PageConfig {
chain: Chain::Mainnet,
domain: None
}),
true
),
r".*<nav>\s*<a href=/>Ordinals<sup>alpha</sup></a>.*"
);
}

#[test]
fn page_no_sat_index() {
assert_regex_match!(
Foo.page(Chain::Mainnet, false),
Foo.page(
Arc::new(PageConfig {
chain: Chain::Mainnet,
domain: None
}),
false
),
r".*<nav>\s*<a href=/>Ordinals<sup>alpha</sup></a>.*<a href=/clock>Clock</a>\s*<form action=/search.*",
);
}

#[test]
fn page_signet() {
assert_regex_match!(
Foo.page(Chain::Signet, true),
Foo.page(
Arc::new(PageConfig {
chain: Chain::Signet,
domain: None
}),
true
),
r".*<nav>\s*<a href=/>Ordinals<sup>signet</sup></a>.*"
);
}
Expand Down
Loading

0 comments on commit b2d2562

Please sign in to comment.