Commit e9c1d175 authored by JC Brand's avatar JC Brand

Merge branch 'master' of github.com:jcbrand/converse.js

parents 6786d1b7 38e6012f
......@@ -1949,6 +1949,9 @@ body {
line-height: 22px; }
#conversejs .chatbox .chat-body .chat-message .chat-msg-content {
line-height: 22px; }
#conversejs .chatbox .chat-body .chat-message .chat-msg-content .emojione {
height: 22px;
margin-bottom: -5.5px; }
#conversejs .chatbox .chat-content {
padding: 0 1em 1em 1em;
border-top-left-radius: 7px;
......
......@@ -28,6 +28,28 @@ h5 {
margin-right: 0.5em;
}
.nav-header {
font-weight: bold;
font-size: 110%;
}
.sidebar-title {
padding-left: 15px;
}
#sidebar > .nav-list {
height: 100vh;
overflow-y: scroll;
}
.bs-sidenav .nav .nav > li > a {
font-size: 100%;
}
.bs-sidenav .nav .nav .nav > li > a {
font-size: 90%;
color: gray;
}
/*
Copyright (c) 2012 Terrence Ryan
......
{#
basic/localtoc.html
~~~~~~~~~~~~~~~~~~~
Sphinx sidebar template: local table of contents.
:copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
{%- if display_toc %}
<h3 class="sidebar-title"><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
{{ toc }}
{%- endif %}
......@@ -47,7 +47,7 @@ This command does the following:
* Also, the CSS files in the ``./css`` directory will be minified.
The Javascript build files are contained in the ``./dist`` directory:
The JavaScript build files are contained in the ``./dist`` directory:
.. code-block:: bash
......
......@@ -41,7 +41,7 @@ master_doc = 'index'
# General information about the project.
project = u'Converse.js'
copyright = u'2014, JC Brand'
copyright = u'2017, JC Brand'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
......@@ -177,7 +177,7 @@ html_favicon = "_static/favicon.ico"
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
html_sidebars = {'**': ['localtoc.html', 'sourcelink.html', 'searchbox.html']}
# Additional templates that should be rendered to pages, maps page names to
# template names.
......
......@@ -6,10 +6,6 @@
Configuration
=============
.. contents:: Table of Contents
:depth: 2
:local:
The included minified JS and CSS files can be used for demoing or testing, but
you'll want to configure *Converse.js* to suit your needs before you deploy it
on your website.
......@@ -261,7 +257,7 @@ If ``authentication`` is set to ``anonymous``, then you will also need to provid
server's domain via the `jid`_ setting.
This is a useful setting if you'd like to create a custom login form in your
website. You'll need to write some Javascript to accept that custom form's
website. You'll need to write some JavaScript to accept that custom form's
login credentials, then you can pass those credentials (``jid`` and
``password``) to ``converse.initialize`` to start converse.js and log the user
into their XMPP account.
......@@ -1341,7 +1337,7 @@ xhr_custom_status
* Default: ``false``
.. note::
XHR stands for XMLHTTPRequest, and is meant here in the AJAX sense (Asynchronous Javascript and XML).
XHR stands for XMLHTTPRequest, and is meant here in the AJAX sense (Asynchronous JavaScript and XML).
This option will let converse.js make an AJAX POST with your changed custom chat status to a
remote server.
......@@ -1350,7 +1346,7 @@ xhr_custom_status_url
---------------------
.. note::
XHR stands for XMLHTTPRequest, and is meant here in the AJAX sense (Asynchronous Javascript and XML).
XHR stands for XMLHTTPRequest, and is meant here in the AJAX sense (Asynchronous JavaScript and XML).
* Default: Empty string
......@@ -1367,7 +1363,7 @@ xhr_user_search
* Default: ``false``
.. note::
XHR stands for XMLHTTPRequest, and is meant here in the AJAX sense (Asynchronous Javascript and XML).
XHR stands for XMLHTTPRequest, and is meant here in the AJAX sense (Asynchronous JavaScript and XML).
There are two ways to add users.
......@@ -1392,7 +1388,7 @@ xhr_user_search_url
-------------------
.. note::
XHR stands for XMLHTTPRequest, and is meant here in the AJAX sense (Asynchronous Javascript and XML).
XHR stands for XMLHTTPRequest, and is meant here in the AJAX sense (Asynchronous JavaScript and XML).
* Default: Empty string
......
......@@ -6,10 +6,6 @@
The converse.js developer API
=============================
.. contents:: Table of Contents
:depth: 2
:local:
.. note:: The API documented here is available in Converse.js 0.8.4 and higher.
Earlier versions of Converse.js might have different API methods or none at all.
......@@ -50,7 +46,7 @@ Public API methods
==================
Publich API methods are those methods that are accessible on the global
``window.converse`` object. They are public, because any Javascript in the page
``window.converse`` object. They are public, because any JavaScript in the page
can call them. Public methods therefore don't expose any sensitive or closured
data. To do that, you'll need to create a plugin, which has access to the
private API method.
......@@ -325,7 +321,7 @@ room under the ``with`` key.
The ``start`` and ``end`` parameters are used to query for messages
within a certain timeframe. The passed in date values may either be ISO8601
formatted date strings, or Javascript Date objects.
formatted date strings, or JavaScript Date objects.
.. code-block:: javascript
......@@ -1070,7 +1066,7 @@ Example:
The **listen** grouping
-----------------------
Converse.js emits events to which you can subscribe from your own Javascript.
Converse.js emits events to which you can subscribe from your own JavaScript.
Concerning events, the following methods are available under the "listen"
grouping:
......
......@@ -5,11 +5,7 @@
Developer guidelines
====================
.. contents:: Table of Contents
:depth: 2
:local:
If you want to work with the non-minified Javascript and CSS files you'll soon
If you want to work with the non-minified JavaScript and CSS files you'll soon
notice that there are references to a missing *node_modules* directory.
Please follow the instructions below to create these directories and fetch Converse's
3rd-party dependencies.
......@@ -97,7 +93,7 @@ Without AMD and require.js
Converse.js can also be used without require.js. If you for some reason prefer
to use it this way, please refer to
`non_amd.html <https://github.com/jcbrand/converse.js/blob/master/non_amd.html>`_
for an example of how and in what order all the Javascript files that converse.js
for an example of how and in what order all the JavaScript files that converse.js
depends on need to be loaded.
Brief description of converse.js's dependencies
......
......@@ -6,10 +6,6 @@
Writing Documentation
=====================
.. contents:: Table of Contents
:depth: 2
:local:
.. note:: Contributions to the documentation are much appreciated.
What is used to write the documentation?
......
......@@ -7,10 +7,6 @@
Events and promises
===================
.. contents:: Table of Contents
:depth: 2
:local:
Converse.js and its plugins emit various events which you can listen to via the
:ref:`listen-grouping`.
......
......@@ -6,10 +6,6 @@
Features
========
.. contents:: Table of Contents
:depth: 2
:local:
Off-the-record encryption
=========================
......@@ -21,7 +17,7 @@ The OTR protocol not only **encrypts your messages**, it provides ways to
**plausible deniability** and **perfect forward secrecy** by generating
new encryption keys for each conversation.
In its current state, Javascript cryptography is fraught with dangers and
In its current state, JavaScript cryptography is fraught with dangers and
challenges that make it impossible to reach the same standard of security that
is available with native "desktop" software.
......@@ -29,8 +25,8 @@ This is due to its runtime malleability, the way it is "installed" (e.g.
served) and the browser's lack of cryptographic primitives needed to implement
secure crypto.
For harsh but fairly valid criticism of Javascript cryptography, read:
`Javascript Cryptography Considered Harmful <http://www.matasano.com/articles/javascript-cryptography/>`_.
For harsh but fairly valid criticism of JavaScript cryptography, read:
`JavaScript Cryptography Considered Harmful <http://www.matasano.com/articles/javascript-cryptography/>`_.
To get an idea on how this applies to OTR support in Converse.js, please read
`my thoughts on it <https://opkode.com/media/blog/2013/11/11/conversejs-otr-support>`_.
......
......@@ -23,7 +23,7 @@ Introduction
============
Converse.js is a free and open-source `XMPP <http://xmpp.org/about-xmpp/>`_
chat client written in Javascript which can be tightly integrated into any website.
chat client written in JavaScript which can be tightly integrated into any website.
The benefit of using converse.js as opposed to relying on a SaaS
(software-as-a-service) solution, is that your users can have a much more
......
......@@ -10,10 +10,6 @@ The Converse.js User Manual
<br />
.. contents:: Table of Contents
:depth: 2
:local:
.. figure:: images/homepage.jpg
:align: right
:alt: The converse.js website
......
......@@ -5,10 +5,6 @@
Integrating converse.js into other frameworks
=============================================
.. contents:: Table of Contents
:depth: 2
:local:
Angular.js
----------
......
......@@ -7,36 +7,68 @@
Writing a plugin
================
.. contents:: Table of Contents
:depth: 2
:local:
Introduction
------------
Developers are able to extend and override the objects, functions and the
Backbone models and views that make up converse.js by means of writing plugins.
Converse.js is exposes a plugin architecture which allows developers to modify
and extend its functionality.
Specifically, plugins enable developers to extend and override existing objects,
functions and `Backbone <http://backbonejs.org/>`_ models and views that make up
Converse.js, and also give them the ability to write new models and views.
Various core features of Converse.js, such as
`Message Archive Management <https://xmpp.org/extensions/xep-0313.html>`_ and
`Group chats <https://xmpp.org/extensions/xep-0045.html>`_ are implemented
as plugins, thereby showing their power and flexibility.
Converse.js uses `pluggable.js <https://github.com/jcbrand/pluggable.js/>`_ as
its plugin architecture.
To understand how this plugin architecture works, please read the
To more deeply understand how this plugin architecture works, please read the
`pluggable.js documentation <https://jcbrand.github.io/pluggable.js/>`_
and to understand its inner workins, please refer to the `annotated source code
<https://jcbrand.github.io/pluggable.js/docs/pluggable.html>`_.
Below you'll find an example plugin. Because convers.js is only Javascript,
HTML and CSS (with no backend code required like PHP, Python or Ruby) it runs
fine in JSFiddle.
Trying out a plugin in JSFiddle
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Because Converse.js consists only of JavaScript, HTML and CSS (with no backend
code required like PHP, Python or Ruby) it runs fine in JSFiddle.
Here's an Fiddle with a Converse.js plugin that calls `alert` once it gets
initialized and also when a chat message gets rendered:
https://jsfiddle.net/4drfaok0/15/
Generating a plugin with Yeoman
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here's an Fiddle with a plugin that calls `alert` when the plugin gets
initialized and when a message gets rendered: https://jsfiddle.net/4drfaok0/15/
The rest of this document explains how to write a plugin for Converse.js, and
ends with a documented example of a plugin.
You can use a `Yeoman <http://yeoman.io/>`_ code generator, called
`generator-conversejs <https://github.com/jcbrand/generator-conversejs>`_ to
generate plugin scaffolding code, which you can use as a starting point and
basis for writing your plugin.
Please refer to the `generator-conversejs <https://github.com/jcbrand/generator-conversejs>`_
README for information on how to use it.
Registering a plugin
--------------------
You register a converse.js plugin as follows:
Plugins need to be registered (and whitelisted) before they can be loaded and
initialized.
You register a converse.js plugin by calling ``converse.plugins.add``.
The plugin itself is a JavaScript object which usually has at least an
``initialize`` method, which gets called at the end of the
``converse.initialize`` method which is the top-level method that gets called
by the website to configure and initialize Converse.js itself.
Here's an example code snippet:
.. code-block:: javascript
......@@ -56,7 +88,6 @@ You register a converse.js plugin as follows:
`converse.initialize` is called. Otherwise the plugin will never get
registered and never get called.
Whitelisting of plugins
-----------------------
......@@ -234,7 +265,7 @@ A full example plugin
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as a module called "myplugin"
define("myplugin", ["converse"], factory);
define("<%= name %>", ["converse"], factory);
} else {
// Browser globals. If you're not using a module loader such as require.js,
// then this line below executes. Make sure that your plugin's <script> tag
......@@ -256,121 +287,130 @@ A full example plugin
moment = converse.env.moment;
// The following line registers your plugin.
converse.plugins.add('myplugin', {
initialize: function () {
// Converse.js's plugin mechanism will call the initialize
// method on any plugin (if it exists) as soon as the plugin has
// been loaded.
converse.plugins.add("<%= name %>", {
/* Optional dependencies are other plugins which might be
* overridden or relied upon, and therefore need to be loaded before
* this plugin. They are called "optional" because they might not be
* available, in which case any overrides applicable to them will be
* ignored.
*
* NB: These plugins need to have already been loaded via require.js.
*
* It's possible to make optional dependencies non-optional.
* If the setting "strict_plugin_dependencies" is set to true,
* an error will be raised if the plugin is not found.
*/
'optional_dependencies': [],
/* Converse.js's plugin mechanism will call the initialize
* method on any plugin (if it exists) as soon as the plugin has
* been loaded.
*/
'initialize': function () {
/* Inside this method, you have access to the private
* `_converse` object.
*/
var _converse = this._converse;
// Inside this method, you have access to the closured
// _converse object, from which you can get any configuration
// options that the user might have passed in via
// converse.initialize. These values are stored in the
// "user_settings" attribute.
// We can also specify new configuration settings for this
// plugin, or override the default values of existing
// configuration settings. This is done like so:
_converse.log("The <%= name %> plugin is being initialized");
/* From the `_converse` object you can get any configuration
* options that the user might have passed in via
* `converse.initialize`. These values are stored in the
* "user_settings" attribute.
*
* You can also specify new configuration settings for this
* plugin, or override the default values of existing
* configuration settings. This is done like so:
*/
_converse.api.settings.update({
'initialize_message': 'Initialized', // New configuration setting
'auto_subscribe': true, // New default value for an
// existing "core" configuration setting
'initialize_message': 'Initializing <%= name %>!'
});
// The user can then pass in values for the configuration
// settings when `converse.initialize` gets called.
// For example:
//
// converse.initialize({
// "initialize_message": "My plugin has been initialized"
// });
//
// And the configuration setting is then available via the
// `user_settings` attribute:
// alert(this._converse.user_settings.initialize_message);
// Besides `_converse.api.settings.update`, there is also a
// `_converse.api.promises.add` method, which allows you to
// add new promises that your plugin is obligated to fulfill.
// This method takes a string or a list of strings which
// represent the promise names.
_converse.api.promises.add('operationCompleted');
// Your plugin should then, when appropriate, resolve the
// promise by calling `_converse.api.emit`, which will also
// emit an event with the same name as the promise.
// For example:
// _converse.api.emit('operationCompleted');
//
// Other plugins can then either listen for the event
// `operationCompleted` like so:
// `_converse.api.listen.on('operationCompleted', function { ... });`
//
// or they can wait for the promise to be fulfilled like so:
// `_converse.api.waitUntil('operationCompleted', function { ... });`
/* The user can then pass in values for the configuration
* settings when `converse.initialize` gets called.
* For example:
*
* converse.initialize({
* "initialize_message": "My plugin has been initialized"
* });
*
* And the configuration setting is then available via the
* `user_settings` attribute:
*/
alert(this._converse.user_settings.initialize_message);
/* Besides `_converse.api.settings.update`, there is also a
* `_converse.api.promises.add` method, which allows you to
* add new promises that your plugin is obligated to fulfill.
*
* This method takes a string or a list of strings which
* represent the promise names:
*
* _converse.api.promises.add('myPromise');
*
* Your plugin should then, when appropriate, resolve the
* promise by calling `_converse.api.emit`, which will also
* emit an event with the same name as the promise.
* For example:
*
* _converse.api.emit('operationCompleted');
*
* Other plugins can then either listen for the event
* `operationCompleted` like so:
*
* _converse.api.listen.on('operationCompleted', function { ... });
*
* or they can wait for the promise to be fulfilled like so:
*
* _converse.api.waitUntil('operationCompleted', function { ... });
*/
},
// Optional dependencies are other plugins which might be
// overridden or relied upon, and therefore need to be loaded before
// this plugin. They are called "optional" because they might not be
// available, in which case any overrides applicable to them will be
// ignored.
// It's possible however to make optional dependencies non-optional.
// If the setting "strict_plugin_dependencies" is set to true,
// an error will be raised if the plugin is not found.
//
// NB: These plugins need to have already been loaded via require.js.
optional_dependencies: [],
overrides: {
// If you want to override some function or a Backbone model or
// view defined elsewhere in converse.js, then you do that under
// this "overrides" namespace.
// For example, the inner protected *_converse* object has a
// method "onConnected". You can override that method as follows:
onConnected: function () {
/* If you want to override some function or a Backbone model or
* view defined elsewhere in converse.js, then you do that under
* the "overrides" namespace.
*/
'overrides': {
/* For example, the private *_converse* object has a
* method "onConnected". You can override that method as follows:
*/
'onConnected': function () {
// Overrides the onConnected method in converse.js
// Top-level functions in "overrides" are bound to the
// inner "_converse" object.
var _converse = this;
// Your custom code comes here.
// ...
// Your custom code can come here ...
// You can access the original function being overridden
// via the __super__ attribute.
// Make sure to pass on the arguments supplied to this
// function and also to apply the proper "this" object.
_converse.__super__.onConnected.apply(this, arguments);
// Your custom code can come here ...
},
XMPPStatus: {
// Override converse.js's XMPPStatus Backbone model so that we can override the
// function that sends out the presence stanza.
sendPresence: function (type, status_message, jid) {
/* Override converse.js's XMPPStatus Backbone model so that we can override the
* function that sends out the presence stanza.
*/
'XMPPStatus': {
'sendPresence': function (type, status_message, jid) {
// The "_converse" object is available via the __super__
// attribute.
var _converse = this.__super__._converse;
// Custom code can come here
// ...
// Custom code can come here ...
// You can call the original overridden method, by
// accessing it via the __super__ attribute.
// When calling it, you need to apply the proper
// context as reference by the "this" variable.
this.__super__.sendPresence.apply(this, arguments);
// Custom code can come here ...
}
}
}
......
......@@ -13,7 +13,7 @@ Use the content delivery network
--------------------------------
Converse.js has a `CDN <https://en.wikipedia.org/wiki/Content_delivery_network>`_, provided by `KeyCDN <http://keycdn.com/>`_,
which hosts its Javascript and CSS files.
which hosts its JavaScript and CSS files.
The latest versions of these files are available at these URLs:
......@@ -44,7 +44,7 @@ Initializing Converse.js
You'll then need to initialize Converse.js with configuration settings relevant to your requirements.
Refer to the :ref:`configuration-settings` section for info on all the available configuration settings.
To quickly get started, you can put the following Javascript code at the
To quickly get started, you can put the following JavaScript code at the
bottom of your page (after the closing *</body>* element)::
<script>
......@@ -75,7 +75,7 @@ for an example of this build being used. There's an additional CSS file called
``mobile.min.css`` which should be used with the mobile build.
When you load `conversejs.org <https://conversejs.org>`_ with a mobile device
then the mobile Javascript build and its CSS will be used.
then the mobile JavaScript build and its CSS will be used.
Excluding 3rd party dependencies
--------------------------------
......
......@@ -57,7 +57,7 @@ Addititional measures
Besides the measures mentioned above, integrators and hosts can also take
further security precautions.
The most effective is to avoid serving untrusted 3rd party Javascript (e.g.
The most effective is to avoid serving untrusted 3rd party JavaScript (e.g.
advertisements and analytics).
Another option is to forego the use of a global ``converse`` object (which
......
......@@ -6,10 +6,6 @@
Setup and integration
=====================
.. contents:: Table of Contents
:depth: 2
:local:
.. _what-you-will-need:
------------------
......
......@@ -5,19 +5,15 @@
Software Style Guide
====================
.. contents:: Table of Contents
:depth: 2
:local:
.. note:: Converse.js doesn't yet use any of the new `ES2015
<https://babeljs.io/docs/learn-es2015/>`_ features, because we don't
rely on a transpiler and still support older browsers.
Most of the style guide recommendations here come from Douglas Crockford's book
`Javascript, the good parts <http://shop.oreilly.com/product/9780596517748.do>`_
`JavaScript, the good parts <http://shop.oreilly.com/product/9780596517748.do>`_
This style guide is fairly opinionated. Some of these opinions perhaps don't
conform to your expectations on how Javascript code should look like.
conform to your expectations on how JavaScript code should look like.
I apologize for that. However, for the sake of sanity, consistency and having
code that is pleasing to the eye, please stick to these guidelines.
......@@ -103,7 +99,7 @@ and method invocations.
Checking for equality
---------------------
Javascript has a strict ``===`` and less strict ``==`` equality operator. The
JavaScript has a strict ``===`` and less strict ``==`` equality operator. The
stricter equality operator also does type checking. To avoid subtle bugs when
doing comparisons, always use the strict equality check.
......
......@@ -8,10 +8,6 @@
Theming
=======
.. contents:: Table of Contents
:depth: 2
:local:
Setting up your environment
===========================
......@@ -71,7 +67,7 @@ Creating dist files
===================
Once you've themed converse.js, you'll want to create new minified distribution
files of all the Javascript and CSS.
files of all the JavaScript and CSS.
Please refer to the :doc:`builds` section for information on how this is done.
......@@ -6,10 +6,6 @@
Translations
============
.. contents:: Table of Contents
:depth: 2
:local:
.. note::
Translations take up a lot of space and will bloat your minified file.
At the time of writing, all the translations add about 50KB of extra data to
......@@ -59,7 +55,7 @@ translated into, do the following
Please make sure to add the following attributes at the top of the file (under
*Content-Transfer-Encoding*). They are required as configuration settings for Jed,
the Javascript translations library that we're using.
the JavaScript translations library that we're using.
.. code-block:: po
......@@ -90,7 +86,7 @@ The resulting `.po` file is then what gets translated.
-----------------------------------------------------
Generating a Javascript file from a translations file
Generating a JavaScript file from a translations file
-----------------------------------------------------
Unfortunately `Jed <http://slexaxton.github.io/Jed>`_, which we use for
......
......@@ -6,10 +6,6 @@
Troubleshooting and debugging
=============================
.. contents:: Table of Contents
:depth: 2
:local:
General tips on debugging Converse.js
=====================================
......@@ -42,13 +38,13 @@ more likely on the XMPP server's end (perhaps a misconfiguration?). If they
**are** logged, then there might be a bug or misconfiguration in Converse.js.
Conflicts with other Javascript libraries
Conflicts with other JavaScript libraries
=========================================
Problem:
---------
You are using other Javascript libraries (like JQuery plugins), and
You are using other JavaScript libraries (like JQuery plugins), and
get errors like these in your browser console::
Uncaught TypeError: Object [object Object] has no method 'xxx' from example.js
......
......@@ -12,11 +12,11 @@
<link type="text/css" rel="stylesheet" media="screen" href="css/bootstrap.min.css" />
<link type="text/css" rel="stylesheet" media="screen" href="css/font-awesome.min.css" />
<link type="text/css" rel="stylesheet" media="screen" href="css/theme.min.css" />
<link type="text/css" rel="stylesheet" media="screen" href="css/converse.css" />
<script type="text/javascript" src="analytics.js"></script>
<noscript><p><img src="//stats.opkode.com/piwik.php?idsite=1" style="border:0;" alt="" /></p></noscript>
<script src="src/website.js"></script>
<![if gte IE 11]>
<link type="text/css" rel="stylesheet" media="screen" href="css/converse.css" />
<script src="dist/converse.min.js"></script>
<![endif]>
</head>
......
......@@ -51,6 +51,10 @@
}
.chat-msg-content {
line-height: $line-height;
.emojione {
height: $line-height;
margin-bottom: -$line-height/4;
}
}
}
}
......
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