【问题标题】:Google Apps Script: Line breaks in templated HTML scriptletsGoogle Apps 脚本:模板化 HTML scriptlet 中的换行符
【发布时间】:2015-02-14 01:23:23
【问题描述】:

如果我有一个 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 替换为&lt;br/&gt;,但是我必须使用&lt;?!= 来禁用HTML 模板引擎的上下文转义。我正在处理不受信任的输入,因此我需要转义和智能处理换行符。有它的上下文会很好。就目前情况而言,我编写了自己的转义器,但它只适用于一种情况。

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    我看到您的场景有两个选项,最简单的一个是完全忘记替换并使用

     标记,这将呈现您的换行符(和其他格式字符)
    
    

    &lt;pre&gt; &lt;?= str ?&gt; &lt;/pre&gt;

    第二个是使用自定义函数执行替换并清理您的输入,以便您可以安全地使用强制打印脚本。

    在您的 html 中:

    &lt;?!= sanitize(str); ?&gt;

    在您的 .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

    【讨论】:

      【解决方案2】:

      如果有人好奇,这是我最后用来清理不受信任的输入以进行显示的代码。在标签内、脚本部分等中使用是不安全的。这就是为什么 Google 的上下文感知清理如此方便。

      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"));
      }
      

      【讨论】:

        【解决方案3】:

        或者你可以这样做:

        在您的 .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> -->
        <?
        }
        ?>
        

        您可以使用&lt;span&gt;&lt;p&gt; 标签,这取决于您。您还可以编写一些简单的逻辑来决定何时放置&lt;br /&gt;,例如在&lt;span&gt; 之前i &gt; 0。这将完全满足您的"test\nstring"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-24
          • 1970-01-01
          • 2015-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多