1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // A helper function for using JsTemplate. See jstemplate_builder.h for more 6 // info. 7 8 #include "chrome/common/jstemplate_builder.h" 9 10 #include "base/logging.h" 11 #include "base/string_util.h" 12 #include "content/common/json_value_serializer.h" 13 #include "grit/common_resources.h" 14 #include "ui/base/resource/resource_bundle.h" 15 16 namespace jstemplate_builder { 17 18 std::string GetTemplateHtml(const base::StringPiece& html_template, 19 const DictionaryValue* json, 20 const base::StringPiece& template_id) { 21 std::string output(html_template.data(), html_template.size()); 22 AppendJsonHtml(json, &output); 23 AppendJsTemplateSourceHtml(&output); 24 AppendJsTemplateProcessHtml(template_id, &output); 25 return output; 26 } 27 28 std::string GetI18nTemplateHtml(const base::StringPiece& html_template, 29 const DictionaryValue* json) { 30 std::string output(html_template.data(), html_template.size()); 31 AppendJsonHtml(json, &output); 32 AppendI18nTemplateSourceHtml(&output); 33 AppendI18nTemplateProcessHtml(&output); 34 return output; 35 } 36 37 std::string GetTemplatesHtml(const base::StringPiece& html_template, 38 const DictionaryValue* json, 39 const base::StringPiece& template_id) { 40 std::string output(html_template.data(), html_template.size()); 41 AppendI18nTemplateSourceHtml(&output); 42 AppendJsTemplateSourceHtml(&output); 43 AppendJsonHtml(json, &output); 44 AppendI18nTemplateProcessHtml(&output); 45 AppendJsTemplateProcessHtml(template_id, &output); 46 return output; 47 } 48 49 void AppendJsonHtml(const DictionaryValue* json, std::string* output) { 50 // Convert the template data to a json string. 51 DCHECK(json) << "must include json data structure"; 52 53 std::string jstext; 54 JSONStringValueSerializer serializer(&jstext); 55 serializer.Serialize(*json); 56 // </ confuses the HTML parser because it could be a </script> tag. So we 57 // replace </ with <\/. The extra \ will be ignored by the JS engine. 58 ReplaceSubstringsAfterOffset(&jstext, 0, "</", "<\\/"); 59 60 output->append("<script>"); 61 output->append("var templateData = "); 62 output->append(jstext); 63 output->append(";"); 64 output->append("</script>"); 65 } 66 67 void AppendJsTemplateSourceHtml(std::string* output) { 68 // fetch and cache the pointer of the jstemplate resource source text. 69 static const base::StringPiece jstemplate_src( 70 ResourceBundle::GetSharedInstance().GetRawDataResource( 71 IDR_JSTEMPLATE_JS)); 72 73 if (jstemplate_src.empty()) { 74 NOTREACHED() << "Unable to get jstemplate src"; 75 return; 76 } 77 78 output->append("<script>"); 79 output->append(jstemplate_src.data(), jstemplate_src.size()); 80 output->append("</script>"); 81 } 82 83 void AppendJsTemplateProcessHtml(const base::StringPiece& template_id, 84 std::string* output) { 85 output->append("<script>"); 86 output->append("var tp = document.getElementById('"); 87 output->append(template_id.data(), template_id.size()); 88 output->append("');"); 89 output->append("jstProcess(new JsEvalContext(templateData), tp);"); 90 output->append("</script>"); 91 } 92 93 void AppendI18nTemplateSourceHtml(std::string* output) { 94 // fetch and cache the pointer of the jstemplate resource source text. 95 static const base::StringPiece i18n_template_src( 96 ResourceBundle::GetSharedInstance().GetRawDataResource( 97 IDR_I18N_TEMPLATE_JS)); 98 99 if (i18n_template_src.empty()) { 100 NOTREACHED() << "Unable to get i18n template src"; 101 return; 102 } 103 104 output->append("<script>"); 105 output->append(i18n_template_src.data(), i18n_template_src.size()); 106 output->append("</script>"); 107 } 108 109 void AppendI18nTemplateProcessHtml(std::string* output) { 110 output->append("<script>"); 111 output->append("i18nTemplate.process(document, templateData);"); 112 output->append("</script>"); 113 } 114 115 } // namespace jstemplate_builder 116