MDL-49650 tool_templatelibrary: New tool for browsing mustache templates
[moodle.git] / admin / tool / templatelibrary / amd / src / display.js
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /**
17  * This module adds ajax display functions to the template library page.
18  *
19  * @module     tool_templatelibrary/display
20  * @package    tool_templatelibrary
21  * @copyright  2015 Damyon Wiese <damyon@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 define(['jquery', 'core/ajax', 'core/log', 'core/notification', 'core/templates', 'core/config', 'core/str'],
25        function($, ajax, log, notification, templates, config, str) {
27     /**
28      * Handle a template loaded response.
29      *
30      * @param {String} templateName The template name
31      * @param {String} source The template source
32      */
33     var templateLoaded = function(templateName, source) {
34         str.get_string('templateselected', 'tool_templatelibrary', templateName).done(function(s) {
35             $('[data-region="displaytemplateheader"]').text(s);
36         }).fail(notification.exception);
38         // Remove the GPL from the start of the template.
40         var sections = source.match(/{{!([\s\S]*?)}}/g);
41         var i = 0;
43         // Find the first non-empty comment that is not the GPL.
44         // If no sections match - show the entire file.
45         if (sections !== null) {
46             for (i = 0; i < sections.length; i++) {
47                 var section = sections[i];
48                 if ((section.trim() !== '') && (section.indexOf('GNU General Public License') === -1)) {
49                     // Remove {{! and }} from start and end.
50                     section = section.substr(3, section.length - 5);
51                     source = section;
52                     break;
53                 }
54             }
55         }
57         $('[data-region="displaytemplatesource"]').text(source);
59         // Now search the text for a json example.
61         var example = source.match(/Example context \(json\):([\s\S]*)/);
62         var context = false;
63         if (example) {
64             var rawJSON = example[1].trim();
65             try {
66                 context = $.parseJSON(rawJSON);
67             } catch (e) {
68                 log.debug('Could not parse json example context for template.');
69                 log.debug(e);
70             }
71         }
72         if (context) {
73             templates.render(templateName, context).done(function(html, js) {
74                 $('[data-region="displaytemplateexample"]').empty();
75                 $('[data-region="displaytemplateexample"]').append(html);
76                 templates.runTemplateJS(js);
77             }).fail(notification.exception);
78         } else {
79             str.get_string('templatehasnoexample', 'tool_templatelibrary').done(function(s) {
80                 $('[data-region="displaytemplateexample"]').text(s);
81             }).fail(notification.exception);
82         }
83     };
85     /**
86      * Load the a template source from Moodle.
87      * @param {String} templateName
88      */
89     var loadTemplate = function(templateName) {
90         var parts = templateName.split('/');
91         var component = parts.shift();
92         var name = parts.shift();
94         ajax.call([{
95             methodname: 'core_output_load_template',
96             args:{
97                     component: component,
98                     template: name,
99                     themename: config.theme
100             },
101             done: function(source) { templateLoaded(templateName, source); },
102             fail: notification.exception
103         }]);
104     };
106     // Add the event listeners.
107     $('[data-region="list-templates"]').on('click', '[data-templatename]', function() {
108         var templatename = $(this).data('templatename');
109         loadTemplate(templatename);
110     });
112     // This module does not expose anything.
113     return {};
114 });