Commit 4d6aed5d authored by JC Brand's avatar JC Brand

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

parents fee1f83c 17da00d5
module.exports = function(grunt) {
var path = require('path');
var cfg = require('./package.json');
grunt.initConfig({
jst: {
compile: {
options: {
namespace: 'templates',
templateSettings: {
evaluate : /\{\[([\s\S]+?)\]\}/g,
interpolate : /\{\{([\s\S]+?)\}\}/g
......@@ -20,6 +22,20 @@ module.exports = function(grunt) {
}
},
json: {
main: {
options: {
namespace: 'locales',
includePath: true,
processName: function(filename) {
return filename.toLowerCase().match(/^locale\/(.*)\/lc_messages/)[1];
}
},
src: ['locale/**/LC_MESSAGES/*.json'],
dest: 'builds/locales.js'
}
},
jshint: {
options: {
trailing: true
......@@ -47,12 +63,18 @@ module.exports = function(grunt) {
dest: 'css/converse.min.css',
src: ['css/converse.css']
}
},
touch: {
npm: ['stamp-npm'],
bower: ['stamp-bower']
}
});
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-jst');
grunt.loadNpmTasks('grunt-json');
grunt.loadNpmTasks('grunt-contrib-requirejs');
grunt.loadNpmTasks('grunt-touch');
grunt.registerTask('test', 'Run Tests', function () {
var done = this.async();
......@@ -91,23 +113,26 @@ module.exports = function(grunt) {
var child_process = require('child_process');
var exec = child_process.exec;
var callback = function (err, stdout, stderr) {
grunt.log.write(stdout);
if (err) {
grunt.log.write('build failed with error code '+err.code);
grunt.log.write(stderr);
}
grunt.log.write(stdout);
done();
done(false);
} else
done();
};
exec('./node_modules/requirejs/bin/r.js -o src/build.js && ' +
'./node_modules/requirejs/bin/r.js -o src/build.js optimize=none out=builds/converse.js && ' +
'./node_modules/requirejs/bin/r.js -o src/build-no-jquery.js &&' +
'./node_modules/requirejs/bin/r.js -o src/build-no-jquery.js optimize=none out=builds/converse.nojquery.js && ' +
'./node_modules/requirejs/bin/r.js -o src/build-no-locales-no-otr.js && ' +
'./node_modules/requirejs/bin/r.js -o src/build-no-locales-no-otr.js optimize=none out=builds/converse-no-locales-no-otr.js && ' +
'./node_modules/requirejs/bin/r.js -o src/build-no-otr.js &&' +
'./node_modules/requirejs/bin/r.js -o src/build-no-otr.js optimize=none out=builds/converse-no-otr.js && ' +
'./node_modules/requirejs/bin/r.js -o src/build-website-no-otr.js &&' +
'./node_modules/requirejs/bin/r.js -o src/build-website.js', callback);
var rjsext = (process.platform === 'win32') ? '.cmd' : '';
var rjs = path.resolve('./node_modules/.bin/r.js' + rjsext);
exec(rjs + ' -o src/build.js && ' +
rjs + ' -o src/build.js optimize=none out=builds/converse.js && ' +
rjs + ' -o src/build-no-jquery.js &&' +
rjs + ' -o src/build-no-jquery.js optimize=none out=builds/converse.nojquery.js && ' +
rjs + ' -o src/build-no-locales-no-otr.js && ' +
rjs + ' -o src/build-no-locales-no-otr.js optimize=none out=builds/converse-no-locales-no-otr.js && ' +
rjs + ' -o src/build-no-otr.js &&' +
rjs + ' -o src/build-no-otr.js optimize=none out=builds/converse-no-otr.js && ' +
rjs + ' -o src/build-website-no-otr.js &&' +
rjs + ' -o src/build-website.js', callback);
// XXX: It might be possible to not have separate build config files. For example:
// 'r.js -o src/build.js paths.converse-dependencies=src/deps-no-otr paths.locales=locale/nolocales out=builds/converse-no-locales-no-otr.min.js'
});
......
# You can set these variables from the command line.
BOWER ?= node_modules/.bin/bower
BUILDDIR = ./docs
PAPER =
PHANTOMJS ?= node_modules/.bin/phantomjs
SPHINXBUILD ?= ./bin/sphinx-build
SPHINXOPTS =
PO2JSON ?= node_modules/.bin/po2json
SASS ?= sass
BUILDDIR = ./docs
PAPER =
PHANTOMJS ?= ./node_modules/.bin/phantomjs
SPHINXBUILD ?= ./bin/sphinx-build
SPHINXOPTS =
PO2JSON ?= ./node_modules/.bin/po2json
SASS ?= sass
GRUNT ?= ./node_modules/.bin/grunt
HTTPSERVE ?= ./node_modules/.bin/http-server
# Internal variables.
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./docs/source
......@@ -18,18 +20,27 @@ I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./docs/source
all: dev
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " dev to set up the development environment"
@echo "Please use \`make <target>' where <target> is one of the following"
@echo " build create minified builds containing converse.js and all its dependencies"
@echo " gettext to make PO message catalogs of the documentation"
@echo " html to make standalone HTML files of the documentation"
@echo " pot to generate a gettext POT file to be used for translations"
@echo " po to generate gettext PO files for each i18n language"
@echo " po2json to generate JSON files from the language PO files"
@echo " release to make a new minified release"
@echo " linkcheck to check all documentation external links for integrity"
@echo " epub to export the documentation to epub"
@echo " changes to make an overview of all changed/added/deprecated items added to the documentation"
@echo " changes make an overview of all changed/added/deprecated items added to the documentation"
@echo " css generate CSS from the Sass files"
@echo " dev set up the development environment"
@echo " epub export the documentation to epub"
@echo " gettext make PO message catalogs of the documentation"
@echo " html make standalone HTML files of the documentation"
@echo " linkcheck check all documentation external links for integrity"
@echo " cssmin minify the CSS files"
@echo " po generate gettext PO files for each i18n language"
@echo " po2json generate JSON files from the language PO files"
@echo " pot generate a gettext POT file to be used for translations"
@echo " release make a new minified release"
@echo " serve serve this directory via a webserver on port 8000"
########################################################################
## Miscellaneous
serve: dev
$(HTTPSERVE) -p 8000
########################################################################
## Translation machinery
......@@ -48,12 +59,6 @@ po2json:
########################################################################
## Release management
jsmin:
./node_modules/requirejs/bin/r.js -o src/build.js && ./node_modules/requirejs/bin/r.js -o src/build-no-locales-no-otr.js && ./node_modules/requirejs/bin/r.js -o src/build-no-otr.js && ./node_modules/requirejs/bin/r.js -o src/build-website.js
cssmin:
grunt cssmin
release:
sed -i s/Project-Id-Version:\ Converse\.js\ [0-9]\.[0-9]\.[0-9]/Project-Id-Version:\ Converse.js\ $(VERSION)/ locale/converse.pot
sed -i s/\"version\":\ \"[0-9]\.[0-9]\.[0-9]\"/\"version\":\ \"$(VERSION)\"/ bower.json
......@@ -85,18 +90,24 @@ clean::
dev: clean
npm install
${BOWER} update;
$(BOWER) update;
bundler install --path=.
########################################################################
## Builds
css::
${SASS} sass/converse.scss > css/converse.css
$(SASS) sass/converse.scss > css/converse.css
jsmin:
./node_modules/requirejs/bin/r.js -o src/build.js && ./node_modules/requirejs/bin/r.js -o src/build-no-locales-no-otr.js && ./node_modules/requirejs/bin/r.js -o src/build-no-otr.js && ./node_modules/requirejs/bin/r.js -o src/build-website.js
cssmin:
$(GRUNT) cssmin
build::
./node_modules/.bin/grunt jst
./node_modules/.bin/grunt minify
$(GRUNT) jst
$(GRUNT) minify
########################################################################
## Tests
......
# You can set these variables from the command line.
GRUNT ?= node_modules\.bin\grunt.cmd
BOWER ?= node_modules\.bin\bower
PHANTOMJS ?= node_modules\.bin\phantomjs
SASS ?= sass
RMRF ?= rmdir /q /s
RMF ?= del /q
HTTPSERVE ?= ./node_modules/.bin/http-server
.PHONY: all help clean css minjs build
all: dev
help:
@echo "Please use \`make <target>' where <target> is one of the following"
@echo " dev to set up the development environment"
@echo " build create minified builds containing converse.js and all its dependencies"
@echo " serve to serve this directory via a webserver on port 8000"
########################################################################
## Miscellaneous
serve:
$(HTTPSERVE) -p 8000
########################################################################
## Install dependencies
stamp-npm: package.json
npm install
$(GRUNT) touch:npm
stamp-bower: stamp-npm bower.json
$(BOWER) install
$(GRUNT) touch:bower
clean::
@if EXIST stamp-npm $(RMF) stamp-npm
@if EXIST stamp-bower $(RMF) stamp-bower
@if EXIST node_modules\. $(RMRF) node_modules
@if EXIST components\. $(RMRF) components
dev: clean
npm install
$(BOWER) update
bundler install --path=.
########################################################################
## Builds
css::
$(SASS) sass/converse.scss > css/converse.css
build::
$(GRUNT) jst
$(GRUNT) minify
########################################################################
## Tests
check:: stamp-npm
$(PHANTOMJS) node_modules/phantom-jasmine/lib/run_jasmine_test.coffee tests.html
{
"name": "converse",
"version": "0.8.6",
"name": "converse.js",
"description": "Web-based XMPP/Jabber chat client written in javascript",
"version": "0.9.0",
"license": "MPL",
"devDependencies": {
"jasmine": "https://github.com/jcbrand/jasmine.git#1_3_x",
"otr": "0.2.12",
......@@ -8,29 +10,28 @@
"requirejs-tpl-jcbrand": "*"
},
"dependencies": {
"requirejs": "2.1.11",
"requirejs": "~2.1.15",
"jquery": "1.11.0",
"jed": "0.5.4",
"underscore": "1.6.0",
"backbone": "1.1.2",
"backbone.browserStorage": "*",
"backbone.overview": "*",
"strophe": "~1.1.3",
"strophe.muc": "https://raw.githubusercontent.com/strophe/strophejs-plugins/master/muc/strophe.muc.js",
"otr": "0.2.12",
"crypto-js-evanvosberg": "~3.1.2",
"almond": "~0.2.9",
"almond": "~0.3.0",
"requirejs-text": "~2.0.12",
"requirejs-tpl-jcbrand": "*",
"momentjs": "~2.6.0",
"jquery.browser": "https://raw.githubusercontent.com/jcbrand/jquery-browser-plugin/ae5e88aa7a26f583e8865c3961ba857918c4c9c1/dist/jquery.browser.js",
"jquery.browser": ">=0.0.7",
"jquery-easing-original": "https://raw.githubusercontent.com/jcbrand/jquery.easing/7de3458b1845a72c1f407debf6b223c8446396bf/jquery.easing.1.3.js",
"bootstrap": "~3.2.0",
"bootstrapJS": "https://raw.githubusercontent.com/jcbrand/bootstrap/7d96a5f60d26c67b5348b270a775518b96a702c8/dist/js/bootstrap.js",
"fontawesome": "~4.1.0",
"typeahead.js": "https://raw.githubusercontent.com/jcbrand/typeahead.js/eedfb10505dd3a20123d1fafc07c1352d83f0ab3/dist/typeahead.jquery.js",
"strophejs-plugins": "https://github.com/strophe/strophejs-plugins.git#conversejs",
"skeleton-sass": "~2.0.3"
"skeleton-sass": "~2.0.3",
"strophejs": "https://github.com/strophe/strophejs.git#9e285eaa59f4ceb2b25e4d95c5bbe90690251bbc",
"strophejs-plugins": "https://github.com/strophe/strophejs-plugins.git#amd"
},
"exportsOverride": {}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -42,6 +42,8 @@
box-sizing: border-box;
/* @group Tabs */
/* status dropdown styles */ }
#conversejs ::selection {
background-color: #E3C9C1; }
#conversejs *, #conversejs *:before, #conversejs *:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
......@@ -71,7 +73,7 @@
#conversejs input[type=text], #conversejs input[type=password],
#conversejs button {
font-size: 14px;
padding: 0.5em;
padding: 0.25em;
min-height: 0; }
#conversejs strong {
font-weight: 700; }
......@@ -294,6 +296,10 @@
user-select: none; }
#conversejs .emoticon {
font-size: 14px; }
#conversejs .left {
float: left; }
#conversejs .right {
float: right; }
#conversejs .hidden {
display: none; }
#conversejs .locked {
......@@ -370,6 +376,14 @@
padding: 10px 8px 0 8px; }
#conversejs .toggle-controlbox span {
color: white; }
#conversejs .button-group,
#conversejs .input-button-group {
display: table; }
#conversejs .button-group {
width: 100%; }
#conversejs .input-button-group button,
#conversejs .input-button-group input {
display: table-cell; }
#conversejs #minimized-chats {
color: white;
display: none;
......@@ -455,9 +469,6 @@
background-color: #176679;
border-right: 1px solid #176679;
border-left: 1px solid #176679; }
#conversejs .chat-message span::selection,
#conversejs .chat-message::selection {
background-color: darkgrey; }
#conversejs .chat-content {
position: relative;
padding: 8px;
......@@ -678,25 +689,24 @@
overflow: hidden;
/* (jQ addClass:) if input has value: */
/* (jQ addClass:) if mouse is over the 'x' input area*/ }
#conversejs #converse-roster .roster-filter-group {
display: table; }
#conversejs #converse-roster .filter-type {
display: table-cell;
float: right;
font-size: 14px;
height: 25px;
margin: 0 0 0.5em -1px;
padding: 0;
width: 84px; }
#conversejs #converse-roster .roster-filter {
float: left;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAABNSURBVHjaXI7BDcAwCAMvyQjMyQ6dAbZiKfqoUK34g2zJh1dENIC7M8pMAPYdzAVY3d0ajNz9aypS/b5R6o+ZPdqoKgCq6h80KH3xDgBqNR97p8oAGQAAAABJRU5ErkJggg==) no-repeat right -20px center;
border: 1px solid #999;
display: table-cell;
font-size: 14px;
height: 25px;
margin: 0 0 0.5em 6px;
margin: 0 0 0.5em 7px;
padding: 0;
padding: 2px;
width: 104px; }
width: 103px; }
#conversejs #converse-roster .roster-filter.x {
background-position: right 3px center; }
#conversejs #converse-roster .roster-filter.onX {
......@@ -715,7 +725,9 @@
#conversejs #converse-roster dt {
display: none; }
#conversejs #converse-roster dd {
line-height: 16px; }
line-height: 16px;
padding: 4px 2px 0 4px;
height: 24px; }
#conversejs #converse-roster dd a, #conversejs #converse-roster dd span {
text-shadow: 0 1px 0 #FAFAFA;
display: inline-block;
......@@ -724,8 +736,7 @@
text-overflow: ellipsis;
margin-left: 3px; }
#conversejs #converse-roster dd span {
padding: 0 5px 0 0;
margin-left: 3px; }
padding: 0 5px 0 0; }
#conversejs #converse-roster dd a.decline-xmpp-request {
margin-left: 5px; }
#conversejs #converse-roster dd a.remove-xmpp-contact {
......@@ -745,15 +756,11 @@
color: #436F64; }
#conversejs #converse-roster dd a.open-chat {
width: 80%; }
#conversejs #converse-roster span.pending-contact-name, #conversejs #converse-roster span.req-contact-name {
#conversejs #converse-roster span.pending-contact-name {
width: 80%; }
#conversejs dd.available-chatroom {
display: inline-block;
overflow-x: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
#conversejs dd.available-chatroom a.open-room {
width: 148px; }
#conversejs #converse-roster span.req-contact-name {
width: 69%;
padding: 0; }
#conversejs #available-chatrooms {
text-align: left; }
#conversejs #available-chatrooms dt,
......@@ -761,7 +768,7 @@
font-weight: normal;
color: #6C4C44;
border: none;
padding: 5px;
padding: 0.5em;
text-shadow: 0 1px 0 #FAFAFA; }
#conversejs .room-info {
font-size: 11px;
......@@ -778,9 +785,7 @@
display: block;
white-space: normal; }
#conversejs a.room-info {
width: 22px;
height: 22px;
float: right;
width: 15px;
display: none;
clear: right; }
#conversejs a.open-room {
......@@ -788,20 +793,25 @@
white-space: nowrap;
text-overflow: ellipsis;
overflow-x: hidden; }
#conversejs dd.available-chatroom {
display: inline-block;
overflow-x: hidden;
text-overflow: ellipsis;
padding: 0.25em 0.5em;
white-space: nowrap; }
#conversejs dd.available-chatroom a.open-room {
width: 150px; }
#conversejs dd.available-chatroom:hover a.room-info {
display: inline-block;
margin-top: 3px;
font-size: 15px; }
font-size: 14px; }
#conversejs dd.available-chatroom,
#conversejs #converse-roster dd {
font-weight: bold;
border: none;
display: block;
padding: 4px 2px 0 4px;
color: #6C4C44;
text-shadow: 0 1px 0 #FAFAFA;
clear: both;
height: 24px;
overflow-y: hidden; }
#conversejs .roster-group:hover,
#conversejs dd.available-chatroom:hover,
......@@ -823,6 +833,7 @@
#conversejs .chatbox {
width: 100%; } }
#conversejs .chatbox .box-flyout {
z-index: 1;
width: 200px; }
@media screen and (max-width: 480px) {
#conversejs .chatbox .box-flyout {
......@@ -846,8 +857,10 @@
background-color: #F1E2DD; }
#conversejs .chatbox .dropdown dd ul li:hover {
background-color: #E3C9C1; }
#conversejs .chatbox .dropdown dd.search-xmpp ul li:hover {
background-color: #F1E2DD; }
#conversejs .chatbox .dropdown dd.search-xmpp ul {
box-shadow: 1px 4px 10px 1px rgba(0, 0, 0, 0.4); }
#conversejs .chatbox .dropdown dd.search-xmpp ul li:hover {
background-color: #F1E2DD; }
#conversejs .chatbox .dropdown dt a span {
cursor: pointer;
display: block;
......@@ -950,7 +963,7 @@
width: 100%;
height: 30px;
margin: 5px 0 10px 0;
padding: 0.5em; }
padding-left: 0.5em; }
#conversejs #converse-register .input-group {
display: table;
margin: auto;
......@@ -985,15 +998,20 @@
margin: 1em 0; }
#conversejs form.add-chatroom {
background: none;
padding: 8px; }
padding: 0.5em; }
#conversejs form.add-chatroom input[type=button],
#conversejs form.add-chatroom input[type=submit],
#conversejs form.add-chatroom input[type=text] {
margin: 0;
width: 100%;
padding: 5px; }
padding: 0.25em; }
#conversejs form.add-chatroom span.spinner,
#conversejs form.add-chatroom input[type=button],
#conversejs form.add-chatroom input[type=submit] {
margin-top: 0.5em;
display: table-cell;
width: auto; }
#conversejs form.add-chatroom input[type=submit] {
margin: 5px 0;
color: #436F64; }
#conversejs select#select-xmpp-status {
float: right;
......@@ -1040,7 +1058,7 @@
border-bottom: 1px solid #CCC;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
box-shadow: inset 0 4px 12px rgba(0, 0, 0, 0.3);
box-shadow: inset 2px -2px 20px rgba(0, 0, 0, 0.3);
color: #888;
display: block;
font-size: 12px;
......@@ -1068,13 +1086,16 @@
margin: 0;
padding: 0;
position: relative;
width: 200px;
height: 84px; }
height: 82px;
width: 200px; }
@media screen and (max-width: 480px) {
#conversejs form.sendXMPPMessage {
width: 100%; } }
#conversejs form.sendXMPPMessage .chat-textarea {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border: 0;
height: 64px;
height: 62px;
padding: 0.5em;
width: 100%;
resize: none; }
......@@ -1148,14 +1169,14 @@
float: left;
padding: 0; }
#conversejs #set-custom-xmpp-status input {
height: 23px; }
height: 26px;
width: -webkit-calc(100% - 40px);
width: calc(100% - 40px);
padding: 0 0 0 0.5em; }
#conversejs #set-custom-xmpp-status button {
height: 23px;
height: 26px;
width: 40px;
padding: 1px 2px 1px 1px; }
#conversejs .custom-xmpp-status {
width: -webkit-calc(100% - 40px);
width: calc(100% - 40px); }
padding: 1px; }
#conversejs .chat-textarea-chatbox-selected {
border: 1px solid #578308;
margin: 0; }
......@@ -1179,11 +1200,13 @@
background: none;
padding: 5px; }
#conversejs .add-xmpp-contact input {
margin: 0 0 1rem; }
margin: 0 0 1rem;
width: 100%; }
#conversejs .add-xmpp-contact button {
width: 100%; }
#conversejs .xmpp-status-menu {
text-align: left; }
text-align: left;
box-shadow: 1px 4px 10px 1px rgba(0, 0, 0, 0.4); }
#conversejs .xmpp-status-menu li {
padding: 2px; }
#conversejs .xmpp-status-menu li a {
......@@ -1235,5 +1258,3 @@
margin-left: 0;
cursor: n-resize;
z-index: 20; }
/*# sourceMappingURL=converse.css.map */
This diff is collapsed.
......@@ -16,11 +16,13 @@ h4,
h5,
h6 {
margin: 0 0 35px;
text-transform: uppercase;
font-family: "Montserrat", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: 700;
letter-spacing: 1px;
}
h1 {
text-transform: uppercase;
}
p {
margin: 0 0 25px;
font-size: 18px;
......
This diff is collapsed.
CHANGES.rst merge=union
Changelog
=========
0.8.8 (Unreleased)
0.9.0 (2015-03-06)
------------------
* #204 Support websocket connections. [jcbrand]
* #252, 253 Add fullname and jid to contact's tooltip in roster. [gbonvehi]
* #292 Better support for XEP-0085 Chat State Notifications. [jcbrand]
* #295 Document "allow_registration". [gbonvehi]
* #304 Added Polish translations. [ser]
* #305 presence/show text in XMPP request isn't allowed by specification. [gbonvehi]
* Add new API method ``chats.open`` to open chat boxes. [jcbrand]
* Add new API method to set and get configuration settings. [jcbrand]
* Add responsiveness to CSS. We now use Sass preprocessor for generating CSS. [jcbrand]
* Bugfix. Custom status message form doesn't submit/disappear. [jcbrand]
* Calling the API method ``contacts.get()`` without parameters now returns all contacts. [jcbrand]
* Don't send out the message carbons IQ stanza on each page load. [jcbrand]
* New Makefile.win to build in Windows environments. [gbonvehi]
* Norwegian Bokmål translations. [Andreas Lorentsen]
* Removed deprecated API methods. [jcbrand]
* Strophe.log and Strophe.error now uses converse.log to output messages. [gbonvehi]
* The API method ``chats.get`` now only returns already opened chat boxes. [jcbrand]
* Updated Afrikaans translations. [jcbrand]
* Add responsiveness to CSS. We now use Sass preprocessor for generating CSS. [jcbrand]
* Add new configuration setting `prebind_url <https://conversejs.org/docs/html/configuration.html#prebind-url>`_ [jcbrand]
0.8.6 (2014-12-07)
------------------
......@@ -61,7 +77,7 @@ Changelog
* Converse.js now has the ability to maintain sessions across page loads.
Previously, the session tokens had to be handled externally and passed in.
See the `keepalive <https://conversejs.org/docs/html/index.html#keepalive>`_ configuration setting. [jcbrand]
See the `keepalive <https://conversejs.org/docs/html/configuration.html#keepalive>`_ configuration setting. [jcbrand]
* Allow changing of nickname in a chat room via /nick command. [jcbrand]
* Allow a chat room user to be muted or unmuted with the /mute and /voice commands. [jcbrand]
* Add a chat room toolbar button for toggling the list of participants. [jcbrand]
......@@ -92,7 +108,7 @@ Changelog
.. note::
1. Converse.js is now relicensed under the `Mozilla Public License <http://www.mozilla.org/MPL/2.0/>`_.
2. Configuration options for the chat toolbar have changed. Please refer to the `relevant documentation <http://devbox:8890/docs/html/index.html#visible-toolbar-buttons>`_.
2. Configuration options for the chat toolbar have changed. Please refer to the `relevant documentation <http://devbox:8890/docs/html/configuration.html#visible-toolbar-buttons>`_.
3. This release has reduced support for IE8 (some features won't work).
4. Events have been renamed to remove "on" prefix (sorry for any inconvenience).
......@@ -101,7 +117,7 @@ Changelog
* Add a new toolbar button for clearing chat messages. [jcbrand]
* Chat boxes and rooms can now be resized vertically. [jcbrand]
* Upgraded dependencies to their latest versions. [jcbrand]
* Add new configuration setting `forward_messages <https://conversejs.org/docs/html/index.html#forward_messages>`_
* Add new configuration setting `forwarded_messages <https://conversejs.org/docs/html/configuration.html#forwarded-messages>`_
Message forwarding was before a default behavior but is now optional (and disabled by default). [jcbrand]
* Newly opened chat boxes always appear immediately left of the controlbox. [jcbrand]
* #71 Chat boxes and rooms can be minimized. [jcbrand]
......@@ -112,7 +128,7 @@ Changelog
* #123 Show converse.js in the resource assigned to a user. [jcbrand]
* #130 Fixed bootstrap conflicts. [jcbrand]
* #132 Support for `XEP-0280: Message Carbons <https://xmpp.org/extensions/xep-0280.html'>`_.
Configured via `message_carbons <https://conversejs.org/docs/html/index.html#message_carbons>`_ [hejazee]
Configured via `message_carbons <https://conversejs.org/docs/html/configuration.html#message-carbons>`_ [hejazee]
* #176 Add support for caching in sessionStorage as opposed to localStorage. [jcbrand]
* #180 RID and SID undefined [g8g3]
* #191 No messages history [heban]
......
......@@ -3,7 +3,7 @@
{# Custom CSS overrides #}
{% set bootswatch_css_custom = ['_static/style.css', "../../css/converse.min.css"] %}
{% set script_files = script_files + ["../../builds/converse.min.js"] %}
{% set script_files = script_files + ["../../builds/converse.min.js", "../../analytics.js"] %}
{# Add some extra stuff before and use existing with 'super()' call. #}
{% block footer %}
......
======================
Creating custom builds
======================
.. _builds:
===============
Creating builds
===============
.. contents:: Table of Contents
:depth: 3
......@@ -10,31 +12,53 @@ Creating custom builds
.. warning:: There current documentation in this section does not adequately
explain how to create custom builds.
.. _`minification`:
.. note:: Please make sure to read the section :doc:`development` and that you have installed
all development dependencies (long story short, you should be able to just run ``make dev``)
Creating builds
===============
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.
To create the bundles, simply run::
make build
Minification
============
This command does the following:
Minifying Javascript and CSS
----------------------------
* 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>`_.
Please make sure to read the section :doc:`development` and that you have installed
all development dependencies (long story short, you can run ``npm install``
and then ``grunt fetch``).
* 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.
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 minified file fit for deployment to a
production site.
* 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.
To minify the Javascript and CSS, run the following command:
* Also, the CSS files in the ``./css`` directory will be minified.
The built Javasript bundles are contained in the ``./builds`` directory:
.. code-block:: bash
jc@conversejs:~/converse.js (master)$ ls builds/
converse.js converse-no-locales-no-otr.js converse.website.min.js
converse.min.js converse-no-locales-no-otr.min.js converse.website-no-otr.min.js
converse.nojquery.js converse-no-otr.js locales.js
converse.nojquery.min.js converse-no-otr.min.js templates.js
.. _`minification`:
::
Minifying the CSS
-----------------
grunt minify
To only minify the CSS files, nothing else, run the following command::
Javascript will be bundled and minified with `require.js`_'s optimization tool,
using `almond <https://github.com/jrburke/almond>`_.
make cssmin
You can `read more about require.js's optimizer here <http://requirejs.org/docs/optimization.html>`_.
The CSS files are minified via `cssmin <https://github.com/gruntjs/grunt-contrib-cssmin>`_.
CSS is minified via `cssmin <https://github.com/gruntjs/grunt-contrib-cssmin>`_.
......@@ -48,9 +48,9 @@ copyright = u'2014, JC Brand'
# built documents.
#
# The short X.Y version.
version = '0.8.6'
version = '0.9.0'
# The full version, including alpha/beta/rc tags.
release = '0.8.6'
release = '0.9.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
......
......@@ -53,6 +53,15 @@ Default: ``true``
Allow Off-the-record encryption of single-user chat messages.
allow_registration
------------------
Default: ``true``
Support for `XEP-0077: In band registration <http://xmpp.org/extensions/xep-0077.html>`_
Allow XMPP account registration showing the corresponding UI register form interface.
animate
-------
......@@ -94,11 +103,20 @@ If true, the user will automatically subscribe back to any contact requests.
bosh_service_url
----------------
Connections to an XMPP server depend on a BOSH connection manager which acts as
a middle man between HTTP and XMPP.
Default: ``undefined``
To connect to an XMPP server over HTTP you need a `BOSH <https://en.wikipedia.org/wiki/BOSH>`_
connection manager which acts as a middle man between the HTTP and XMPP
protocols.
The bosh_service_url setting takes the URL of a BOSH connection manager.
Please refer to your XMPP server's documentation on how to enable BOSH.
For more information, read this blog post: `Which BOSH server do you need? <http://metajack.im/2008/09/08/which-bosh-server-do-you-need>`_
A more modern alternative to BOSH is to use `websockets <https://developer.mozilla.org/en/docs/WebSockets>`_.
Please see the :ref:`websocket-url` configuration setting.
cache_otr_key
-------------
......@@ -136,6 +154,8 @@ Default: ``e.g. conversejs.org``
The placeholder text shown in the domain input on the registration form.
.. _`keepalive`:
keepalive
---------
......@@ -149,6 +169,13 @@ See also:
* :ref:`session-support`
* `Using prebind in connection with keepalive`_
.. note::
Currently the "keepalive" setting only works with BOSH and not with
websockets. This is because XMPP over websocket does not use the same
session token as with BOSH. A possible solution for this is to implement
`XEP-0198 <http://xmpp.org/extensions/xep-0198.html>`_, specifically
with regards to "stream resumption".
message_carbons
---------------
......@@ -248,6 +275,8 @@ it in both formats as ``http://yoursite.com/sounds/msg_received.mp3`` and
``http://yoursite.com`` should of course be your site's URL.
.. _`prebind`:
prebind
--------
......@@ -255,71 +284,74 @@ Default: ``false``
See also: :ref:`session-support`
Use this option when you want to attach to an existing XMPP connection that was
already authenticated (usually on the backend before page load).
Use this option when you want to attach to an existing XMPP
`BOSH <https://en.wikipedia.org/wiki/BOSH>`_ session.
This is useful when you don't want to render the login form on the chat control
box with each page load.
Usually a BOSH session is set up server-side in your web app.
For prebinding to work, you must set up a pre-authenticated BOSH session,
for which you will receive a JID (jabber ID), SID (session ID) and RID
(Request ID).
Attaching to an existing BOSH session that was set up server-side is useful
when you want to maintain a persistent single session for your users instead of
requiring them to log in manually.
These values (``rid``, ``sid`` and ``jid``) need to be passed into
``converse.initialize`` (with the exception of ``keepalive``, see below).
When a BOSH session is initially created, you'll receive three tokens.
A JID (jabber ID), SID (session ID) and RID (Request ID).
Additionally, you also have to specify a ``bosh_service_url``.
Converse.js needs these tokens in order to attach to that same session.
Using prebind in connection with keepalive
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are two complementary configuration settings to ``prebind``.
They are :ref:`keepalive` and :ref:`prebind_url`.
The ``prebind`` and `keepalive`_ options can be used together.
``keepalive`` can be used keep the session alive without having to pass in
new tokens to ``converse.initialize`` every time you reload the page. This
removes the need to set up a new BOSH session every time a page loads.
The ``keepalive`` option caches the ``rid``, ``sid`` and ``jid`` values
(henceforth referred to as *session tokens*) one receives from a prebinded
BOSH session, in order to re-use them when the page reloads.
``prebind_url`` lets you specify a URL which converse.js will call whenever a
new BOSH session needs to be set up.
However, if besides setting ``keepalive`` to ``true``, you also set ``prebind``
to ``true``, and you pass in valid session tokens to ``converse.initialize``,
then those passed in session tokens will be used instead of any tokens cached by
``keepalive``.
If you set ``prebind`` to ``true`` and don't pass in the session tokens to
``converse.initialize``, then converse.js will look for tokens cached by
``keepalive``.
Here's an example of converse.js being initialized with these three options:
If you've set ``keepalive`` and ``prebind`` to ``true``, don't pass in session
tokens and converse.js doesn't find any cached session tokens, then
converse.js will emit an event ``noResumeableSession`` and exit.
.. code-block:: javascript
This allows you to start a prebinded session with valid tokens, and then fall
back to ``keepalive`` for maintaining that session across page reloads. When
for some reason ``keepalive`` doesn't have cached session tokens anymore, you
can listen for the ``noResumeableSession`` event and take that as a cue that
you should again prebind in order to get valid session tokens.
converse.initialize({
bosh_service_url: 'https://bind.example.com',
keepalive: true,
prebind: true,
prebind_url: 'http://example.com/api/prebind',
allow_logout: false
});
Here is a code example:
.. note:: The ``prebind_url`` configuration setting is new in version 0.9 and
simplifies the code needed to set up and maintain prebinded sessions.
.. code-block:: javascript
When using ``prebind_url`` and ``keepalive``, you don't need to manually pass in
the RID, SID and JID tokens anymore.
converse.on('noResumeableSession', function () {
$.getJSON('/prebind', function (data) {
converse.initialize({
prebind: true,
keepalive: true,
bosh_service_url: 'https://bind.example.com',
jid: data.jid,
sid: data.sid,
rid: data.rid
});
});
});
converse.initialize({
prebind: true,
keepalive: true,
bosh_service_url: 'https://bind.example.com'
}));
.. _`prebind_url`:
prebind_url
-----------
* Default: ``null``
* Type: URL
See also: :ref:`session-support`
This setting should be used in conjunction with :ref:`prebind` and :ref:`keepalive`.
It allows you to specify a URL which converse.js will call when it needs to get
the RID and SID (Request ID and Session ID) tokens of a BOSH connection, which
converse.js will then attach to.
The server behind ``prebind_url`` should return a JSON encoded object with the
three tokens::
{
"jid": "me@example.com/resource",
"sid": "346234623462",
"rid": "876987608760"
}
providers_link
--------------
......@@ -443,6 +475,33 @@ Allows you to show or hide buttons on the chat boxes' toolbars.
* toggle_participants:
Shows a button for toggling (i.e. showing/hiding) the list of participants in a chat room.
.. _`websocket-url`:
websocket_url
-------------
Default: ``undefined``
This option is used to specify a
`websocket <https://developer.mozilla.org/en/docs/WebSockets>`_ URI to which
converse.js can connect to.
Websockets provide a more modern and effective two-way communication protocol
between the browser and a server, effectively emulating TCP at the application
layer and therefore overcoming many of the problems with existing long-polling
techniques for bidirectional HTTP (such as `BOSH <https://en.wikipedia.org/wiki/BOSH>`_).
Please refer to your XMPP server's documentation on how to enable websocket
support.
.. note::
Please note that not older browsers do not support websockets. For older
browsers you'll want to specify a BOSH URL. See the :ref:`bosh-service-url`
configuration setting).
.. note::
Converse.js does not yet support "keepalive" with websockets.
xhr_custom_status
-----------------
......
.. _development:
===========
Development
===========
......@@ -12,6 +14,8 @@ follow the instructions below to create this folder and fetch Converse's
3rd-party dependencies.
.. note::
Windows environment: We recommend installing the required tools using `Chocolatey <https://chocolatey.org/>`_
You will need Node.js (nodejs.install), Git (git.install) and optionally to build using Makefile, GNU Make (make)
If you have trouble setting up a development environment on Windows,
please read `this post <http://librelist.com/browser//conversejs/2014/11/5/openfire-converse-and-visual-studio-questions/#b28387e7f8f126693b11598a8acbe810>`_
in the mailing list.:
......@@ -27,6 +31,9 @@ version `here <https://nodejs.org/download>`_.
Also make sure you have ``Git`` installed. `Details <http://git-scm.com/book/en/Getting-Started-Installing-Git>`_.
.. note::
Windows users should use Chocolatey as recommended above.:
Once you have *Node.js* and *git* installed, run the following command inside the Converse.js
directory:
......@@ -34,13 +41,18 @@ directory:
make dev
On Windows you need to specify Makefile.win to be used by running:
::
make -f Makefile.win dev
Or alternatively, if you don't have GNU Make:
::
npm install
bower update
This will first install the Node.js development tools (like Grunt and Bower)
and then use Bower to install all of Converse.js's front-end dependencies.
......@@ -64,7 +76,6 @@ If you are curious to know what the different dependencies are:
Double-check the output of ```make dev``` to see if there are any errors
listed. For support, you can write to the mailing list: conversejs@librelist.com
With AMD and require.js (recommended)
=====================================
......@@ -152,7 +163,6 @@ which you can then call certain standardised accessors and mutators, like::
.get
.set
.add
.all
.remove
This is done to increase readability and to allow intuitive method chaining.
......@@ -165,6 +175,10 @@ To get multiple contacts, just pass in an array of jids::
converse.contacts.get(['jid1@example.com', 'jid2@example.com']);
To get all contacts, simply call ``get`` without any jids::
converse.contacts.get();
**Here follows now a breakdown of all API groupings and methods**:
......@@ -207,14 +221,22 @@ Example:
get
~~~
Returns a map of attributes for a given buddy (i.e. roster contact), specified
by JID (Jabber ID).
This method is used to retrieve roster contacts.
Example::
To get a single roster contact, call the method with the contact's JID (Jabber ID):
converse.contacts.get('buddy@example.com')
The map of attributes:
To get multiple contacts, pass in an array of JIDs::
converse.contacts.get(['buddy1@example.com', 'buddy2@example.com'])
To return all contacts, simply call ``get`` without any parameters::
converse.contacts.get()
The returned roster contact objects have these attributes:
+----------------+--------------------------------------------------------------------------------------------------------------------------------------+
| Attribute | |
......@@ -256,12 +278,36 @@ The map of attributes:
get
~~~
Returns an object/map representing a chat box (without opening or affecting that chat box).
Returns an object representing a chat box, if that chat box is already open.
If the chat box is not already open, this method will return ``null``.
Example::
To return a single chat box, provide the JID of the contact you're chatting
with in that chat box::
converse.chats.get('buddy@example.com')
To return an array of chat boxes, provide an array of JIDs::
converse.chats.get(['buddy1@example.com', 'buddy2@example.com'])
To return all open chat boxes, call the method without any JIDs::
converse.chats.get()
open
~~~~
Opens a chat box and returns an object representing a chat box.
To open a single chat box, provide the JID of the contact::
converse.chats.get('buddy@example.com')
To return an array of chat boxes, provide an array of JIDs::
converse.chats.get(['buddy1@example.com', 'buddy2@example.com'])
*The returned chat box contains the following methods:*
+-------------+------------------------------------------+
......@@ -279,6 +325,8 @@ Example::
+-------------+------------------------------------------+
| set | Set an attribute (i.e. mutator). |
+-------------+------------------------------------------+
| close | Close the chat box. |
+-------------+------------------------------------------+
*The get and set methods can be used to retrieve and change the following attributes:*
......@@ -290,6 +338,36 @@ Example::
| url | The URL of the chat box heading. |
+-------------+-----------------------------------------------------+
"settings" grouping
-------------------
This grouping allows you to get or set the configuration settings of converse.js.
get(key)
~~~~~~~~
Returns the value of a configuration settings. For example::
converse.settings.get("play_sounds"); // default value returned would be false;
set(key, value) or set(object)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Set one or many configuration settings. For example::
converse.settings.set("play_sounds", true);
or ::
converse.settings.set({
"play_sounds", true,
"hide_offline_users" true
});
Note, this is not an alternative to calling ``converse.initialize``, which still needs
to be called. Generally, you'd use this method after converse.js is already
running and you want to change the configuration on-the-fly.
"tokens" grouping
-----------------
......
......@@ -33,7 +33,7 @@ The :ref:`what-you-will-need` and :ref:`session-support` sections provide more i
Table of Contents
=================
.. toctree::
:maxdepth: 2
......@@ -42,6 +42,7 @@ Table of Contents
setup
configuration
development
theming
translations
documentation
builds
......@@ -120,15 +120,15 @@ Apache
Single Session Support
----------------------
Server-side authentication
==========================
Server-side authentication (prebind)
====================================
It's possible to enable single-site login, whereby users already
authenticated in your website will also automatically be logged in on the chat server,
It's possible to enable shared sessions whereby users already
authenticated in your website will also automatically be logged in on the XMPP server,
This session should also persist across page loads. In other words, we don't
want the user to have to give their chat credentials every time they reload the
page.
This session can also be made to persist across page loads. In other words, we want
a user to automatically be logged in to chat when they log in to the website,
and we want their chat session to persist across page loads.
To do this you will require a `BOSH server <http://xmpp.org/about-xmpp/technology-overview/bosh/>`_
for converse.js to connect to (see the :ref:`bosh-service-url` under :ref:`configuration-variables`)
......@@ -158,41 +158,11 @@ page load). Each page load is a new request which requires a new unique RID.
The best way to achieve this is to simply increment the RID with each page
load.
When you initialize converse.js in your browser, you need to pass it these two
tokens. Converse.js will then use them to attach to the session you just
created.
You can embed the RID and SID tokens in your HTML markup or you can do an
XMLHttpRequest call to your server and ask it to return them for you.
Below is one example of how this could work. An Ajax call is made to the
relative URL **/prebind** and it expects to receive JSON data back.
.. code-block:: javascript
$.getJSON('/prebind', function (data) {
converse.initialize({
prebind: true,
bosh_service_url: data.bosh_service_url,
jid: data.jid,
sid: data.sid,
rid: data.rid
});
);
**Here's what's happening:**
The JSON data returned from the Ajax call to example.com/prebind contains the user's JID (jabber ID), RID, SID and the URL to the
BOSH server (also called a *connection manager*).
These values are then passed to converse.js's ``initialize`` method.
.. note::
If you want to enable single session support, you need to set **prebind: true**
when calling **converse.initialize** (see ./index.html).
Additionally you need to pass in valid **jid**, **sid**, **rid** and
**bosh_service_url** values.
You'll need to configure converse.js with the :ref:`prebind`, :ref:`keepalive` and
:ref:`prebind_url` settings.
Please read the documentation on those settings for a fuller picture of what
needs to be done.
Example code for server-side prebinding
=======================================
......
=======
Theming
=======
.. contents:: Table of Contents
:depth: 2
:local:
Setting up your environment
===========================
In order to theme converse.js, you'll first need to set up a `development_` environment.
You'll also want to preview the changes you make in the browser.
To set up the development environment and also start up a web browser which
will serve the files for you, simply run::
make serve
You can now open http://localhost:8000 in your webbrowser to see the
converse.js website.
However, when developing or changing the theme, you'll want to load all the
unminified JS and CSS resources. To do this, open http://localhost:8000/dev.html
instead.
Mockups
=======
Converse.js contains some mockups in the ``./mockup`` directory against which you
can preview and tweak your changes.
The ``./mockup/index.html`` file contains the most comprehensive mockup, while
the other files focus on particular UI aspects.
To see it in your browser, simply open: http://localhost:8000/mockup
Modifying the HTML templates of Converse.js
===========================================
The HTML markup of converse.js is contained small ``.html`` files in the
``./src/templates`` directory.
Modifying the CSS
=================
The CSS files are generated from `Sass <http://sass-lang.com>`_ files in
the ``./sass`` directory.
To generate the CSS you can run::
make css
Creating builds
===============
Once you've themed converse.js, you'll want to create new minified builds of
the Javascript and CSS files.
Please refer to the :doc:`builds` section for information on how this is done.
......@@ -10,9 +10,9 @@ Translations
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
the minified javascript file. Therefore, make sure to only
include those languages that you intend to support and remove from
./locale/locales.js those which you don't need. Remember to rebuild the
minified file afterwards.
include those languages which you intend to support and remove from
./src/locales.js those which you don't need. Remember to rebuild the
minified file afterwards, by running `make build`.
----------------------------------------------
Updating the translations template (.pot file)
......@@ -61,9 +61,9 @@ the Javascript translations library that we're using.
"domain: converse\n"
"lang: pl\n"
"Content-Type: text/plain; charset=UTF-8\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
--------------------------------------
Updating an existing translations file
--------------------------------------
......@@ -107,33 +107,14 @@ You can then convert the translations into JSON format:
po2json -p -f jed -d converse locale/de/LC_MESSAGES/converse.po locale/de/LC_MESSAGES/converse.json
Now from converse.json paste the data as a value for the "locale_data" key in the
object in the language's .js file.
So, if you are for example translating into German (language code 'de'), you'll
create or update the file ./locale/LC_MESSAGES/de.js with the following code:
To do this for ALL languages, run:
.. code-block:: javascript
::
(function (root, factory) {
define("de", ['jed'], function () {
return factory(new Jed({
"domain": "converse",
"locale_data": {
// Paste the JSON data from converse.json here
}
})
}
}(this, function (i18n) {
return i18n;
}));
make po2json
making sure to also paste the JSON data as value to the "locale_data" key.
.. note::
If you are adding translations for a new language that is not already supported,
you'll have to add the language path in main.js and make one more edit in ./locale/locales.js
you'll have to add the language path in main.js and make one more edit in ./src/locales.js
to make sure the language is loaded by require.js.
Congratulations, you've now succesfully added your translations. Sorry for all
those hoops you had to jump through.
......@@ -77,7 +77,7 @@
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1 class="brand-heading"><i class="icon-conversejs"></i>Converse.js</h1>
<p class="intro-text">A free and open-source XMPP chat client for your website</p>
<p class="intro-text">A free and open-source XMPP chat client</p>
<div class="page-scroll">
<a href="#about" class="btn btn-default btn-lg"><span class="btn-text">Learn More</span></a>
</div>
......@@ -100,16 +100,14 @@
<section id="about" class="container content-section text-center">
<div class="row">
<div class="col-lg-8 col-lg-offset-2">
<h2><strong>Converse.js</strong> is a free and open source chat client that runs in your browser. It can be integrated into any website.</h3>
<p>Similar to <a href="https://www.facebook.com/sitetour/chat.php" target="_blank">Facebook chat</a> but it also supports multi-user chatrooms.</p>
<h2><strong>Converse.js</strong> is written in Javascript and runs in your browser.</h2>
<p>You can start using it here immediately, or you can <a href="/docs/html/index.html">integrate it into your own website</a>.</p>
<p>
<strong>Converse.js</strong> can connect to any accessible <a href="http://xmpp.org" target="_blank">XMPP/Jabber</a> server,
You can connect to any publically accessible <a href="http://xmpp.org" target="_blank">XMPP/Jabber</a> server,
either from a <a href="https://xmpp.net/directory.php">public provider</a>, or one you have set up yourself.
</p>
<p>
It's possible to enable single-site-login, whereby users already authenticated in your website will also automatically be logged in on the chat server.
Please refer to the <strong><a href="/docs/html/index.html">documentation</a></strong> for more info.
</p>
<h3>Don't have an XMPP/Jabber account?</h3>
<p>No problem! With converse.js you can register an account on any public XMPP server that allows registration.</p>
</div>
</div>
</section>
......@@ -210,10 +208,9 @@
<div class="col-lg-8 col-lg-offset-2">
<h2>Contact</h2>
<ul class="contact">
<li>Follow me on <a href="http://twitter.com/jcopkode" target="_blank">Twitter</a>.</li>
<li>Chat with me via XMPP: <a href="xmpp:jc@opkode.com" class="xmpp JSnocheck" title="XMPP/Jabber">jc@opkode.com</a>.</li>
<li>For technical support, please write to the mailing list: <a href="mailto:conversejs@librelist.com">conversejs@librelist.com</a>.</li>
<li>Or ask in the Converse.js chat room: <a href="xmpp:discuss@conference.conversejs.org" class="xmpp JSnocheck" title="Converse.js chat room">discuss@conference.conversejs.org</a>.</li>
<li>Follow me on <a href="http://twitter.com/jcopkode" target="_blank">Twitter</a> or chat with me via XMPP at <a href="xmpp:jc@opkode.com" class="xmpp JSnocheck" title="XMPP/Jabber">jc@opkode.com</a>.</li>
<li>For technical support, please write to the mailing list: <a href="mailto:conversejs@librelist.com">conversejs@librelist.com</a><br/>
or ask in the Converse.js chat room: <a href="xmpp:discuss@conference.conversejs.org" class="xmpp JSnocheck" title="Converse.js chat room">discuss@conference.conversejs.org</a>.</li>
<li>Also check out the <a href="http://librelist.com/browser/conversejs" target="_blank">mailing list archives</a>.</li>
<li>Please file <a target="_blank" href="https://github.com/jcbrand/converse.js/issues">bugs on Github</a>.</li>
<li>I'm available for features and <a href="http://opkode.com/contact" target="_blank">consulting</a>.</li>
......
This diff is collapsed.
......@@ -6,6 +6,10 @@
"domain": "converse",
"lang": "af"
},
" e.g. conversejs.org": [
null,
""
],
"unencrypted": [
null,
"nie-privaat"
......@@ -90,10 +94,6 @@
null,
"Bekragtiging het gefaal"
],
"Online Contacts": [
null,
"Kontakte aangemeld"
],
"Re-establishing encrypted session": [
null,
"Herstel versleutelde sessie"
......@@ -166,10 +166,6 @@
null,
"Ons het 'n onleesbare versleutelde boodskap ontvang"
],
"This user has requested an encrypted session.": [
null,
"Hierdie gebruiker versoek 'n versleutelde sessie"
],
"Here are the fingerprints, please confirm them with %1$s, outside of this chat.\n\nFingerprint for you, %2$s: %3$s\n\nFingerprint for %1$s: %4$s\n\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [
null,
"Hier is die vingerafdrukke, bevestig hulle met %1$s, buite hierdie kletskanaal \n\nU vingerafdruk, %2$s: %3$s\n\nVingerafdruk vir %1$s: %4$s\n\nIndien u die vingerafdrukke bevestig het, klik OK, andersinds klik Kanselleer"
......@@ -318,10 +314,6 @@
null,
"Bediener"
],
"Join": [
null,
"Sluit aan"
],
"Show rooms": [
null,
"Wys kamers"
......@@ -438,6 +430,10 @@
null,
"Fout: kon nie die opdrag uitvoer nie"
],
"Change user's affiliation to admin": [
null,
""
],
"Ban user from room": [
null,
"Verban gebruiker uit hierdie kletskamer"
......@@ -450,6 +446,10 @@
null,
"Skryf in die derde persoon"
],
"Grant membership to a user": [
null,
""
],
"Remove user's ability to post messages": [
null,
"Verwyder gebruiker se vermoë om boodskappe te plaas"
......@@ -458,6 +458,14 @@
null,
"Verander u bynaam"
],
"Grant moderator role to user": [
null,
""
],
"Revoke user's membership": [
null,
""
],
"Set room topic": [
null,
"Stel onderwerp vir kletskamer"
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
(function (root, factory) {
var translations = {
"domain": "converse",
"locale_data": {
"converse": {
"": {
"domain": "converse",
"lang": "en",
"plural_forms": "nplurals=2; plural=(n != 1);"
}
}
}
};
if (typeof define === 'function' && define.amd) {
define("en", ['jed'], function () {
return factory(new Jed(translations));
});
} else {
if (!window.locales) {
window.locales = {};
}
window.locales.en = factory(new Jed(translations));
}
}(this, function (en) {
return en;
}));
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
(function(root, factory) {
var translations = {
"domain" : "converse",
"locale_data" : {
"converse" : {
"" : {
"Project-Id-Version" : "Converse.js 0.4",
"Report-Msgid-Bugs-To" : "",
"POT-Creation-Date" : "2013-09-24 23:22+0200",
"PO-Revision-Date" : "2013-09-25 22:42+0200",
"Last-Translator" : "Krisztian Kompar <w3host@w3host.hu>",
"Language-Team" : "Hungarian",
"Language" : "hu",
"MIME-Version" : "1.0",
"Content-Type" : "text/plain; charset=UTF-8",
"Content-Transfer-Encoding" : "8bit",
"domain" : "converse",
"lang" : "hu",
"plural_forms" : "nplurals=2; plural=(n != 1);"
},
"Disconnected" : [ null, "Szétkapcsolva" ],
"Error" : [ null, "Hiba" ],
"Connecting" : [ null, "Kapcsolódás" ],
"Connection Failed" : [ null, "Kapcsolódási hiba" ],
"Authenticating" : [ null, "Azonosítás" ],
"Authentication Failed" : [ null, "Azonosítási hiba" ],
"Disconnecting" : [ null, "Szétkapcsolás" ],
"me" : [ null, "én" ],
"%1$s is typing" : [ null, "%1$s gépel" ],
"Show this menu" : [ null, "Mutasd ezt a menüt" ],
"Write in the third person" : [ null, "" ],
"Remove messages" : [ null, "Üzenet törlése" ],
"Personal message" : [ null, "Saját üzenet" ],
"Contacts" : [ null, "Kapcsolatok" ],
"Online" : [ null, "Elérhető" ],
"Busy" : [ null, "Foglalt" ],
"Away" : [ null, "Távol" ],
"Offline" : [ null, "Nem elérhető" ],
"Click to add new chat contacts" : [ null,
"Új kapcsolatok hozzáadása" ],
"Add a contact" : [ null, "Új kapcsolat" ],
"Contact username" : [ null, "Felhasználónév" ],
"Add" : [ null, "Hozzáadás" ],
"Contact name" : [ null, "Kapcsolat neve" ],
"Search" : [ null, "Keresés" ],
"No users found" : [ null, "Nincs találat" ],
"Click to add as a chat contact" : [ null,
"Csevegő kapcsolatként hozzáad" ],
"Click to open this room" : [ null, "Belépés a csevegő szobába" ],
"Show more information on this room" : [ null,
"További információk a csevegő szobáról" ],
"Description:" : [ null, "Leírás:" ],
"Occupants:" : [ null, "Jelenlevők:" ],
"Features:" : [ null, "Tulajdonságok" ],
"Requires authentication" : [ null, "Azonosítás szükséges" ],
"Hidden" : [ null, "Rejtett" ],
"Requires an invitation" : [ null, "Meghívás szükséges" ],
"Moderated" : [ null, "Moderált" ],
"Non-anonymous" : [ null, "NEM névtelen" ],
"Open room" : [ null, "Nyitott szoba" ],
"Permanent room" : [ null, "Állandó szoba" ],
"Public" : [ null, "Nyílvános" ],
"Semi-anonymous" : [ null, "Félig névtelen" ],
"Temporary room" : [ null, "Ideiglenes szoba" ],
"Unmoderated" : [ null, "Moderálatlan" ],
"Rooms" : [ null, "Szobák" ],
"Room name" : [ null, "A szoba neve" ],
"Nickname" : [ null, "Becenév" ],
"Server" : [ null, "Szerver" ],
"Join" : [ null, "Csatlakozás" ],
"Show rooms" : [ null, "Létező szobák" ],
"No rooms on %1$s" : [ null,
"Nincs csevegő szoba a(z) %1$s szerveren" ],
"Rooms on %1$s" : [ null, "Csevegő szobák a(z) %1$s szerveren" ],
"Set chatroom topic" : [ null, "Csevegőszoba téma beállítás" ],
"Kick user from chatroom" : [ null,
"Felhasználó kiléptetése a csevegő szobából" ],
"Ban user from chatroom" : [ null,
"Felhasználó kitíltása a csevegő szobából" ],
"Message" : [ null, "Üzenet" ],
"Save" : [ null, "Mentés" ],
"Cancel" : [ null, "Mégsem" ],
"An error occurred while trying to save the form." : [ null,
"Hiba történt az adatok mentése közben." ],
"This chatroom requires a password" : [ null,
"A csevegő szoba belépéshez jelszó szükséges" ],
"Password: " : [ null, "Jelszó:" ],
"Submit" : [ null, "Küldés" ],
"This room is not anonymous" : [ null,
"Ez a szoba NEM névtelen" ],
"This room now shows unavailable members" : [ null,
"Ez a szoba mutatja az elérhetetlen tagokat" ],
"This room does not show unavailable members" : [ null,
"Ez a szoba nem mutatja az elérhetetlen tagokat" ],
"Non-privacy-related room configuration has changed" : [ null,
"A szoba általános konfigurációja módosult" ],
"Room logging is now enabled" : [ null,
"A szobába a belépés lehetséges" ],
"Room logging is now disabled" : [ null,
"A szobába a belépés szünetel" ],
"This room is now non-anonymous" : [ null,
"Ez a szoba most NEM névtelen" ],
"This room is now semi-anonymous" : [ null,
"Ez a szoba most félig névtelen" ],
"This room is now fully-anonymous" : [ null,
"Ez a szoba most teljesen névtelen" ],
"A new room has been created" : [ null,
"Létrejött egy új csevegő szoba" ],
"Your nickname has been changed" : [ null,
"A beceneved módosításra került" ],
"<strong>%1$s</strong> has been banned" : [ null,
"A szobából kitíltva: <strong>%1$s</strong>" ],
"<strong>%1$s</strong> has been kicked out" : [ null,
"A szobából kidobva: <strong>%1$s</strong>" ],
"<strong>%1$s</strong> has been removed because of an affiliation change" : [
null,
"Taglista módosítás miatt a szobából kiléptetve: <strong>%1$s</strong>" ],
"<strong>%1$s</strong> has been removed for not being a member" : [
null,
"A taglistán nem szerepel így a szobából kiléptetve: <strong>%1$s</strong>" ],
"You have been banned from this room" : [ null,
"Ki lettél tíltva ebből a szobából" ],
"You have been kicked from this room" : [ null,
"Ki lettél dobva ebből a szobából" ],
"You have been removed from this room because of an affiliation change" : [
null,
"Taglista módosítás miatt kiléptettünk a csevegő szobából" ],
"You have been removed from this room because the room has changed to members-only and you're not a member" : [
null,
"Kiléptettünk a csevegő szobából, mert mostantól csak a taglistán szereplők lehetnek jelen." ],
"You have been removed from this room because the MUC (Multi-user chat) service is being shut down." : [
null,
"Kiléptettünk a csevegő szobából, mert a MUC (Multi-User Chat) szolgáltatás leállításra került." ],
"You are not on the member list of this room" : [ null,
"Nem szerepelsz a csevegő szoba taglistáján" ],
"No nickname was specified" : [ null,
"Nem lett megadva becenév" ],
"You are not allowed to create new rooms" : [ null,
"Nem lehet új csevegő szobát létrehozni" ],
"Your nickname doesn't conform to this room's policies" : [
null,
"A beceneved ütközik a csevegő szoba szabályzataival" ],
"Your nickname is already taken" : [ null,
"A becenevedet már valaki használja" ],
"This room does not (yet) exist" : [ null,
"Ez a szoba (még) nem létezik" ],
"This room has reached it's maximum number of occupants" : [
null,
"Ez a csevegő szoba elérte a maximális jelenlevők számát" ],
"Topic set by %1$s to: %2$s" : [ null,
"A következő témát állította be %1$s: %2$s" ],
"This user is a moderator" : [ null,
"Ez a felhasználó egy moderátor" ],
"This user can send messages in this room" : [ null,
"Ez a felhasználó küldhet üzenetet ebbe a szobába" ],
"This user can NOT send messages in this room" : [ null,
"Ez a felhasználó NEM küldhet üzenetet ebbe a szobába" ],
"Click to chat with this contact" : [ null,
"Csevegés indítása ezzel a kapcsolatunkkal" ],
"Click to remove this contact" : [ null, "A kapcsolat törlése" ],
"This contact is busy" : [ null, "Elfoglalt" ],
"This contact is online" : [ null, "Online" ],
"This contact is offline" : [ null, "Nincs bejelentkezve" ],
"This contact is unavailable" : [ null, "Elérhetetlen" ],
"This contact is away for an extended period" : [ null,
"Hosszabb ideje távol" ],
"This contact is away" : [ null, "Távol" ],
"Contact requests" : [ null, "Kapcsolat felvételi kérés" ],
"My contacts" : [ null, "Kapcsolatok:" ],
"Pending contacts" : [ null, "Függőben levő kapcsolatok" ],
"Custom status" : [ null, "Egyedi státusz" ],
"Click to change your chat status" : [ null,
"Saját státusz beállítása" ],
"Click here to write a custom status message" : [ null,
"Egyedi státusz üzenet írása" ],
"online" : [ null, "online" ],
"busy" : [ null, "elfoglalt" ],
"away for long" : [ null, "hosszú ideje távol" ],
"away" : [ null, "távol" ],
"I am %1$s" : [ null, "%1$s vagyok" ],
"Sign in" : [ null, "Belépés" ],
"XMPP/Jabber Username:" : [ null, "XMPP/Jabber azonosító:" ],
"Password:" : [ null, "Jelszó:" ],
"Log In" : [ null, "Belépés" ],
"BOSH Service URL:" : [ null, "BOSH szerver URL" ],
"Online Contacts" : [ null, "Online kapcsolatok" ]
}
}
};
if (typeof define === 'function' && define.amd) {
define("hu", [ 'jed' ], function() {
return factory(new Jed(translations));
});
} else {
if (!window.locales) {
window.locales = {};
}
window.locales.hu = factory(new Jed(translations));
}
}(this, function(hu) {
return hu;
}));
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -16,7 +16,7 @@
$chat-head-inverse-text-color: white;
$chat-head-height: 44px;
$save-button-color: #436F64;
$chat-textarea-height: 64px;
$chat-textarea-height: 62px;
$toolbar-height: 20px;
$message-them-color: #4B7003;
$roster-height: 194px;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -8,6 +8,8 @@
}
);
} (this, function ($, mock, test_utils) {
var $msg = converse_api.env.$msg;
return describe("The Minimized Chats Widget", $.proxy(function(mock, test_utils) {
beforeEach(function () {
runs(function () {
......
......@@ -8,6 +8,8 @@
}
);
} (this, function ($, mock, test_utils) {
var b64_sha1 = converse_api.env.b64_sha1;
return describe("The OTR module", $.proxy(function(mock, test_utils) {
beforeEach($.proxy(function () {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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