-
Notifications
You must be signed in to change notification settings - Fork 19
/
delim.R
94 lines (78 loc) · 2.34 KB
/
delim.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
ALTDELIM <- "~~~~~~~~~~~~~ ~~~~~~~~~~~~~"
#' change a delimiter tag into two escaped characters
#'
#' @param tag character with delimiter tag seperated with a space
#' @param tag character with delimiter tag seperated with a space
#' @keywords internal
tag2delim <- function(tag="{{ }}", escape=TRUE){
delim <- strsplit(tag," ")[[1]]
if (escape)
gsub("([[{}*?+])", "\\\\\\1", delim)
else
delim
}
#' Split a character in three parts
#'
#' It differs from strsplit in that it only splits on the first occurrence
#' and returns all parts of the string given
#' @param x character text to be split
#' @param pattern pattern used for splitting
#' @keywords internal
rxsplit <- function(x, pattern){
matched <- regexpr(pattern, x)
if (matched == -1){
return(x)
}
ml <- attr(matched, "match.length")
c( substring(x,1,matched-1)
, substring(x,matched, matched+ml-1)
, substring(x, matched + ml)
)
}
#' enclose a key with delimiters
#'
#' @param x character with delimiter seperated with a space
#' @param delim character vector with escaped delimiters
#' @keywords internal
delimit <- function(x, delim=tag2delim()){
paste(delim[1], x, delim[2], sep="")
}
replace_delim_tags <- function(template){
text <- list()
defdelim <- tag2delim()
altdelim <- tag2delim(ALTDELIM, escape=FALSE)
defkeytag <- delimit("(.+?)", defdelim)
altkeytag <- delimit("\\1", altdelim)
tag <- "{{ }}"
while (!is.na(template)){
delim <- tag2delim(tag)
delimtag <- delimit(DELIM, delim)
keytag <- delimit("(.+?)", delim)
rx <- rxsplit(template, delimtag)
txt <- rx[1]
if (tag != "{{ }}"){
txt <- gsub(defkeytag, altkeytag, txt)
}
txt <- gsub(keytag, "{{\\1}}", txt)
text[length(text)+1] <- txt
tag <- sub(delimtag, "\\1", rx[2])
template <- rx[3]
}
#print(text)
paste(text, collapse="")
}
literal_tags <- function(txt){
altdelim <- tag2delim(ALTDELIM)
defdelim <- tag2delim("{{ }}", escape=FALSE)
altkeytag <- delimit("(.+?)", altdelim)
defkeytag <- delimit("\\1", defdelim)
gsub(altkeytag, defkeytag, txt)
}
### quick testing
#delim2rx("<% %>")
# template <- "test {{=<% %>}} <%key%> {{key1}} <%=[[ ]]%> bla, [[key2]] [[={{ }}]] {{key3}} 1, 2, 3"
#rxsplit(template, delimtag)
# r <- replace_delim_tags(template)
# r
# literal_tags(r)
#replace_delim_tags(template)