From 46d30bff0dcd37ac9c75022b8885b14ddb876393 Mon Sep 17 00:00:00 2001 From: sepiropht Date: Thu, 6 Jun 2019 08:19:48 +0200 Subject: [PATCH 1/4] Add empty method for renderContext --- src/render_context.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/render_context.rs b/src/render_context.rs index 34abb63..98ae4a3 100644 --- a/src/render_context.rs +++ b/src/render_context.rs @@ -5,6 +5,7 @@ use crate::{ }; use bumpalo::Bump; use fxhash::FxHashMap; +use std::cell::RefCell; use std::fmt; /// Common context available to all `Render` implementations. @@ -58,6 +59,20 @@ impl<'a> RenderContext<'a> { } } } + /// return an empty rendering context + pub_unstable_internal! { + pub(crate) fn empty() -> Self { + let cached_set = &RefCell::new(CachedSet::default()); + let bump = &Bump::new(); + let templates = &mut FxHashMap::default(); + RenderContext { + bump, + cached_set, + templates, + _non_exhaustive: (), + } + } + } pub(crate) fn cache(&mut self, pinned: bool, template: Option, f: F) -> CacheId where From 1f51170b985b5a120ac8dadf26634bbac8a4810d Mon Sep 17 00:00:00 2001 From: sepiropht Date: Thu, 6 Jun 2019 08:21:01 +0200 Subject: [PATCH 2/4] html_stringify (wip) --- src/node.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/node.rs b/src/node.rs index 1e86b73..cad8506 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,10 +1,13 @@ use crate::{cached_set::CacheId, RootRender, VdomWeak}; +use crate::RenderContext; +use crate::Render; use bumpalo::Bump; use std::fmt; use std::iter; use std::mem; use std::u32; + /// A virtual DOM node. #[derive(Debug, Clone)] pub struct Node<'a> { @@ -269,3 +272,33 @@ impl Listener<'_> { } } } + +pub fn html_string(component: &R) -> String +where + R: Render, +{ + let cx = &mut RenderContext::empty(); + + let node = component.render(cx); + + let mut s = String::new(); + html_string_recursive(cx, &mut s, &node); + return s; + + fn html_string_recursive(cx: &mut RenderContext, s: &mut String, node: &Node) { + match node.kind { + NodeKind::Text(ref t) => s.push_str(t.text), + NodeKind::Element(ref e) => { + s.push_str(e.tag_name); + for c in e.children { + html_string_recursive(cx, s, c); + } + } + NodeKind::Cached(ref c) => { + let (cache_node, _) = cx.cached_set.borrow().get(c.id); + html_string_recursive(cx, s, cache_node); + } + } + } +} + From 7088e37d7c9c7a082e3388a4228fdbe42c0daec8 Mon Sep 17 00:00:00 2001 From: sepiropht Date: Thu, 6 Jun 2019 08:21:01 +0200 Subject: [PATCH 3/4] html_stringify --- src/node.rs | 26 ++++++++++++-------------- src/render_context.rs | 15 +++++++++------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/node.rs b/src/node.rs index cad8506..1acb1ee 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,13 +1,12 @@ -use crate::{cached_set::CacheId, RootRender, VdomWeak}; -use crate::RenderContext; use crate::Render; +use crate::RenderContext; +use crate::{cached_set::CacheId, RootRender, VdomWeak}; use bumpalo::Bump; use std::fmt; use std::iter; use std::mem; use std::u32; - /// A virtual DOM node. #[derive(Debug, Clone)] pub struct Node<'a> { @@ -277,14 +276,6 @@ pub fn html_string(component: &R) -> String where R: Render, { - let cx = &mut RenderContext::empty(); - - let node = component.render(cx); - - let mut s = String::new(); - html_string_recursive(cx, &mut s, &node); - return s; - fn html_string_recursive(cx: &mut RenderContext, s: &mut String, node: &Node) { match node.kind { NodeKind::Text(ref t) => s.push_str(t.text), @@ -293,12 +284,19 @@ where for c in e.children { html_string_recursive(cx, s, c); } + + s.push_str(&format!("", e.tag_name)); } NodeKind::Cached(ref c) => { - let (cache_node, _) = cx.cached_set.borrow().get(c.id); - html_string_recursive(cx, s, cache_node); + html_string_recursive(cx, s, cx.cached_set.borrow().get(c.id).0); } } } -} + RenderContext::empty(|cx| { + let node = component.render(cx); + let mut s = String::new(); + html_string_recursive(cx, &mut s, &node); + s + }) +} diff --git a/src/render_context.rs b/src/render_context.rs index 98ae4a3..57c87b4 100644 --- a/src/render_context.rs +++ b/src/render_context.rs @@ -61,16 +61,19 @@ impl<'a> RenderContext<'a> { } /// return an empty rendering context pub_unstable_internal! { - pub(crate) fn empty() -> Self { - let cached_set = &RefCell::new(CachedSet::default()); - let bump = &Bump::new(); - let templates = &mut FxHashMap::default(); - RenderContext { + pub(crate) fn empty(f: F) -> T + where F: FnOnce(&mut RenderContext) -> T, + { + let cached_set = &RefCell::new(CachedSet::default()); + let bump = &Bump::new(); + let templates = &mut FxHashMap::default(); + + f(&mut RenderContext { bump, cached_set, templates, _non_exhaustive: (), - } + }) } } From 301ab1ce4505fd420ca5fc076fdaefff9dc45fff Mon Sep 17 00:00:00 2001 From: sepiropht Date: Tue, 23 Jul 2019 11:53:27 +0200 Subject: [PATCH 4/4] add test html_string --- tests/web/render.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/web/render.rs b/tests/web/render.rs index 25d97a5..3d9515b 100644 --- a/tests/web/render.rs +++ b/tests/web/render.rs @@ -1,4 +1,4 @@ -use super::{assert_rendered, before_after, create_element, RenderFn}; +use super::{assert_rendered, before_after, create_element, RenderFn, html_string}; use dodrio::{builder::*, Vdom}; use futures::prelude::*; use std::rc::Rc; @@ -10,7 +10,18 @@ fn render_initial_text() { let container = create_element("div"); let _vdom = Vdom::new(&container, hello.clone()); - assert_rendered(&container, &hello); + assert_rendered(container, &hello); +} + +fn render_to_string() { + let hello = Rc::new(RenderFn(|cx| { + div(&cx) + .attr("id", "hello-world") + .children([text("Hello "), span(&cx).child(text("World!")).finish()]) + .finish() + })); + let string_html = html_string(&hello); + assert!(&string_html, "
Hello World!
"); } #[wasm_bindgen_test]