Google Apps脚本:模板化HTML scriptlet中的换行符

时间:2015-02-14 01:23:24

标签: google-apps-script

如果我有一个HTML文件test.html:

<p><?= str ?></p>

脚本功能:

var t = HtmlService.createTemplateFromFile("test.html");
t.str = "test\nstring";
var content = t.evaluate().setSandboxMode(...).getContent();
Logger.log(content);

有没有办法用HTML换行符安全地替换换行符?我可以使用String.prototype.replace()将\n替换为<br/>,但是我必须使用<?!=来禁用HTML模板引擎的上下文逃跑。我处理不受信任的输入,所以我需要转义和智能处理换行符。在上下文中使用它会很好。事实上,我编写了自己的escaper,但它只适用于一个上下文。

3 个答案:

答案 0 :(得分:5)

我为您的场景看到两个选项,简单的选择是完全忘记替换并使用&lt; pre&gt;标记,它将呈现您的换行符(和其他格式字符)

<pre> <?= str ?> </pre>

第二种是使用自定义函数执行替换和清理输入,以便您可以安全地使用强制打印scriptlet。

在你的HTML中:

<?!= sanitize(str); ?>

和你的.gs:

function sanitize(val){ var vals = val.split('\n'); //split string into an array on newlines for(var i in vals){ vals[i] = Encoder.htmlEncode(vals[i]); //sanitize each element in the array } return vals.join('<br />'); //join the elements as a string, with <br /> as glue. }

请注意,在我的示例中,我使用此处的库来清理字符串:http://www.strictly-software.com/scripts/downloads/encoder.js

答案 1 :(得分:1)

如果有人好奇,这就是我用来清理不受信任的显示输入的代码。在标签,脚本部分等中使用它是不安全的。这就是为什么谷歌的情境感知清理是如此方便。

function dumbEscapeAndBreak(str) {
  return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br/>');
}

function _testEscape() {
  GSUnit.assertEquals('my&lt;test&lt;string&gt;is&gt;not&amp;good&amp;okay<br/>fine<br/>okay', dumbEscapeAndBreak("my<test<string>is>not&good&okay\nfine\nokay"));
}

答案 2 :(得分:0)

或者你可以这样做:

在.gs脚本函数中:

var t = HtmlService.createTemplateFromFile("test.html");
var paragraphs = "test\nstring";
t.str = paragraphs.split("\n");

在您的test.html中:

<?
for (i = 0; i < str.length; i++) {
?>
   <span><?= str[i]?></span><br />
   <!-- <p><?= str[i]?></p> -->
<?
}
?>

您可以使用由您自己决定的<span><p>标记。您还可以编写一些简单的逻辑来决定何时放置<br />,例如在<span>之前的i > 0之前。这将完全符合您的"test\nstring"