sub
generate_from_tokens {
my
(
$class
,
@tokens
) =
@_
;
my
(
$open_delimiter
,
$close_delimiter
) =
do
{
my
$token
=
shift
@tokens
;
die
'first token must be delimiter'
if
$token
->[0] != TOKEN_DELIMITER;
@$token
[3,4];
};
my
$buf
=
''
;
for
my
$token
(
@tokens
) {
my
(
$type
) =
@$token
;
if
(
$type
== TOKEN_RAW_TEXT) {
my
(
undef
,
undef
,
$text
) =
@$token
;
$buf
.=
$text
;
}
elsif
(
$type
== TOKEN_PADDING) {
my
(
undef
,
undef
,
$padding
) =
@$token
;
$buf
.=
$padding
;
}
elsif
(
$type
== TOKEN_TAG) {
if
(
@$token
== 3) {
my
(
undef
,
undef
,
$body
) =
@$token
;
$buf
.=
$open_delimiter
.
$body
.
$close_delimiter
;
}
elsif
(
@$token
== 4) {
my
(
undef
,
undef
,
$tag_type
,
$body
) =
@$token
;
$buf
.=
$open_delimiter
.
$tag_type
.
$body
;
$buf
.=
'}'
if
$tag_type
eq
'{'
;
$buf
.=
$close_delimiter
;
}
else
{
die
"Unknown tag token size: "
.
scalar
(
@$token
);
}
}
elsif
(
$type
== TOKEN_DELIMITER) {
my
(
undef
,
undef
,
$body
,
$new_open_delimiter
,
$new_close_delimiter
) =
@$token
;
$buf
.=
$open_delimiter
.
'='
.
$body
.
'='
.
$close_delimiter
;
(
$open_delimiter
,
$close_delimiter
) = (
$new_open_delimiter
,
$new_close_delimiter
);
}
else
{
die
"Unknown token type: $type"
;
}
}
return
$buf
;
}
1;