Nothing
w3c.colors <- list(
aqua = "#00FFFF" ,
black = "#000000" ,
blue = "#0000FF" ,
fuchsia = "#FF00FF" ,
gray = "#808080" ,
green = "#008000" ,
lime = "#00FF00" ,
maroon = "#800000" ,
navy = "#000080" ,
olive = "#808000" ,
purple = "#800080" ,
red = "#FF0000" ,
silver = "#C0C0C0" ,
teal = "#008080" ,
white = "#FFFFFF" ,
yellow = "#FFFF00"
)
css.parse.color <- function( txt, default = "#000000" ){
txt <- gsub( "\\s+", "", casefold( txt ), perl = TRUE )
if( is.hex( txt ) ) return(txt)
# css specs are from 0 to 255
rgb <- function( ... ){
grDevices::rgb( ..., maxColorValue = 255 )
}
# first we try to match against w3c standard colors
if( !grepl( "[^a-z]", txt) ){
if( txt %in% names(w3c.colors) ) {
return( w3c.colors[[txt]] )
}
}
# now we try R colors
if( !grepl( "[^a-z0-9]", txt) ){
R.colors <- colors()
res <- R.colors %in% txt
if( any( res ) ) {
return( rgb( t(col2rgb( R.colors[res] )) ) )
}
}
# next we try an rgb() specification
if( grepl( "rgb", txt ) ){
p <- try( parse( text = txt), silent = TRUE )
if( !inherits( p, "try-error" ) ){
res <- try( eval( p, envir = environment() ), silent = T )
if( !inherits( res, "try-error" ) ) return(res)
}
}
# fall back on the default color
default
}
is.hex <- function( x ){
grepl( "^#[0-9a-f]{6}$", x )
}
# this is placeholder at the moment
css.parse.font_weight <- function ( txt ){
txt
}
css.parse.font_style <- function(txt){
txt
}
css.parse.text_decoration <- function ( txt ){
txt
}
#' Minimal CSS parser
#'
#' @param file file to parse
#' @param lines text lines to parse
#'
#' @return A list with one element per style class declaration. Each element
#' is a list which has one element per CSS setting
#' (\samp{color}, \samp{background}, ...)
#'
#' @note
#' The parser is very minimal and will only identify CSS declarations like
#' the following :
#'
#' \preformatted{
#' .classname{
#' setting1 : value ;
#' setting2 : value ;
#' } }
#'
#' The line where a declaration occurs must start with a dot,
#' followed by the name of the class and a left brace. The declaration
#' ends with the first line that starts with a right brace. The function
#' will warn about class names containing numbers as this is likely to
#' cause trouble when the parsed style is translated into another
#' language (e.g. latex commands).
#'
#' Within the css declaration, the parser identifies setting/value
#' pairs separated by \samp{:} on a single line. Each setting must
#' be on a seperate line.
#'
#' If the setting is \samp{color} or \samp{background}, the parser then
#' tries to map the value to a hex color specification
#' by trying the following options: the value is already a hex
#' color, the name of the color is one of the 16 w3c standard colors, the name
#' is an R color (see \code{\link[grDevices]{colors}}), the
#' color is specified as \samp{rgb(r,g,b)}. If all fails, the
#' color used is black for the \samp{color} setting and
#' \samp{white} for the \samp{background} setting.
#'
#' Other settings are not further parsed at present.
#'
#' @export
css.parser <- function( file, lines = readLines( file ) ){
rx <- "^\\.(.*?) *\\{.*$"
dec.lines <- grep( rx, lines )
dec.names <- sub( rx, "\\1", lines[dec.lines] )
if( any( grepl( "[0-9]", dec.names) ) ){
warning( "use of numbers in style names" )
}
end.rx <- "^[[:space:]]*\\}"
end.lines <- grep( end.rx, lines )
# find the closing brace of each declaration
dec.close <- end.lines[ sapply( dec.lines, function( x ) which.min( end.lines < x ) ) ]
pos <- matrix( c(dec.lines, dec.close), ncol = 2 )
styles <- apply( pos, 1, function( x ) {
data <- lines[ (x[1]+1) : (x[2]-1) ]
settings.rx <- "^\\s*(.*?)\\s*:\\s*(.*?)\\s*;\\s*$"
settings <- sub( settings.rx, "\\1", data , perl = TRUE)
contents <- sub( settings.rx, "\\2", data , perl = TRUE)
out <- list()
for( i in 1:length(settings) ){
setting <- settings[i]
content <- contents[i]
out[[ setting ]] <- switch( setting,
"color" = css.parse.color( content, "#000000" ),
"background" = css.parse.color( content, "#FFFFFF" ),
"font-weight" = css.parse.font_weight( content ),
"font-style" = css.parse.font_style( content ),
"text-decoration" = css.parse.text_decoration( content ),
content )
}
out
} )
names( styles ) <- dec.names
styles
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.