Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
converse.js
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
converse.js
Commits
90d1071d
Commit
90d1071d
authored
Sep 23, 2016
by
JC Brand
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Load templates in the respective plugins
parent
aef32fed
Changes
19
Show whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
245 additions
and
1482 deletions
+245
-1482
config.js
config.js
+0
-4
dist/templates.js
dist/templates.js
+0
-1282
docs/CHANGES.md
docs/CHANGES.md
+1
-0
docs/source/builds.rst
docs/source/builds.rst
+19
-16
non_amd.html
non_amd.html
+20
-20
src/converse-chatview.js
src/converse-chatview.js
+24
-2
src/converse-controlbox.js
src/converse-controlbox.js
+46
-4
src/converse-core.js
src/converse-core.js
+6
-3
src/converse-minimize.js
src/converse-minimize.js
+14
-1
src/converse-muc.js
src/converse-muc.js
+41
-1
src/converse-otr.js
src/converse-otr.js
+4
-2
src/converse-register.js
src/converse-register.js
+20
-1
src/converse-rosterview.js
src/converse-rosterview.js
+23
-2
src/converse-templates.js
src/converse-templates.js
+0
-119
src/converse-vcard.js
src/converse-vcard.js
+0
-1
src/templates/pending_contacts.html
src/templates/pending_contacts.html
+0
-1
src/templates/requesting_contacts.html
src/templates/requesting_contacts.html
+0
-1
src/templates/vcard.html
src/templates/vcard.html
+0
-12
src/utils.js
src/utils.js
+27
-10
No files found.
config.js
View file @
90d1071d
...
...
@@ -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
"
},
...
...
dist/templates.js
deleted
100644 → 0
View file @
aef32fed
this
[
"
templates
"
]
=
this
[
"
templates
"
]
||
{};
this
[
"
templates
"
][
"
action
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div class="chat-message
'
+
((
__t
=
(
extra_classes
))
==
null
?
''
:
__t
)
+
'
" data-isodate="
'
+
((
__t
=
(
isodate
))
==
null
?
''
:
__t
)
+
'
">
\n
<span class="chat-msg-author chat-msg-
'
+
((
__t
=
(
sender
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
time
))
==
null
?
''
:
__t
)
+
'
**
'
+
((
__t
=
(
username
))
==
null
?
''
:
__t
)
+
'
</span>
\n
<span class="chat-msg-content">
'
+
((
__t
=
(
message
))
==
null
?
''
:
__t
)
+
'
</span>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
add_contact_dropdown
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<dl class="add-converse-contact dropdown">
\n
<dt id="xmpp-contact-search" class="fancy-dropdown">
\n
<a class="toggle-xmpp-contact-form icon-plus" href="#" title="
'
+
((
__t
=
(
label_click_to_chat
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
label_add_contact
))
==
null
?
''
:
__t
)
+
'
</a>
\n
</dt>
\n
<dd class="search-xmpp" style="display:none"><ul></ul></dd>
\n
</dl>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
add_contact_form
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<li>
\n
<form class="pure-form add-xmpp-contact">
\n
<input type="text"
\n
name="identifier"
\n
class="username"
\n
placeholder="
'
+
((
__t
=
(
label_contact_username
))
==
null
?
''
:
__t
)
+
'
"/>
\n
<button class="pure-button button-primary" type="submit">
'
+
((
__t
=
(
label_add
))
==
null
?
''
:
__t
)
+
'
</button>
\n
</form>
\n
</li>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
change_status_message
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<form id="set-custom-xmpp-status" class="pure-form">
\n
<fieldset>
\n
<span class="input-button-group">
\n
<input type="text" class="custom-xmpp-status"
'
+
((
__t
=
(
status_message
))
==
null
?
''
:
__t
)
+
'
placeholder="
'
+
((
__t
=
(
label_custom_status
))
==
null
?
''
:
__t
)
+
'
"/>
\n
<input type="submit" class="pure-button button-primary" value="
'
+
((
__t
=
(
label_save
))
==
null
?
''
:
__t
)
+
'
"/>
\n
</span>
\n
</fieldset>
\n
</form>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chat_status
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div class="xmpp-status">
\n
<a class="choose-xmpp-status
'
+
((
__t
=
(
chat_status
))
==
null
?
''
:
__t
)
+
'
icon-
'
+
((
__t
=
(
chat_status
))
==
null
?
''
:
__t
)
+
'
" data-value="
'
+
((
__t
=
(
status_message
))
==
null
?
''
:
__t
)
+
'
" href="#" title="
'
+
((
__t
=
(
desc_change_status
))
==
null
?
''
:
__t
)
+
'
">
\n
'
+
((
__t
=
(
status_message
))
==
null
?
''
:
__t
)
+
'
\n
</a>
\n
<a class="change-xmpp-status-message icon-pencil" href="#" title="
'
+
((
__t
=
(
desc_custom_status
))
==
null
?
''
:
__t
)
+
'
"></a>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatarea
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<div class="chat-area">
\n
<div class="chat-content"></div>
\n
<div class="new-msgs-indicator hidden">▼
'
+
((
__t
=
(
unread_msgs
))
==
null
?
''
:
__t
)
+
'
▼</div>
\n
<form class="sendXMPPMessage" action="" method="post">
\n
'
;
if
(
show_toolbar
)
{
;
__p
+=
'
\n
<ul class="chat-toolbar no-text-select"></ul>
\n
'
;
}
;
__p
+=
'
\n
<textarea type="text" class="chat-textarea"
\n
placeholder="
'
+
((
__t
=
(
label_message
))
==
null
?
''
:
__t
)
+
'
"/>
\n
</form>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatbox
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<div class="flyout box-flyout">
\n
<div class="dragresize dragresize-top"></div>
\n
<div class="dragresize dragresize-topleft"></div>
\n
<div class="dragresize dragresize-left"></div>
\n
<div class="chat-head chat-head-chatbox">
\n
<a class="chatbox-btn close-chatbox-button icon-close" title="
'
+
((
__t
=
(
info_close
))
==
null
?
''
:
__t
)
+
'
"></a>
\n
<div class="chat-title">
\n
'
;
if
(
url
)
{
;
__p
+=
'
\n
<a href="
'
+
((
__t
=
(
url
))
==
null
?
''
:
__t
)
+
'
" target="_blank" rel="noopener" class="user">
\n
'
;
}
;
__p
+=
'
\n
'
+
((
__t
=
(
title
))
==
null
?
''
:
__t
)
+
'
\n
'
;
if
(
url
)
{
;
__p
+=
'
\n
</a>
\n
'
;
}
;
__p
+=
'
\n
</div>
\n
<p class="user-custom-message"><p/>
\n
</div>
\n
<div class="chat-body">
\n
<div class="chat-content"></div>
\n
<div class="new-msgs-indicator hidden">▼
'
+
((
__t
=
(
unread_msgs
))
==
null
?
''
:
__t
)
+
'
▼</div>
\n
'
;
if
(
show_textarea
)
{
;
__p
+=
'
\n
<form class="sendXMPPMessage" action="" method="post">
\n
'
;
if
(
show_toolbar
)
{
;
__p
+=
'
\n
<ul class="chat-toolbar no-text-select"></ul>
\n
'
;
}
;
__p
+=
'
\n
<textarea
\n
type="text"
\n
class="chat-textarea"
\n
placeholder="
'
+
((
__t
=
(
label_personal_message
))
==
null
?
''
:
__t
)
+
'
"/>
\n
</form>
\n
'
;
}
;
__p
+=
'
\n
</div>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatbox_minimize
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<a class="chatbox-btn toggle-chatbox-button icon-minus" title="
'
+
((
__t
=
(
info_minimize
))
==
null
?
''
:
__t
)
+
'
"></a>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatroom
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div class="flyout box-flyout">
\n
<div class="dragresize dragresize-top"></div>
\n
<div class="dragresize dragresize-topleft"></div>
\n
<div class="dragresize dragresize-left"></div>
\n
<div class="chat-head chat-head-chatroom">
\n
<a class="chatbox-btn close-chatbox-button icon-close"></a>
\n
<a class="chatbox-btn configure-chatroom-button icon-wrench" style="display:none"></a>
\n
<div class="chat-title">
'
+
((
__t
=
(
_
.
escape
(
name
)
))
==
null
?
''
:
__t
)
+
'
</div>
\n
<p class="chatroom-topic"><p/>
\n
</div>
\n
<div class="chat-body chatroom-body"><span class="spinner centered"/></div>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatroom_form
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div class="chatroom-form-container">
\n
<form class="pure-form pure-form-stacked converse-form chatroom-form">
\n
<fieldset>
\n
<span class="spinner centered"/>
\n
</fieldset>
\n
</form>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatroom_nickname_form
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div class="chatroom-form-container">
\n
<form class="pure-form converse-form chatroom-form">
\n
<fieldset>
\n
<label>
'
+
((
__t
=
(
heading
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<p class="validation-message">
'
+
((
__t
=
(
validation_message
))
==
null
?
''
:
__t
)
+
'
</p>
\n
<input type="text" required="required" name="nick" class="new-chatroom-nick" placeholder="
'
+
((
__t
=
(
label_nickname
))
==
null
?
''
:
__t
)
+
'
"/>
\n
</fieldset>
\n
<fieldset>
\n
<input type="submit" class="pure-button button-primary" name="join" value="
'
+
((
__t
=
(
label_join
))
==
null
?
''
:
__t
)
+
'
"/>
\n
</fieldset>
\n
</form>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatroom_password_form
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div class="chatroom-form-container">
\n
<form class="pure-form converse-form chatroom-form">
\n
<fieldset>
\n
<legend>
'
+
((
__t
=
(
heading
))
==
null
?
''
:
__t
)
+
'
</legend>
\n
<label>
'
+
((
__t
=
(
label_password
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<input type="password" name="password"/>
\n
</fieldset>
\n
<fieldset>
\n
<input class="pure-button button-primary" type="submit" value="
'
+
((
__t
=
(
label_submit
))
==
null
?
''
:
__t
)
+
'
"/>
\n
</fieldset>
\n
</form>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatroom_sidebar
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<!-- <div class="occupants"> -->
\n
'
;
if
(
allow_muc_invitations
)
{
;
__p
+=
'
\n
<form class="pure-form room-invite">
\n
<input class="invited-contact" placeholder="
'
+
((
__t
=
(
label_invitation
))
==
null
?
''
:
__t
)
+
'
" type="text"/>
\n
</form>
\n
'
;
}
;
__p
+=
'
\n
<p class="occupants-heading">
'
+
((
__t
=
(
label_occupants
))
==
null
?
''
:
__t
)
+
'
:</p>
\n
<ul class="occupant-list"></ul>
\n
<!-- </div> -->
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chatrooms_tab
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<li><a class="s" href="#chatrooms">
'
+
((
__t
=
(
label_rooms
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
chats_panel
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div id="minimized-chats">
\n
<a id="toggle-minimized-chats" href="#"></a>
\n
<div class="flyout minimized-chats-flyout"></div>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
choose_status
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<dl id="target" class="dropdown">
\n
<dt id="fancy-xmpp-status-select" class="fancy-dropdown"></dt>
\n
<dd><ul class="xmpp-status-menu"></ul></dd>
\n
</dl>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
contacts_panel
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<form class="pure-form set-xmpp-status" action="" method="post">
\n
<span id="xmpp-status-holder">
\n
<select id="select-xmpp-status" style="display:none">
\n
<option value="online">
'
+
((
__t
=
(
label_online
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option value="dnd">
'
+
((
__t
=
(
label_busy
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option value="away">
'
+
((
__t
=
(
label_away
))
==
null
?
''
:
__t
)
+
'
</option>
\n
'
;
if
(
include_offline_state
)
{
;
__p
+=
'
\n
<option value="offline">
'
+
((
__t
=
(
label_offline
))
==
null
?
''
:
__t
)
+
'
</option>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
allow_logout
)
{
;
__p
+=
'
\n
<option value="logout">
'
+
((
__t
=
(
label_logout
))
==
null
?
''
:
__t
)
+
'
</option>
\n
'
;
}
;
__p
+=
'
\n
</select>
\n
</span>
\n
</form>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
contacts_tab
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<li><a class="s current" href="#users">
'
+
((
__t
=
(
label_contacts
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
controlbox
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<div class="flyout box-flyout">
\n
<div class="dragresize dragresize-top"></div>
\n
<div class="dragresize dragresize-topleft"></div>
\n
<div class="dragresize dragresize-left"></div>
\n
<div class="chat-head controlbox-head">
\n
<ul id="controlbox-tabs"></ul>
\n
'
;
if
(
!
sticky_controlbox
)
{
;
__p
+=
'
\n
<a class="chatbox-btn close-chatbox-button icon-close"></a>
\n
'
;
}
;
__p
+=
'
\n
</div>
\n
<div class="controlbox-panes"></div>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
controlbox_toggle
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<span class="conn-feedback">
'
+
((
__t
=
(
label_toggle
))
==
null
?
''
:
__t
)
+
'
</span>
\n
<span style="display: none" id="online-count">(0)</span>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
field
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<field var="
'
+
((
__t
=
(
name
))
==
null
?
''
:
__t
)
+
'
">
'
;
if
(
_
.
isArray
(
value
))
{
;
__p
+=
'
\n
'
;
_
.
each
(
value
,
function
(
arrayValue
)
{
;
__p
+=
'
<value>
'
+
((
__t
=
(
arrayValue
))
==
null
?
''
:
__t
)
+
'
</value>
'
;
});
;
__p
+=
'
\n
'
;
}
else
{
;
__p
+=
'
\n
<value>
'
+
((
__t
=
(
value
))
==
null
?
''
:
__t
)
+
'
</value>
\n
'
;
}
;
__p
+=
'
</field>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
form_captcha
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
if
(
label
)
{
;
__p
+=
'
\n
<label>
\n
'
+
((
__t
=
(
label
))
==
null
?
''
:
__t
)
+
'
\n
</label>
\n
'
;
}
;
__p
+=
'
\n
<img src="data:
'
+
((
__t
=
(
type
))
==
null
?
''
:
__t
)
+
'
;base64,
'
+
((
__t
=
(
data
))
==
null
?
''
:
__t
)
+
'
">
\n
<input name="
'
+
((
__t
=
(
name
))
==
null
?
''
:
__t
)
+
'
" type="text"
'
;
if
(
required
)
{
;
__p
+=
'
class="required"
'
;
}
;
__p
+=
'
>
\n\n\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
form_checkbox
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<label>
'
+
((
__t
=
(
label
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<input name="
'
+
((
__t
=
(
name
))
==
null
?
''
:
__t
)
+
'
" type="
'
+
((
__t
=
(
type
))
==
null
?
''
:
__t
)
+
'
"
'
+
((
__t
=
(
checked
))
==
null
?
''
:
__t
)
+
'
>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
form_input
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
if
(
label
)
{
;
__p
+=
'
\n
<label>
\n
'
+
((
__t
=
(
label
))
==
null
?
''
:
__t
)
+
'
\n
</label>
\n
'
;
}
;
__p
+=
'
\n
<input name="
'
+
((
__t
=
(
name
))
==
null
?
''
:
__t
)
+
'
" type="
'
+
((
__t
=
(
type
))
==
null
?
''
:
__t
)
+
'
"
\n
'
;
if
(
value
)
{
;
__p
+=
'
value="
'
+
((
__t
=
(
value
))
==
null
?
''
:
__t
)
+
'
"
'
;
}
;
__p
+=
'
\n
'
;
if
(
required
)
{
;
__p
+=
'
class="required"
'
;
}
;
__p
+=
'
>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
form_select
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<label>
'
+
((
__t
=
(
label
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<select name="
'
+
((
__t
=
(
name
))
==
null
?
''
:
__t
)
+
'
"
'
;
if
(
multiple
)
{
;
__p
+=
'
multiple="multiple"
'
;
}
;
__p
+=
'
>
'
+
((
__t
=
(
options
))
==
null
?
''
:
__t
)
+
'
</select>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
form_textarea
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<label class="label-ta">
'
+
((
__t
=
(
label
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<textarea name="
'
+
((
__t
=
(
name
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
value
))
==
null
?
''
:
__t
)
+
'
</textarea>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
form_username
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
if
(
label
)
{
;
__p
+=
'
\n
<label>
\n
'
+
((
__t
=
(
label
))
==
null
?
''
:
__t
)
+
'
\n
</label>
\n
'
;
}
;
__p
+=
'
\n
<div class="input-group">
\n
<input name="
'
+
((
__t
=
(
name
))
==
null
?
''
:
__t
)
+
'
" type="
'
+
((
__t
=
(
type
))
==
null
?
''
:
__t
)
+
'
"
\n
'
;
if
(
value
)
{
;
__p
+=
'
value="
'
+
((
__t
=
(
value
))
==
null
?
''
:
__t
)
+
'
"
'
;
}
;
__p
+=
'
\n
'
;
if
(
required
)
{
;
__p
+=
'
class="required"
'
;
}
;
__p
+=
'
/>
\n
<span title="
'
+
((
__t
=
(
domain
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
domain
))
==
null
?
''
:
__t
)
+
'
</span>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
group_header
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<a href="#" class="group-toggle icon-
'
+
((
__t
=
(
toggle_state
))
==
null
?
''
:
__t
)
+
'
" title="
'
+
((
__t
=
(
desc_group_toggle
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
label_group
))
==
null
?
''
:
__t
)
+
'
</a>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
info
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div class="chat-info">
'
+
((
__t
=
(
message
))
==
null
?
''
:
__t
)
+
'
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
login_panel
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<form class="pure-form pure-form-stacked converse-form" id="converse-login" method="post">
\n
'
;
if
(
auto_login
)
{
;
__p
+=
'
\n
<span class="spinner login-submit"/>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
!
auto_login
)
{
;
__p
+=
'
\n
'
;
if
(
authentication
==
LOGIN
||
authentication
==
EXTERNAL
)
{
;
__p
+=
'
\n
<label>
'
+
((
__t
=
(
label_username
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<input type="text" name="jid" placeholder="
'
+
((
__t
=
(
placeholder_username
))
==
null
?
''
:
__t
)
+
'
">
\n
'
;
if
(
authentication
!==
EXTERNAL
)
{
;
__p
+=
'
\n
<label>
'
+
((
__t
=
(
label_password
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<input type="password" name="password" placeholder="
'
+
((
__t
=
(
placeholder_password
))
==
null
?
''
:
__t
)
+
'
">
\n
'
;
}
;
__p
+=
'
\n
<input class="pure-button button-primary" type="submit" value="
'
+
((
__t
=
(
label_login
))
==
null
?
''
:
__t
)
+
'
">
\n
<span class="conn-feedback"></span>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
authentication
==
ANONYMOUS
)
{
;
__p
+=
'
\n
<input type="pure-button button-primary" class="submit login-anon" value="
'
+
((
__t
=
(
label_anon_login
))
==
null
?
''
:
__t
)
+
'
"/>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
authentication
==
PREBIND
)
{
;
__p
+=
'
\n
<p>Disconnected.</p>
\n
'
;
}
;
__p
+=
'
\n
'
;
}
;
__p
+=
'
\n
</form>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
login_tab
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<li><a class="current" href="#login-dialog">
'
+
((
__t
=
(
label_sign_in
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
message
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<div class="chat-message
'
+
((
__t
=
(
extra_classes
))
==
null
?
''
:
__t
)
+
'
" data-isodate="
'
+
((
__t
=
(
isodate
))
==
null
?
''
:
__t
)
+
'
" data-msgid="
'
+
((
__t
=
(
msgid
))
==
null
?
''
:
__t
)
+
'
">
\n
<span class="chat-msg-author chat-msg-
'
+
((
__t
=
(
sender
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
time
))
==
null
?
''
:
__t
)
+
'
'
+
((
__t
=
(
username
))
==
null
?
''
:
__t
)
+
'
: </span>
\n
<span class="chat-msg-content">
'
+
((
__t
=
(
message
))
==
null
?
''
:
__t
)
+
'
</span>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
new_day
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<time class="chat-info chat-date" data-isodate="
'
+
((
__t
=
(
isodate
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
datestring
))
==
null
?
''
:
__t
)
+
'
</time>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
occupant
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<li class="
'
+
((
__t
=
(
role
))
==
null
?
''
:
__t
)
+
'
occupant" id="
'
+
((
__t
=
(
id
))
==
null
?
''
:
__t
)
+
'
"
\n
'
;
if
(
role
===
"
moderator
"
)
{
;
__p
+=
'
\n
title="
'
+
((
__t
=
(
desc_moderator
))
==
null
?
''
:
__t
)
+
'
'
+
((
__t
=
(
hint_occupant
))
==
null
?
''
:
__t
)
+
'
"
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
role
===
"
occupant
"
)
{
;
__p
+=
'
\n
title="
'
+
((
__t
=
(
desc_occupant
))
==
null
?
''
:
__t
)
+
'
'
+
((
__t
=
(
hint_occupant
))
==
null
?
''
:
__t
)
+
'
"
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
role
===
"
visitor
"
)
{
;
__p
+=
'
\n
title="
'
+
((
__t
=
(
desc_visitor
))
==
null
?
''
:
__t
)
+
'
'
+
((
__t
=
(
hint_occupant
))
==
null
?
''
:
__t
)
+
'
"
\n
'
;
}
;
__p
+=
'
>
'
+
((
__t
=
(
nick
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
pending_contact
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
if
(
allow_chat_pending_contacts
)
{
;
__p
+=
'
\n
<a class="open-chat"href="#">
\n
'
;
}
;
__p
+=
'
\n
<span class="pending-contact-name" title="Name:
'
+
((
__t
=
(
fullname
))
==
null
?
''
:
__t
)
+
'
\n
JID:
'
+
((
__t
=
(
jid
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
fullname
))
==
null
?
''
:
__t
)
+
'
</span>
\n
'
;
if
(
allow_chat_pending_contacts
)
{
;
__p
+=
'
\n
</a>
\n
'
;
}
;
__p
+=
'
\n
<a class="remove-xmpp-contact icon-remove" title="
'
+
((
__t
=
(
desc_remove
))
==
null
?
''
:
__t
)
+
'
" href="#"></a>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
pending_contacts
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<dt class="roster-group" id="pending-xmpp-contacts"><a href="#" class="group-toggle icon-
'
+
((
__t
=
(
toggle_state
))
==
null
?
''
:
__t
)
+
'
" title="
'
+
((
__t
=
(
desc_group_toggle
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
label_pending_contacts
))
==
null
?
''
:
__t
)
+
'
</a></dt>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
register_panel
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<form id="converse-register" class="pure-form converse-form">
\n
<span class="reg-feedback"></span>
\n
<label>
'
+
((
__t
=
(
label_domain
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<input type="text" name="domain" placeholder="
'
+
((
__t
=
(
domain_placeholder
))
==
null
?
''
:
__t
)
+
'
">
\n
<p class="form-help">
'
+
((
__t
=
(
help_providers
))
==
null
?
''
:
__t
)
+
'
<a href="
'
+
((
__t
=
(
href_providers
))
==
null
?
''
:
__t
)
+
'
" class="url" target="_blank" rel="noopener">
'
+
((
__t
=
(
help_providers_link
))
==
null
?
''
:
__t
)
+
'
</a>.</p>
\n
<input class="pure-button button-primary" type="submit" value="
'
+
((
__t
=
(
label_register
))
==
null
?
''
:
__t
)
+
'
">
\n
</form>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
register_tab
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<li><a class="s" href="#register">
'
+
((
__t
=
(
label_register
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
registration_form
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<p class="provider-title">
'
+
((
__t
=
(
domain
))
==
null
?
''
:
__t
)
+
'
</p>
\n
<a href=
\'
https://xmpp.net/result.php?domain=
'
+
((
__t
=
(
domain
))
==
null
?
''
:
__t
)
+
'
&type=client
\'
>
\n
<img class="provider-score" src=
\'
https://xmpp.net/badge.php?domain=
'
+
((
__t
=
(
domain
))
==
null
?
''
:
__t
)
+
'
\'
alt=
\'
xmpp.net score
\'
/>
\n
</a>
\n
<p class="title">
'
+
((
__t
=
(
title
))
==
null
?
''
:
__t
)
+
'
</p>
\n
<p class="instructions">
'
+
((
__t
=
(
instructions
))
==
null
?
''
:
__t
)
+
'
</p>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
registration_request
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<span class="spinner login-submit"/>
\n
<p class="info">
'
+
((
__t
=
(
info_message
))
==
null
?
''
:
__t
)
+
'
</p>
\n
<button class="pure-button button-cancel hor_centered">
'
+
((
__t
=
(
cancel
))
==
null
?
''
:
__t
)
+
'
</button>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
requesting_contact
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
if
(
allow_chat_pending_contacts
)
{
;
__p
+=
'
\n
<a class="open-chat"href="#">
\n
'
;
}
;
__p
+=
'
\n
<span class="req-contact-name" title="Name:
'
+
((
__t
=
(
fullname
))
==
null
?
''
:
__t
)
+
'
\n
JID:
'
+
((
__t
=
(
jid
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
fullname
))
==
null
?
''
:
__t
)
+
'
</span>
\n
'
;
if
(
allow_chat_pending_contacts
)
{
;
__p
+=
'
\n
</a>
\n
'
;
}
;
__p
+=
'
\n
<span class="request-actions">
\n
<a class="accept-xmpp-request icon-checkmark" title="
'
+
((
__t
=
(
desc_accept
))
==
null
?
''
:
__t
)
+
'
" href="#"></a>
\n
<a class="decline-xmpp-request icon-close" title="
'
+
((
__t
=
(
desc_decline
))
==
null
?
''
:
__t
)
+
'
" href="#"></a>
\n
</span>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
requesting_contacts
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<dt class="roster-group" id="xmpp-contact-requests"><a href="#" class="group-toggle icon-
'
+
((
__t
=
(
toggle_state
))
==
null
?
''
:
__t
)
+
'
" title="
'
+
((
__t
=
(
desc_group_toggle
))
==
null
?
''
:
__t
)
+
'
">
'
+
((
__t
=
(
label_contact_requests
))
==
null
?
''
:
__t
)
+
'
</a></dt>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
room_description
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<!-- FIXME: check markup in mockup -->
\n
<div class="room-info">
\n
<p class="room-info"><strong>
'
+
((
__t
=
(
label_desc
))
==
null
?
''
:
__t
)
+
'
</strong>
'
+
((
__t
=
(
desc
))
==
null
?
''
:
__t
)
+
'
</p>
\n
<p class="room-info"><strong>
'
+
((
__t
=
(
label_occ
))
==
null
?
''
:
__t
)
+
'
</strong>
'
+
((
__t
=
(
occ
))
==
null
?
''
:
__t
)
+
'
</p>
\n
<p class="room-info"><strong>
'
+
((
__t
=
(
label_features
))
==
null
?
''
:
__t
)
+
'
</strong>
\n
<ul>
\n
'
;
if
(
passwordprotected
)
{
;
__p
+=
'
\n
<li class="room-info locked">
'
+
((
__t
=
(
label_requires_auth
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
hidden
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_hidden
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
membersonly
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_requires_invite
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
moderated
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_moderated
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
nonanonymous
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_non_anon
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
open
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_open_room
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
persistent
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_permanent_room
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
publicroom
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_public
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
semianonymous
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_semi_anon
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
temporary
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_temp_room
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
unmoderated
)
{
;
__p
+=
'
\n
<li class="room-info">
'
+
((
__t
=
(
label_unmoderated
))
==
null
?
''
:
__t
)
+
'
</li>
\n
'
;
}
;
__p
+=
'
\n
</ul>
\n
</p>
\n
</div>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
room_item
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<dd class="available-chatroom">
\n
<a class="open-room" data-room-jid="
'
+
((
__t
=
(
jid
))
==
null
?
''
:
__t
)
+
'
"
\n
title="
'
+
((
__t
=
(
open_title
))
==
null
?
''
:
__t
)
+
'
" href="#">
'
+
((
__t
=
(
_
.
escape
(
name
)))
==
null
?
''
:
__t
)
+
'
</a>
\n
<a class="room-info icon-room-info" data-room-jid="
'
+
((
__t
=
(
jid
))
==
null
?
''
:
__t
)
+
'
"
\n
title="
'
+
((
__t
=
(
info_title
))
==
null
?
''
:
__t
)
+
'
" href="#"> </a>
\n
</dd>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
room_panel
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<form class="pure-form pure-form-stacked converse-form add-chatroom" action="" method="post">
\n
<fieldset>
\n
<label>
'
+
((
__t
=
(
label_room_name
))
==
null
?
''
:
__t
)
+
'
</label>
\n
<input type="text" name="chatroom" class="new-chatroom-name" placeholder="
'
+
((
__t
=
(
label_room_name
))
==
null
?
''
:
__t
)
+
'
"/>
\n
'
;
if
(
server_input_type
!=
'
hidden
'
)
{
;
__p
+=
'
\n
<label
'
+
((
__t
=
(
server_label_global_attr
))
==
null
?
''
:
__t
)
+
'
>
'
+
((
__t
=
(
label_server
))
==
null
?
''
:
__t
)
+
'
</label>
\n
'
;
}
;
__p
+=
'
\n
<input type="
'
+
((
__t
=
(
server_input_type
))
==
null
?
''
:
__t
)
+
'
" name="server" class="new-chatroom-server" placeholder="
'
+
((
__t
=
(
label_server
))
==
null
?
''
:
__t
)
+
'
"/>
\n
<input type="submit" class="pure-button button-primary" name="join" value="
'
+
((
__t
=
(
label_join
))
==
null
?
''
:
__t
)
+
'
"/>
\n
<input type="button" class="pure-button button-secondary" name="show" id="show-rooms" value="
'
+
((
__t
=
(
label_show_rooms
))
==
null
?
''
:
__t
)
+
'
"/>
\n
</fieldset>
\n
</form>
\n
<dl id="available-chatrooms"></dl>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
roster
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<form class="pure-form roster-filter-group input-button-group">
\n
<input value="
'
+
((
__t
=
(
filter_text
))
==
null
?
''
:
__t
)
+
'
" class="roster-filter"
\n
placeholder="
'
+
((
__t
=
(
placeholder
))
==
null
?
''
:
__t
)
+
'
"
\n
'
;
if
(
filter_type
===
'
state
'
)
{
;
__p
+=
'
style="display: none"
'
;
}
;
__p
+=
'
>
\n
<select class="state-type"
'
;
if
(
filter_type
!==
'
state
'
)
{
;
__p
+=
'
style="display: none"
'
;
}
;
__p
+=
'
>
\n
<option value="">
'
+
((
__t
=
(
label_any
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option
'
;
if
(
chat_state
===
'
online
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="online">
'
+
((
__t
=
(
label_online
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option
'
;
if
(
chat_state
===
'
chat
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="chat">
'
+
((
__t
=
(
label_chatty
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option
'
;
if
(
chat_state
===
'
dnd
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="dnd">
'
+
((
__t
=
(
label_busy
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option
'
;
if
(
chat_state
===
'
away
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="away">
'
+
((
__t
=
(
label_away
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option
'
;
if
(
chat_state
===
'
xa
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="xa">
'
+
((
__t
=
(
label_xa
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option
'
;
if
(
chat_state
===
'
offline
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="offline">
'
+
((
__t
=
(
label_offline
))
==
null
?
''
:
__t
)
+
'
</option>
\n
</select>
\n
<select class="filter-type">
\n
<option
'
;
if
(
filter_type
===
'
contacts
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="contacts">
'
+
((
__t
=
(
label_contacts
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option
'
;
if
(
filter_type
===
'
groups
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="groups">
'
+
((
__t
=
(
label_groups
))
==
null
?
''
:
__t
)
+
'
</option>
\n
<option
'
;
if
(
filter_type
===
'
state
'
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
\n
value="state">
'
+
((
__t
=
(
label_state
))
==
null
?
''
:
__t
)
+
'
</option>
\n
</select>
\n
</form>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
roster_item
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<a class="open-chat" title="
'
+
((
__t
=
(
title_fullname
))
==
null
?
''
:
__t
)
+
'
:
'
+
((
__t
=
(
fullname
))
==
null
?
''
:
__t
)
+
'
\n
JID:
'
+
((
__t
=
(
jid
))
==
null
?
''
:
__t
)
+
'
\n
'
+
((
__t
=
(
desc_chat
))
==
null
?
''
:
__t
)
+
'
" href="#"><span class="icon-
'
+
((
__t
=
(
chat_status
))
==
null
?
''
:
__t
)
+
'
" title="
'
+
((
__t
=
(
desc_status
))
==
null
?
''
:
__t
)
+
'
"></span>
'
+
((
__t
=
(
fullname
))
==
null
?
''
:
__t
)
+
'
</a>
\n
'
;
if
(
allow_contact_removal
)
{
;
__p
+=
'
\n
<a class="remove-xmpp-contact icon-remove" title="
'
+
((
__t
=
(
desc_remove
))
==
null
?
''
:
__t
)
+
'
" href="#"></a>
\n
'
;
}
;
__p
+=
'
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
search_contact
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<li>
\n
<form class="search-xmpp-contact">
\n
<input type="text"
\n
name="identifier"
\n
class="username"
\n
placeholder="
'
+
((
__t
=
(
label_contact_name
))
==
null
?
''
:
__t
)
+
'
"/>
\n
<button type="submit">
'
+
((
__t
=
(
label_search
))
==
null
?
''
:
__t
)
+
'
</button>
\n
</form>
\n
</li>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
select_option
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<option value="
'
+
((
__t
=
(
value
))
==
null
?
''
:
__t
)
+
'
"
'
;
if
(
selected
)
{
;
__p
+=
'
selected="selected"
'
;
}
;
__p
+=
'
>
'
+
((
__t
=
(
label
))
==
null
?
''
:
__t
)
+
'
</option>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
status_option
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<li>
\n
<a href="#" class="
'
+
((
__t
=
(
value
))
==
null
?
''
:
__t
)
+
'
" data-value="
'
+
((
__t
=
(
value
))
==
null
?
''
:
__t
)
+
'
">
\n
<span class="icon-
'
+
((
__t
=
(
value
))
==
null
?
''
:
__t
)
+
'
"></span>
\n
'
+
((
__t
=
(
text
))
==
null
?
''
:
__t
)
+
'
\n
</a>
\n
</li>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
toggle_chats
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
((
__t
=
(
Minimized
))
==
null
?
''
:
__t
)
+
'
<span id="minimized-count">(
'
+
((
__t
=
(
num_minimized
))
==
null
?
''
:
__t
)
+
'
)</span>
\n
<span class="unread-message-count"
\n
'
;
if
(
!
num_unread
)
{
;
__p
+=
'
style="display: none"
'
;
}
;
__p
+=
'
\n
href="#">
'
+
((
__t
=
(
num_unread
))
==
null
?
''
:
__t
)
+
'
</span>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
toolbar
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
if
(
show_emoticons
)
{
;
__p
+=
'
\n
<li class="toggle-smiley icon-happy" title="
'
+
((
__t
=
(
label_insert_smiley
))
==
null
?
''
:
__t
)
+
'
">
\n
<ul>
\n
<li><a class="icon-smiley" href="#" data-emoticon=":)"></a></li>
\n
<li><a class="icon-wink" href="#" data-emoticon=";)"></a></li>
\n
<li><a class="icon-grin" href="#" data-emoticon=":D"></a></li>
\n
<li><a class="icon-tongue" href="#" data-emoticon=":P"></a></li>
\n
<li><a class="icon-cool" href="#" data-emoticon="8)"></a></li>
\n
<li><a class="icon-evil" href="#" data-emoticon=">:)"></a></li>
\n
<li><a class="icon-confused" href="#" data-emoticon=":S"></a></li>
\n
<li><a class="icon-wondering" href="#" data-emoticon=":
\\
"></a></li>
\n
<li><a class="icon-angry" href="#" data-emoticon=">:("></a></li>
\n
<li><a class="icon-sad" href="#" data-emoticon=":("></a></li>
\n
<li><a class="icon-shocked" href="#" data-emoticon=":O"></a></li>
\n
<li><a class="icon-thumbs-up" href="#" data-emoticon="(^.^)b"></a></li>
\n
<li><a class="icon-heart" href="#" data-emoticon="<3"></a></li>
\n
</ul>
\n
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
show_call_button
)
{
;
__p
+=
'
\n
<li class="toggle-call"><a class="icon-phone" title="
'
+
((
__t
=
(
label_start_call
))
==
null
?
''
:
__t
)
+
'
"></a></li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
show_occupants_toggle
)
{
;
__p
+=
'
\n
<li class="toggle-occupants"><a class="icon-hide-users" title="
'
+
((
__t
=
(
label_hide_occupants
))
==
null
?
''
:
__t
)
+
'
"></a></li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
show_clear_button
)
{
;
__p
+=
'
\n
<li class="toggle-clear"><a class="icon-remove" title="
'
+
((
__t
=
(
label_clear
))
==
null
?
''
:
__t
)
+
'
"></a></li>
\n
'
;
}
;
__p
+=
'
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
toolbar_otr
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
if
(
allow_otr
)
{
;
__p
+=
'
\n
<li class="toggle-otr
'
+
((
__t
=
(
otr_status_class
))
==
null
?
''
:
__t
)
+
'
" title="
'
+
((
__t
=
(
otr_tooltip
))
==
null
?
''
:
__t
)
+
'
">
\n
<span class="chat-toolbar-text">
'
+
((
__t
=
(
otr_translated_status
))
==
null
?
''
:
__t
)
+
'
</span>
\n
'
;
if
(
otr_status
==
UNENCRYPTED
)
{
;
__p
+=
'
\n
<span class="icon-unlocked"></span>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
otr_status
==
UNVERIFIED
)
{
;
__p
+=
'
\n
<span class="icon-lock"></span>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
otr_status
==
VERIFIED
)
{
;
__p
+=
'
\n
<span class="icon-lock"></span>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
otr_status
==
FINISHED
)
{
;
__p
+=
'
\n
<span class="icon-unlocked"></span>
\n
'
;
}
;
__p
+=
'
\n
<ul>
\n
'
;
if
(
otr_status
==
UNENCRYPTED
)
{
;
__p
+=
'
\n
<li><a class="start-otr" href="#">
'
+
((
__t
=
(
label_start_encrypted_conversation
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
otr_status
!=
UNENCRYPTED
)
{
;
__p
+=
'
\n
<li><a class="start-otr" href="#">
'
+
((
__t
=
(
label_refresh_encrypted_conversation
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
<li><a class="end-otr" href="#">
'
+
((
__t
=
(
label_end_encrypted_conversation
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
<li><a class="auth-otr" data-scheme="smp" href="#">
'
+
((
__t
=
(
label_verify_with_smp
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
'
;
}
;
__p
+=
'
\n
'
;
if
(
otr_status
==
UNVERIFIED
)
{
;
__p
+=
'
\n
<li><a class="auth-otr" data-scheme="fingerprint" href="#">
'
+
((
__t
=
(
label_verify_with_fingerprints
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
'
;
}
;
__p
+=
'
\n
<li><a href="http://www.cypherpunks.ca/otr/help/3.2.0/levels.php" target="_blank" rel="noopener">
'
+
((
__t
=
(
label_whats_this
))
==
null
?
''
:
__t
)
+
'
</a></li>
\n
</ul>
\n
</li>
\n
'
;
}
;
__p
+=
'
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
trimmed_chat
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
,
__j
=
Array
.
prototype
.
join
;
function
print
()
{
__p
+=
__j
.
call
(
arguments
,
''
)
}
with
(
obj
)
{
__p
+=
'
<a class="chatbox-btn close-chatbox-button icon-close"></a>
\n
<a class="chat-head-message-count"
\n
'
;
if
(
!
num_unread
)
{
;
__p
+=
'
style="display: none"
'
;
}
;
__p
+=
'
\n
href="#">
'
+
((
__t
=
(
num_unread
))
==
null
?
''
:
__t
)
+
'
</a>
\n
<a href="#" class="restore-chat" title="
'
+
((
__t
=
(
tooltip
))
==
null
?
''
:
__t
)
+
'
">
\n
'
+
((
__t
=
(
title
))
==
null
?
''
:
__t
)
+
'
\n
</a>
\n
'
;
}
return
__p
};
this
[
"
templates
"
][
"
vcard
"
]
=
function
(
obj
)
{
obj
||
(
obj
=
{});
var
__t
,
__p
=
''
,
__e
=
_
.
escape
;
with
(
obj
)
{
__p
+=
'
<form class="pure-form converse-form vcard-info">
\n
<fieldset>
\n
<legend>The VCard info gets rendered here</legend>
\n
<label>Full name:</label>
\n
'
+
((
__t
=
(
fullname
))
==
null
?
''
:
__t
)
+
'
\n
<label>URL:</label>
\n
'
+
((
__t
=
(
url
))
==
null
?
''
:
__t
)
+
'
\n
</fieldset>
\n
<fieldset>
\n
<input type="button" class="pure-button button-cancel" value="
'
+
((
__t
=
(
label_return
))
==
null
?
''
:
__t
)
+
'
"/>
\n
</fieldset>
\n
</form>
\n
'
;
}
return
__p
};
\ No newline at end of file
docs/CHANGES.md
View file @
90d1071d
...
...
@@ -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]
...
...
docs/source/builds.rst
View file @
90d1071d
...
...
@@ -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 bund
les are contained in the ``./dist`` directory:
The
Javascript build fi
les 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`:
...
...
non_amd.html
View file @
90d1071d
...
...
@@ -14,31 +14,31 @@
<link
type=
"text/css"
rel=
"stylesheet"
media=
"screen"
href=
"css/converse.css"
/>
<!-- BEGIN JQUERY -->
<script
type=
"text/javascript"
src=
"
component
s/jquery/dist/jquery.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/jquery.browser/dist/jquery.browser.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/jquery/dist/jquery.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/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=
"
component
s/otr/build/dep/salsa20.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/build/dep/salsa20.js"
></script>
<script
type=
"text/javascript"
src=
"src/bigint.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/vendor/cryptojs/core.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/vendor/cryptojs/enc-base64.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/vendor/cryptojs/core.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/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=
"
component
s/otr/vendor/cryptojs/cipher-core.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/vendor/cryptojs/aes.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/vendor/cryptojs/sha1.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/vendor/cryptojs/sha256.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/vendor/cryptojs/hmac.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/vendor/cryptojs/pad-nopadding.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/vendor/cryptojs/mode-ctr.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/otr/build/dep/eventemitter.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/vendor/cryptojs/cipher-core.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/vendor/cryptojs/aes.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/vendor/cryptojs/sha1.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/vendor/cryptojs/sha256.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/vendor/cryptojs/hmac.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/vendor/cryptojs/pad-nopadding.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/otr/vendor/cryptojs/mode-ctr.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/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/strophe
js/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=
"
component
s/underscore/underscore.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/backbone//backbone.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/backbone.browserStorage/backbone.browserStorage.js"
></script>
<script
type=
"text/javascript"
src=
"
component
s/backbone.overview/backbone.overview.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/underscore/underscore.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/backbone//backbone.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/backbone.browserStorage/backbone.browserStorage.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/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=
"
component
s/jed/jed.js"
></script>
<script
type=
"text/javascript"
src=
"
node_module
s/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"
>
...
...
src/converse-chatview.js
View file @
90d1071d
...
...
@@ -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
,
...
...
src/converse-controlbox.js
View file @
90d1071d
...
...
@@ -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
;
...
...
src/converse-core.js
View file @
90d1071d
...
...
@@ -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
);
...
...
src/converse-minimize.js
View file @
90d1071d
...
...
@@ -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
,
...
...
src/converse-muc.js
View file @
90d1071d
...
...
@@ -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
,
...
...
src/converse-otr.js
View file @
90d1071d
...
...
@@ -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
,
...
...
src/converse-register.js
View file @
90d1071d
...
...
@@ -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
,
...
...
src/converse-rosterview.js
View file @
90d1071d
...
...
@@ -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
,
...
...
src/converse-templates.js
deleted
100644 → 0
View file @
aef32fed
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
]
};
});
src/converse-vcard.js
View file @
90d1071d
...
...
@@ -19,7 +19,6 @@
_
=
converse_api
.
env
.
_
,
moment
=
converse_api
.
env
.
moment
;
converse_api
.
plugins
.
add
(
'
converse-vcard
'
,
{
overrides
:
{
...
...
src/templates/pending_contacts.html
deleted
100644 → 0
View file @
aef32fed
<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>
src/templates/requesting_contacts.html
deleted
100644 → 0
View file @
aef32fed
<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>
src/templates/vcard.html
deleted
100644 → 0
View file @
aef32fed
<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>
src/utils.js
View file @
90d1071d
...
...
@@ -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
$
(
t
emplates
.
field
({
return
$
(
t
pl_
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
(
t
emplates
.
select_option
({
options
.
push
(
t
pl_
select_option
({
value
:
value
,
label
:
$
(
$options
[
j
]).
attr
(
'
label
'
),
selected
:
(
values
.
indexOf
(
value
)
>=
0
),
required
:
$field
.
find
(
'
required
'
).
length
}));
}
return
t
emplates
.
form_select
({
return
t
pl_
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
t
emplates
.
form_textarea
({
return
t
pl_
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
t
emplates
.
form_checkbox
({
return
t
pl_
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
t
emplates
.
form_username
({
return
t
pl_
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
t
emplates
.
form_input
({
return
t
pl_
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
t
emplates
.
form_captcha
({
return
t
pl_
form_captcha
({
label
:
this
.
$field
.
attr
(
'
label
'
),
name
:
this
.
$field
.
attr
(
'
var
'
),
data
:
this
.
$stanza
.
find
(
'
data[cid="
'
+
uri
.
textContent
.
replace
(
/^cid:/
,
''
)
+
'
"]
'
).
text
(),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment