Breaking change: epoxy_latex()
and
the epoxy_latex
chunk engine it powers now use
<<
and >>
to delimit inline
expressions. Where you previously may have used
<expr>
, please now use
<<expr>>
. This breaking change was necessary to
allow the expr
to include common R operators like
<
and >
. (#107)
Breaking change: the whisker
engine
is now powered by epoxy_mustache()
, resulting in a few
small changes. In particular, if you previously used a list for the
.data
chunk option in a whisker
chunk, and
relied on the whisker
engine’s special treatment of lists
to iterate over their items, you’ll need to specifically opt into this
behavior by adding a .vectorized = TRUE
chunk option.
This chunk engine still vectorizes over rows in a data frame by default, where it’s much more likely to be the behavior you want, but bare lists require specifically opting in. (#103)
.data
is now the preferred chunk option for passing
data frames or lists of data to epoxy chunks, where previously
data
was used in some places. It works in
whisker
and epoxy
chunks, and is more
consistent with the .data
argument of glue()
and epoxy()
. (#102)
New epoxy_mustache()
provides an epoxy-style
interface to the mustache
templating language, using the whisker package.
This function also now powers the whisker
or
mustache
knitr engines. epoxy
also now
provides aliases for whisker and mustache in all places, so you can use
whichever name resonates with you. (#103)
New epoxy_use_chunk()
and
epoxy_use_file()
allow you to re-use an
epoxy()
, epoxy_html()
or other epoxy-provided
knitr chunk or file as a template. epoxy_use_chunk()
lets
you re-use a template chunk with new data, and
epoxy_use_file()
lets you repeatedly use a template stored
in a file. Both functions also re-use the options from the template
chunk or the options set in the YAML from matter of the template file.
See ?epoxy_use
for more details about how options for both
functions are determined. (#106, #116)
epoxy()
now adds a .data
pronoun that
allows you to refer to the list or data frame passed into either the
.data
argument of epoxy()
or the
data
or .data
chunk options. (#100)
epoxy_html()
now supports inline transformations
prefixed with @
instead of .
,
e.g. @strong
instead of .strong
. Previously,
you would have to place the inline transformer in a nested
{{ }}
block, e.g. {{ {{ .strong expr }} }}
,
but now you only need {{@strong expr}}
. To combine the HTML
transformer (epoxy_transform_html()
) with the inline
transformer, you still need to nest:
{{.text-muted {{@strong expr}}}}
creates
<span class="text-muted"><strong>{expr}</strong></span>
.
(#120)
epoxy()
, and by extension the LaTex and HTML
counterparts, and all epoxy_*
knitr engines gain a
.collapse
argument to determine how a vector of
epoxy-transformed templates should be collapsed. The default is
NULL
, which means that the output is returned as a vector.
This argument is also useful in epoxy_use_chunk()
and for
knitr chunks being used as a vectorized template. (#115)
Aded .sentence
(alias .sc
) to the list
of inline transformers provided by
epoxy_transform_inline()
. This transformer will capitalize
the first letter of the first word in the expression. This is useful
when you want to need to start a sentence with a variable that may
contain more than one word. (#112)
The .titlecase
inline transformer now coerces inputs
to character with as.character()
before applying
tools::toTitleCase()
, since toTitleCase()
will
throw an error for non-character inputs. (#112)
epoxy()
, epoxy_html()
,
epoxy_latex()
and epoxy_mustache()
(and their
related knitr engines) will all collect remote tbl_sql
tables before evaluation. This makes it much easier to pass data from a
remote database using {dplyr}
and {dbplyr}
.
(#117)
Fixed an issue with epoxy_inline_transform()
when
used with custom delimiters (#116).
epoxy_transform_html()
now (again) returns a
collapsed character string for inline HTML transformations. This makes
it easier to wrap a vector in individual HTML tags and then slot it into
a parent template. You can still get length-consistent output by setting
collapse = FALSE
, which is most useful when you want the
template around the expression to repeat. (#96)
Fixed an issue with epoxy_transform_set()
that
prevented it from working when
knitr::opts_current$get("engine")
returned an unexpected
value.
This is epoxy’s first release on CRAN! This NEWS file collects changes from versions that were available on GitHub prior to the CRAN release.
epoxy’s knitr engine is now epoxy
and not
glue
. This avoids a name clash with the glue package, which provides a
glue
knitr engine with similar functionality. epoxy also
provides epoxy_html
and epoxy_latex
knitr
engines, although they can still be used via their aliases
glue_html
and glue_latex
. (#21)
The development version of epoxy included, for some time, two features that have changed significantly in this release:
The epoxy_style()
functions were renamed
epoxy_transform()
and the .style
argument was
deprecated in favor of the .transformer
argument. This
change was made to avoid confusion with other meanings of “style”, and
for consistency with glue::glue()
. The
epoxy_style_
prefix is now epoxy_transform_
,
e.g. epoxy_transform_bold()
or
epoxy_transform_collapse()
. (#87)
The previous form of inline formatting –
epoxy_style_format()
– has been removed in favor of
epoxy_transform_inline()
. This new transformer uses
cli-style inline formatting and is enabled by default in
epoxy()
, epoxy_html()
and
epoxy_latex()
(#68).
epoxy_transform_html()
now returns a character
vector rather than a collapsed character string when a template
expression is a vector.
Added a new internal dataset, bechdel
, containing
details for a random sample of ten movies that received a score of
3 on the Bechdel
Test (#24).
epoxy’s transformers can now be chained via
epoxy_transform()
. For example to use both
epoxy_transform_bold()
and
epoxy_transform_collapse()
on all replacement strings, you
can call epoxy_transform("bold", "collapse")
.
epoxy_transform()
accepts a transform function name, e.g.
"collapse"
, the function object directly,
e.g. epoxy_transform_collapse
, or a call to a transform
function, e.g. epoxy_transform_collapse()
(#26).
Values passed to the .transformer
chunk option are
now passed first to epoxy_transform()
, allowing you to
provide a vector of transformer names or a list of functions,
e.g. .transformer = c("bold", "collapse")
. This was
originally introduced using a separate chunk option
epoxy_style
, which is now deprecated (#31, #87).
epoxy
, epoxy_html()
and
epoxy_latex()
are now exported functions that power the
knitr engines and use the same defaults (#46).
The HTML element syntax used in ui_epoxy_html()
is
now available in epoxy_transform_html()
and is used by
default in epoxy_html()
(#46).
The HTML syntax used by ui_epoxy_html()
and
epoxy_html()
now provides a mechanism for differentiating
between HTML-safe and -unsafe content. To mark an expression as
HTML-safe, use !!
before the variable or expression:
e.g. {{ button !!expr }}
(#88).
A new ui_epoxy_markdown()
function provides a way to
create dynamic Shiny UI elements written in Markdown. Rendering from
markdown to HTML is handled using pandoc::pandoc_convert()
if the {pandoc}
package is installed, or otherwise
commonmark::markdown_html()
is used.
New ui_epoxy_mustache()
provides a dynamically
rendered Shiny UI element that uses the mustache templating syntax. The
advantage of mustache templating over ui_epoxy_html()
is
that you have dynamic variables in the template can appear anywhere in
the HTML, not just in the text portion (#51).
ui_epoxy_whisker()
is also provided as an alias for
discoverability/user comfort (#60).epoxyHTML()
and renderEpoxyHTML()
were
renamed ui_epoxy_html()
and render_epoxy()
respectively. This better fits newer Shiny naming conventions and
reflects that render_epoxy()
serves both
ui_epoxy_html()
and ui_epoxy_mustache()
(#56).
Added epoxy_transform_set()
to enable setting the
default .transformer
option for all chunks or epoxy
functions. You can use this function to set the epoxy transformer for
all chunk engines or a subset of chunk engines. Use
epoxy_transform_get()
to retrieve the epoxy transformer for
a particular engine.
You can also use epoxy_transform_set()
to set the inline
transformation functions by matching the syntax used by
epoxy_transform_inline()
. See
?epoxy_transform_set
for an example.
epoxy_transform_inline()
is the default
.transformer
for epoxy()
and
epoxy_latex()
and their related knitr engines.
epoxy_html()
now uses
.transformer = epoxy_transform(c("inline", "html"))
.
Added a new vignette("inline-reporting")
with thanks
to @tjmahr for the inspiration
(#25).
epoxy requires glue >= 1.5.0.
ui_epoxy_html()
will now render elements with IDs
using the #
syntax, e.g.
{{h3#name.author full_name}}
will create an element that is
(essentially)
<h3 id="name" class="author">{{ full_name }}</h3>
(#22).
ui_epoxy_html()
, instead of updating the entire
ui_epoxy_html()
region, now only updates the part of the UI
that has actually changed. If the template variables are only included
in the text portion of the template, you should prefer
ui_epoxy_html()
over ui_epoxy_mustache()
for
this reason – ui_epoxy_mustache()
re-renders the entire
template with every update.
The epoxy transformers for bold, italic and code transformations
now choose the correct syntax for the epoxy
(markdown),
epoxy_html
and epoxy_latex
engines.
Alternatively, you can force the desired syntax by setting the
syntax
option (#28).
epoxy’s knitr engines can now be set manually via the newly
exported (and renamed) use_epoxy_knitr_engines()
. This
function is called when epoxy is loaded, so you most likely do not need
to call it directly. In general, you can instead simply
library(epoxy)
. epoxy previously provided a
glue
chunk rather than an epoxy
chunk and you
can restore this behavior by calling
use_epoxy_glue_engine()
(#30).
A new transformer, epoxy_transform_apply()
, can be
used to globally apply a function to glue expressions.
epoxy_transform_apply()
uses the same syntax as
purrr::map()
for defining the function,
i.e. tolower
or ~ tolower(.x)
(#37).
epoxy_transform_collapse()
now uses the and package, which
provides language-aware conjoining of strings. As a result, the
sep_and
and sep_or
arguments of
epoxy_transform_collapse()
are deprecated and are silently
ignored if provided (#45).
Added engine_pick()
for providing a set of options
where the correct option will be chosen based on the current chunk or
epoxy engine.
Added a whisker
engine that uses the whisker package instead of
glue
.
The chunk option glue_data
was changed to
data
.
The glue_html
engine now uses {{
and
}}
for open/close delimiters.
glue/whisker chunks now accept .envir
chunk option
for the containing environment, otherwise falling back to the
knitr::knit_global()
env.