Commit 90d1071d authored by JC Brand's avatar JC Brand

Load templates in the respective plugins

parent aef32fed
......@@ -60,7 +60,6 @@ require.config({
"converse-ping": "src/converse-ping",
"converse-register": "src/converse-register",
"converse-rosterview": "src/converse-rosterview",
"converse-templates": "src/converse-templates",
"converse-vcard": "src/converse-vcard",
// Off-the-record-encryption
......@@ -155,13 +154,11 @@ require.config({
"new_day": "src/templates/new_day",
"occupant": "src/templates/occupant",
"pending_contact": "src/templates/pending_contact",
"pending_contacts": "src/templates/pending_contacts",
"register_panel": "src/templates/register_panel",
"register_tab": "src/templates/register_tab",
"registration_form": "src/templates/registration_form",
"registration_request": "src/templates/registration_request",
"requesting_contact": "src/templates/requesting_contact",
"requesting_contacts": "src/templates/requesting_contacts",
"room_description": "src/templates/room_description",
"room_item": "src/templates/room_item",
"room_panel": "src/templates/room_panel",
......@@ -174,7 +171,6 @@ require.config({
"toolbar": "src/templates/toolbar",
"toolbar_otr": "src/templates/toolbar_otr",
"trimmed_chat": "src/templates/trimmed_chat",
"vcard": "src/templates/vcard",
"chatbox_minimize": "src/templates/chatbox_minimize"
},
......
This diff is collapsed.
......@@ -5,6 +5,7 @@
listeners with `converse.listen.on` and `converse.listen.once`. [jcbrand]
- New event ['rosterContactsFetched'](https://conversejs.org/docs/html/development.html#rosterContactsFetched) [jcbrand]
- New event ['rosterGroupsFetched'](https://conversejs.org/docs/html/development.html#rosterGroupsFetched) [jcbrand]
- HTML templates are now loaded in the respective modules/plugins. [jcbrand]
## 2.0.0 (2016-09-16)
- #656 Online users count not shown initially [amanzur]
......
......@@ -23,38 +23,41 @@ Creating builds
Creating builds and distribution files
======================================
We use `require.js <http://requirejs.org>`_ to keep track of *Converse.js* and
its dependencies and to to bundle them together in a single file fit for
deployment to a production site.
Converse.js uses `AMD (Asynchronous Modules Definition) <http://requirejs.org/docs/whyamd.html#amd>`_
to define modules and their dependencies.
To create the distributable bundles, simply run::
Dependencies can then be loaded on-the-fly with `require.js <http://requirejs.org>`_.
This is very useful during development, but when it comes to
deployement, it's usually desired to create a single, minified distribution build.
For this, the `r.js optimizer <http://requirejs.org/docs/optimization.html>`_
is used together with `almond.js <https://github.com/requirejs/almond>`_, which
is a minimal AMD API implementation that replaces require.js in builds (in
order to keep the build smaller).
To create the distribution build, simply run::
make dist
This command does the following:
* It creates different Javascript bundles of Converse.js.
The individual javascript files will be bundled and minified with `require.js`_'s
optimization tool, using `almond <https://github.com/jrburke/almond>`_.
You can `read more about require.js's optimizer here <http://requirejs.org/docs/optimization.html>`_.
* It bundles the HTML templates in ``./src/templates/`` into a single file called ``templates.js``.
This file can then be included via the ``<script>`` tag. See for example the ``non_amd.html`` example page.
* It creates different builds of Converse.js in the ``./dist/`` directory.
* It bundles all the translation files in ``./locale/`` into a single file ``locales.js``.
This file can then be included via the ``<script>`` tag. See for example the ``non_amd.html`` example page.
* Also, the CSS files in the ``./css`` directory will be minified.
The built Javasript bundles are contained in the ``./dist`` directory:
The Javascript build files are contained in the ``./dist`` directory:
.. code-block:: bash
jc@conversejs:~/converse.js (master)$ ls dist/
converse.js converse-no-dependencies.js
converse.min.js converse-no-dependencies.min.js
converse.nojquery.js locales.js
converse.nojquery.min.js templates.js
converse-mobile.js converse.min.js
converse-mobile.min.js converse.nojquery.js
converse-no-dependencies.js converse.nojquery.min.js
converse-no-dependencies.min.js locales.js
converse.js
.. _`minification`:
......
......@@ -14,31 +14,31 @@
<link type="text/css" rel="stylesheet" media="screen" href="css/converse.css" />
<!-- BEGIN JQUERY -->
<script type="text/javascript" src="components/jquery/dist/jquery.js"></script>
<script type="text/javascript" src="components/jquery.browser/dist/jquery.browser.js"></script>
<script type="text/javascript" src="node_modules/jquery/dist/jquery.js"></script>
<script type="text/javascript" src="node_modules/jquery.browser/dist/jquery.browser.js"></script>
<script type="text/javascript" src="components/typeahead.js/index.js"></script>
<!-- END JQUERY -->
<!-- BEGIN OTR: Off-the-record encryption stuff. Can be omitted if OTR is not used. -->
<script type="text/javascript" src="components/otr/build/dep/salsa20.js"></script>
<script type="text/javascript" src="node_modules/otr/build/dep/salsa20.js"></script>
<script type="text/javascript" src="src/bigint.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/core.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/enc-base64.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/core.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/enc-base64.js"></script>
<script type="text/javascript" src="components/crypto-js-evanvosberg/src/md5.js"></script>
<script type="text/javascript" src="components/crypto-js-evanvosberg/src/evpkdf.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/cipher-core.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/aes.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/sha1.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/sha256.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/hmac.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/pad-nopadding.js"></script>
<script type="text/javascript" src="components/otr/vendor/cryptojs/mode-ctr.js"></script>
<script type="text/javascript" src="components/otr/build/dep/eventemitter.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/cipher-core.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/aes.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/sha1.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/sha256.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/hmac.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/pad-nopadding.js"></script>
<script type="text/javascript" src="node_modules/otr/vendor/cryptojs/mode-ctr.js"></script>
<script type="text/javascript" src="node_modules/otr/build/dep/eventemitter.js"></script>
<script type="text/javascript" src="src/otr.js"></script>
<!-- END OTR -->
<!-- BEGIN STROPHE -->
<script type="text/javascript" src="components/strophejs/strophe.js"></script>
<script type="text/javascript" src="node_modules/strophe.js/strophe.js"></script>
<script type="text/javascript" src="components/strophejs-plugins/vcard/strophe.vcard.js"></script>
<script type="text/javascript" src="components/strophejs-plugins/disco/strophe.disco.js"></script>
<script type="text/javascript" src="components/strophejs-plugins/rsm/strophe.rsm.js"></script>
......@@ -46,10 +46,10 @@
<!-- END STROPHE -->
<!-- BEGIN BACKBONE -->
<script type="text/javascript" src="components/underscore/underscore.js"></script>
<script type="text/javascript" src="components/backbone//backbone.js"></script>
<script type="text/javascript" src="components/backbone.browserStorage/backbone.browserStorage.js"></script>
<script type="text/javascript" src="components/backbone.overview/backbone.overview.js"></script>
<script type="text/javascript" src="node_modules/underscore/underscore.js"></script>
<script type="text/javascript" src="node_modules/backbone//backbone.js"></script>
<script type="text/javascript" src="node_modules/backbone.browserStorage/backbone.browserStorage.js"></script>
<script type="text/javascript" src="node_modules/backbone.overview/backbone.overview.js"></script>
<!-- END BACKBONE -->
<!-- BEGIN I18N -->
......@@ -59,11 +59,11 @@
src/locales.js to remove those you don't need, and then run `make
build` to generates a new dist/locales.js file.
-->
<script type="text/javascript" src="components/jed/jed.js"></script>
<script type="text/javascript" src="node_modules/jed/jed.js"></script>
<script type="text/javascript" src="dist/locales.js"></script>
<!-- END I18N -->
<script type="text/javascript" src="components/momentjs/min/moment-with-locales.js"></script>
<script type="text/javascript" src="node_modules/moment/min/moment-with-locales.js"></script>
<script type="text/javascript" src="dist/converse-no-dependencies.js"></script>
</head>
<body id="page-top" data-spy="scroll" data-target=".navbar-custom">
......
......@@ -7,9 +7,31 @@
/*global Backbone, define */
(function (root, factory) {
define("converse-chatview", ["converse-core", "converse-api"], factory);
}(this, function (converse, converse_api) {
define("converse-chatview", [
"converse-core",
"converse-api",
"tpl!chatbox",
"tpl!new_day",
"tpl!action",
"tpl!message",
"tpl!toolbar"
], factory);
}(this, function (
converse,
converse_api,
tpl_chatbox,
tpl_new_day,
tpl_action,
tpl_message,
tpl_toolbar
) {
"use strict";
converse.templates.chatbox = tpl_chatbox;
converse.templates.new_day = tpl_new_day;
converse.templates.action = tpl_action;
converse.templates.message = tpl_message;
converse.templates.toolbar = tpl_toolbar;
var $ = converse_api.env.jQuery,
utils = converse_api.env.utils,
Strophe = converse_api.env.Strophe,
......
......@@ -10,12 +10,54 @@
define("converse-controlbox", [
"converse-core",
"converse-api",
// TODO: The next two dependencies can be made optional
"converse-rosterview",
"converse-chatview"
"tpl!add_contact_dropdown",
"tpl!add_contact_form",
"tpl!change_status_message",
"tpl!chat_status",
"tpl!choose_status",
"tpl!contacts_panel",
"tpl!contacts_tab",
"tpl!controlbox",
"tpl!controlbox_toggle",
"tpl!login_panel",
"tpl!login_tab",
"tpl!search_contact",
"tpl!status_option",
"converse-chatview",
"converse-rosterview"
], factory);
}(this, function (converse, converse_api) {
}(this, function (
converse,
converse_api,
tpl_add_contact_dropdown,
tpl_add_contact_form,
tpl_change_status_message,
tpl_chat_status,
tpl_choose_status,
tpl_contacts_panel,
tpl_contacts_tab,
tpl_controlbox,
tpl_controlbox_toggle,
tpl_login_panel,
tpl_login_tab,
tpl_search_contact,
tpl_status_option
) {
"use strict";
converse.templates.add_contact_dropdown = tpl_add_contact_dropdown;
converse.templates.add_contact_form = tpl_add_contact_form;
converse.templates.change_status_message = tpl_change_status_message;
converse.templates.chat_status = tpl_chat_status;
converse.templates.choose_status = tpl_choose_status;
converse.templates.contacts_panel = tpl_contacts_panel;
converse.templates.contacts_tab = tpl_contacts_tab;
converse.templates.controlbox = tpl_controlbox;
converse.templates.controlbox_toggle = tpl_controlbox_toggle;
converse.templates.login_panel = tpl_login_panel;
converse.templates.login_tab = tpl_login_tab;
converse.templates.search_contact = tpl_search_contact;
converse.templates.status_option = tpl_status_option;
// Strophe methods for building stanzas
var Strophe = converse_api.env.Strophe,
utils = converse_api.env.utils;
......
......@@ -22,13 +22,16 @@
"utils",
"moment_with_locales",
"strophe",
"converse-templates",
"pluggable",
"tpl!chats_panel",
"strophe.disco",
"backbone.browserStorage",
"backbone.overview",
], factory);
}(this, function ($, _, dummy, utils, moment, Strophe, templates, pluggable) {
}(this, function (
$, _, dummy, utils, moment,
Strophe, pluggable, tpl_chats_panel
) {
/*
* Cannot use this due to Safari bug.
* See https://github.com/jcbrand/converse.js/issues/196
......@@ -59,7 +62,7 @@
var event_context = {};
var converse = {
templates: templates,
templates: {'chats_panel': tpl_chats_panel},
emit: function (evt, data) {
$(event_context).trigger(evt, data);
......
......@@ -10,12 +10,25 @@
define("converse-minimize", [
"converse-core",
"converse-api",
"tpl!chatbox_minimize",
"tpl!toggle_chats",
"tpl!trimmed_chat",
"converse-controlbox",
"converse-chatview",
"converse-muc"
], factory);
}(this, function (converse, converse_api) {
}(this, function (
converse,
converse_api,
tpl_chatbox_minimize,
tpl_toggle_chats,
tpl_trimmed_chat
) {
"use strict";
converse.templates.chatbox_minimize = tpl_chatbox_minimize;
converse.templates.toggle_chats = tpl_toggle_chats;
converse.templates.trimmed_chat = tpl_trimmed_chat;
var $ = converse_api.env.jQuery,
_ = converse_api.env._,
b64_sha1 = converse_api.env.b64_sha1,
......
......@@ -13,11 +13,51 @@
define("converse-muc", [
"converse-core",
"converse-api",
"tpl!chatarea",
"tpl!chatroom",
"tpl!chatroom_form",
"tpl!chatroom_nickname_form",
"tpl!chatroom_password_form",
"tpl!chatroom_sidebar",
"tpl!chatrooms_tab",
"tpl!info",
"tpl!occupant",
"tpl!room_description",
"tpl!room_item",
"tpl!room_panel",
"typeahead",
"converse-chatview"
], factory);
}(this, function (converse, converse_api) {
}(this, function (
converse,
converse_api,
tpl_chatarea,
tpl_chatroom,
tpl_chatroom_form,
tpl_chatroom_nickname_form,
tpl_chatroom_password_form,
tpl_chatroom_sidebar,
tpl_chatrooms_tab,
tpl_info,
tpl_occupant,
tpl_room_description,
tpl_room_item,
tpl_room_panel
) {
"use strict";
converse.templates.chatarea = tpl_chatarea;
converse.templates.chatroom = tpl_chatroom;
converse.templates.chatroom_form = tpl_chatroom_form;
converse.templates.chatroom_nickname_form = tpl_chatroom_nickname_form;
converse.templates.chatroom_password_form = tpl_chatroom_password_form;
converse.templates.chatroom_sidebar = tpl_chatroom_sidebar;
converse.templates.chatrooms_tab = tpl_chatrooms_tab;
converse.templates.info = tpl_info;
converse.templates.occupant = tpl_occupant;
converse.templates.room_description = tpl_room_description;
converse.templates.room_item = tpl_room_item;
converse.templates.room_panel = tpl_room_panel;
// Strophe methods for building stanzas
var Strophe = converse_api.env.Strophe,
$iq = converse_api.env.$iq,
......
......@@ -13,10 +13,12 @@
define("converse-otr", [
"otr",
"converse-core",
"converse-api"
"converse-api",
"tpl!toolbar_otr"
], factory);
}(this, function (otr, converse, converse_api) {
}(this, function (otr, converse, converse_api, tpl_toolbar_otr) {
"use strict";
converse.templates.toolbar_otr = tpl_toolbar_otr;
// Strophe methods for building stanzas
var Strophe = converse_api.env.Strophe,
utils = converse_api.env.utils,
......
......@@ -13,10 +13,29 @@
define("converse-register", [
"converse-core",
"converse-api",
"tpl!form_username",
"tpl!register_panel",
"tpl!register_tab",
"tpl!registration_form",
"tpl!registration_request",
"converse-controlbox"
], factory);
}(this, function (converse, converse_api) {
}(this, function (
converse,
converse_api,
tpl_form_username,
tpl_register_panel,
tpl_register_tab,
tpl_registration_form,
tpl_registration_request) {
"use strict";
converse.templates.form_username = tpl_form_username;
converse.templates.register_panel = tpl_register_panel;
converse.templates.register_tab = tpl_register_tab;
converse.templates.registration_form = tpl_registration_form;
converse.templates.registration_request = tpl_registration_request;
// Strophe methods for building stanzas
var Strophe = converse_api.env.Strophe,
utils = converse_api.env.utils,
......
......@@ -7,9 +7,30 @@
/*global Backbone, define */
(function (root, factory) {
define("converse-rosterview", ["converse-core", "converse-api"], factory);
}(this, function (converse, converse_api) {
define("converse-rosterview", [
"converse-core",
"converse-api",
"tpl!group_header",
"tpl!pending_contact",
"tpl!requesting_contact",
"tpl!roster",
"tpl!roster_item"
], factory);
}(this, function (
converse,
converse_api,
tpl_group_header,
tpl_pending_contact,
tpl_requesting_contact,
tpl_roster,
tpl_roster_item) {
"use strict";
converse.templates.group_header = tpl_group_header;
converse.templates.pending_contact = tpl_pending_contact;
converse.templates.requesting_contact = tpl_requesting_contact;
converse.templates.roster = tpl_roster;
converse.templates.roster_item = tpl_roster_item;
var $ = converse_api.env.jQuery,
utils = converse_api.env.utils,
Strophe = converse_api.env.Strophe,
......
define("converse-templates", [
"tpl!action",
"tpl!add_contact_dropdown",
"tpl!add_contact_form",
"tpl!change_status_message",
"tpl!chat_status",
"tpl!chatarea",
"tpl!chatbox",
"tpl!chatroom",
"tpl!chatroom_form",
"tpl!chatroom_password_form",
"tpl!chatroom_nickname_form",
"tpl!chatroom_sidebar",
"tpl!chatrooms_tab",
"tpl!chats_panel",
"tpl!choose_status",
"tpl!contacts_panel",
"tpl!contacts_tab",
"tpl!controlbox",
"tpl!controlbox_toggle",
"tpl!field",
"tpl!form_captcha",
"tpl!form_checkbox",
"tpl!form_input",
"tpl!form_select",
"tpl!form_textarea",
"tpl!form_username",
"tpl!group_header",
"tpl!info",
"tpl!login_panel",
"tpl!login_tab",
"tpl!message",
"tpl!new_day",
"tpl!occupant",
"tpl!pending_contact",
"tpl!pending_contacts",
"tpl!register_panel",
"tpl!register_tab",
"tpl!registration_form",
"tpl!registration_request",
"tpl!requesting_contact",
"tpl!requesting_contacts",
"tpl!room_description",
"tpl!room_item",
"tpl!room_panel",
"tpl!roster",
"tpl!roster_item",
"tpl!search_contact",
"tpl!select_option",
"tpl!status_option",
"tpl!toggle_chats",
"tpl!toolbar",
"tpl!toolbar_otr",
"tpl!trimmed_chat",
"tpl!vcard",
// Can be removed together with converse-minimize.js
// if minimization/trimming features not needed (for example for mobile
// apps).
"tpl!chatbox_minimize",
], function () {
return {
action: arguments[0],
add_contact_dropdown: arguments[1],
add_contact_form: arguments[2],
change_status_message: arguments[3],
chat_status: arguments[4],
chatarea: arguments[5],
chatbox: arguments[6],
chatroom: arguments[7],
chatroom_form: arguments[8],
chatroom_password_form: arguments[9],
chatroom_nickname_form: arguments[10],
chatroom_sidebar: arguments[11],
chatrooms_tab: arguments[12],
chats_panel: arguments[13],
choose_status: arguments[14],
contacts_panel: arguments[15],
contacts_tab: arguments[16],
controlbox: arguments[17],
controlbox_toggle: arguments[18],
field: arguments[19],
form_captcha: arguments[20],
form_checkbox: arguments[21],
form_input: arguments[22],
form_select: arguments[23],
form_textarea: arguments[24],
form_username: arguments[25],
group_header: arguments[26],
info: arguments[27],
login_panel: arguments[28],
login_tab: arguments[29],
message: arguments[30],
new_day: arguments[31],
occupant: arguments[32],
pending_contact: arguments[33],
pending_contacts: arguments[34],
register_panel: arguments[35],
register_tab: arguments[36],
registration_form: arguments[37],
registration_request: arguments[38],
requesting_contact: arguments[39],
requesting_contacts: arguments[40],
room_description: arguments[41],
room_item: arguments[42],
room_panel: arguments[43],
roster: arguments[44],
roster_item: arguments[45],
search_contact: arguments[46],
select_option: arguments[47],
status_option: arguments[48],
toggle_chats: arguments[49],
toolbar: arguments[50],
toolbar_otr: arguments[51],
trimmed_chat: arguments[52],
vcard: arguments[53],
chatbox_minimize: arguments[54]
};
});
......@@ -19,7 +19,6 @@
_ = converse_api.env._,
moment = converse_api.env.moment;
converse_api.plugins.add('converse-vcard', {
overrides: {
......
<dt class="roster-group" id="pending-xmpp-contacts"><a href="#" class="group-toggle icon-{{toggle_state}}" title="{{desc_group_toggle}}">{{label_pending_contacts}}</a></dt>
<dt class="roster-group" id="xmpp-contact-requests"><a href="#" class="group-toggle icon-{{toggle_state}}" title="{{desc_group_toggle}}">{{label_contact_requests}}</a></dt>
<form class="pure-form converse-form vcard-info">
<fieldset>
<legend>The VCard info gets rendered here</legend>
<label>Full name:</label>
{{fullname}}
<label>URL:</label>
{{url}}
</fieldset>
<fieldset>
<input type="button" class="pure-button button-cancel" value="{{label_return}}"/>
</fieldset>
</form>
......@@ -4,9 +4,26 @@
"jquery",
"jquery.browser",
"underscore",
"converse-templates"
"tpl!field",
"tpl!select_option",
"tpl!form_select",
"tpl!form_textarea",
"tpl!form_checkbox",
"tpl!form_username",
"tpl!form_input",
"tpl!form_captcha"
], factory);
}(this, function ($, dummy, _, templates) {
}(this, function (
$, dummy, _,
tpl_field,
tpl_select_option,
tpl_form_select,
tpl_form_textarea,
tpl_form_checkbox,
tpl_form_username,
tpl_form_input,
tpl_form_captcha
) {
"use strict";
var XFORM_TYPE_MAP = {
......@@ -249,7 +266,7 @@
} else {
value = $input.val();
}
return $(templates.field({
return $(tpl_field({
name: $input.attr('name'),
value: value
}))[0];
......@@ -291,14 +308,14 @@
$options = $field.children('option');
for (j=0; j<$options.length; j++) {
value = $($options[j]).find('value').text();
options.push(templates.select_option({
options.push(tpl_select_option({
value: value,
label: $($options[j]).attr('label'),
selected: (values.indexOf(value) >= 0),
required: $field.find('required').length
}));
}
return templates.form_select({
return tpl_form_select({
name: $field.attr('var'),
label: $field.attr('label'),
options: options.join(''),
......@@ -308,14 +325,14 @@
} else if ($field.attr('type') === 'fixed') {
return $('<p class="form-help">').text($field.find('value').text());
} else if ($field.attr('type') === 'jid-multi') {
return templates.form_textarea({
return tpl_form_textarea({
name: $field.attr('var'),
label: $field.attr('label') || '',
value: $field.find('value').text(),
required: $field.find('required').length
});
} else if ($field.attr('type') === 'boolean') {
return templates.form_checkbox({
return tpl_form_checkbox({
name: $field.attr('var'),
type: XFORM_TYPE_MAP[$field.attr('type')],
label: $field.attr('label') || '',
......@@ -323,7 +340,7 @@
required: $field.find('required').length
});
} else if ($field.attr('type') && $field.attr('var') === 'username') {
return templates.form_username({
return tpl_form_username({
domain: ' @'+this.domain,
name: $field.attr('var'),
type: XFORM_TYPE_MAP[$field.attr('type')],
......@@ -332,7 +349,7 @@
required: $field.find('required').length
});
} else if ($field.attr('type')) {
return templates.form_input({
return tpl_form_input({
name: $field.attr('var'),
type: XFORM_TYPE_MAP[$field.attr('type')],
label: $field.attr('label') || '',
......@@ -343,7 +360,7 @@
if ($field.attr('var') === 'ocr') { // Captcha
return _.reduce(_.map($field.find('uri'),
$.proxy(function (uri) {
return templates.form_captcha({
return tpl_form_captcha({
label: this.$field.attr('label'),
name: this.$field.attr('var'),
data: this.$stanza.find('data[cid="'+uri.textContent.replace(/^cid:/, '')+'"]').text(),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment