mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-01-20 22:49:53 +01:00
Release version 1.7.5
UPGRADE NOTES: if you have custom files in src/static/custom, save them somewhere else, revert the directory contents, update to Etherpad 1.7.5, and finally put them back in their new location, uder src/static/skins/no-skin.
This commit is contained in:
commit
6a3e4c69b8
113 changed files with 2968 additions and 1282 deletions
|
@ -1,6 +1,6 @@
|
|||
language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
||||
- "lts/*"
|
||||
install:
|
||||
- "bin/installDeps.sh"
|
||||
- "export GIT_HASH=$(git rev-parse --verify --short HEAD)"
|
||||
|
|
17
CHANGELOG.md
17
CHANGELOG.md
|
@ -1,3 +1,20 @@
|
|||
# 1.7.5
|
||||
* FEATURE: introduced support for multiple skins. See http://etherpad.org/doc/v1.7.5/#index_skins
|
||||
* FEATURE: added a new, optional skin. It can be activated choosing `skinName: "colibris"` in `settings.json`
|
||||
* FEATURE: allow file import using LibreOffice
|
||||
* SECURITY: updated many dependencies. No known high or moderate risk dependencies remain.
|
||||
* SECURITY: generate better random pad names
|
||||
* FIX: don't nuke all installed plugins if `npm install` fails
|
||||
* FIX: improved LibreOffice export
|
||||
* FIX: allow debug mode on node versions >= 6.3
|
||||
* MINOR: started making Etherpad less dependent on current working directory when running
|
||||
* MINOR: started simplifying the code structure, flattening complex conditions
|
||||
* MINOR: simplified a bit the startup scripts
|
||||
|
||||
*UPGRADE NOTES*: if you have custom files in `src/static/custom`, save them
|
||||
somewhere else, revert the directory contents, update to Etherpad 1.7.5, and
|
||||
finally put them back in their new location, uder `src/static/skins/no-skin`.
|
||||
|
||||
# 1.7.0
|
||||
* FIX: `getLineHTMLForExport()` no longer produces multiple copies of a line. **WARNING**: this could potentially break some plugins
|
||||
* FIX: authorship of bullet points no longer changes when a second author edits them
|
||||
|
|
|
@ -119,7 +119,7 @@ Back-end tests can be run from the `src` directory, via `npm test`.
|
|||
|
||||
## Things you can help with
|
||||
Etherpad is much more than software. So if you aren't a developer then worry not, there is still a LOT you can do! A big part of what we do is community engagement. You can help in the following ways
|
||||
* Triage bugs (applying labels) and confirming their existance
|
||||
* Triage bugs (applying labels) and confirming their existence
|
||||
* Testing fixes (simply applying them and seeing if it fixes your issue or not) - Some git experience required
|
||||
* Notifying large site admins of new releases
|
||||
* Writing Changelogs for releases
|
||||
|
|
29
README.md
29
README.md
|
@ -2,9 +2,9 @@
|
|||
![Demo Etherpad Animated Jif](https://i.imgur.com/zYrGkg3.gif "Etherpad in action on PrimaryPad")
|
||||
|
||||
# About
|
||||
Etherpad is a really-real time collaborative editor scalable to thousands of simultanious real time users. Unlike all other collaborative tools Etherpad provides full fidelity data export and portability making it fully GDPR compliant.
|
||||
Etherpad is a really-real time collaborative editor scalable to thousands of simultaneous real time users. Unlike all other collaborative tools Etherpad provides full fidelity data export and portability making it fully GDPR compliant.
|
||||
|
||||
**[Try it out](http://beta.etherpad.org)**
|
||||
**[Try it out](https://beta.etherpad.org)**
|
||||
|
||||
# Installation
|
||||
|
||||
|
@ -15,26 +15,19 @@ Etherpad is a really-real time collaborative editor scalable to thousands of sim
|
|||
```
|
||||
curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
|
||||
sudo apt-get install -y nodejs
|
||||
git clone https://github.com/ether/etherpad-lite.git && cd etherpad-lite && bin/run.sh
|
||||
git clone --branch master https://github.com/ether/etherpad-lite.git && cd etherpad-lite && bin/run.sh
|
||||
```
|
||||
|
||||
## GNU/Linux and other UNIX-like systems
|
||||
You'll need gzip, git, curl, libssl develop libraries, python and gcc.
|
||||
- *For Debian/Ubuntu*: `apt install gzip git curl python libssl-dev pkg-config build-essential`
|
||||
- *For Fedora/CentOS*: `yum install gzip git curl python openssl-devel && yum groupinstall "Development Tools"`
|
||||
- *For FreeBSD*: `portinstall node, npm, curl, git (optional)`
|
||||
|
||||
Additionally, you'll need [node.js](https://nodejs.org) installed (minimum required Node version: **6.9.0**).
|
||||
Ideally, the latest stable version is preferred. Please note that the packages offered on some operating systems are outdated. In those cases, we recommend installing nodejs from official archives or compiling it from source (avoiding yum/apt).
|
||||
You'll need git and [node.js](https://nodejs.org) installed (minimum required Node version: **6.9.0**, preferred: >= **8.9**).
|
||||
|
||||
**As any user (we recommend creating a separate user called etherpad):**
|
||||
|
||||
1. Move to a folder where you want to install Etherpad. Clone the git repository: `git clone git://github.com/ether/etherpad-lite.git`
|
||||
1. Move to a folder where you want to install Etherpad. Clone the git repository: `git clone --branch master git://github.com/ether/etherpad-lite.git`
|
||||
2. Change into the new directory containing the cloned source code: `cd etherpad-lite`
|
||||
3. run `bin/run.sh` and open <http://127.0.0.1:9001> in your browser.
|
||||
|
||||
Now, run `bin/run.sh` and open <http://127.0.0.1:9001> in your browser.
|
||||
|
||||
Update to the latest version with `git pull origin`. The next start with `bin/run.sh` will update the dependencies.
|
||||
To update to the latest released version, execute `git pull origin`. The next start with `bin/run.sh` will update the dependencies.
|
||||
|
||||
[Next steps](#next-steps).
|
||||
|
||||
|
@ -48,12 +41,12 @@ This package works out of the box on any windows machine, but it's not very usef
|
|||
|
||||
Now, run `start.bat` and open <http://localhost:9001> in your browser. You like it? [Next steps](#next-steps).
|
||||
|
||||
### Fancy install
|
||||
### Manually install on Windows
|
||||
You'll need [node.js](https://nodejs.org) and (optionally, though recommended) git.
|
||||
|
||||
1. Grab the source, either
|
||||
- download <https://github.com/ether/etherpad-lite/zipball/master>
|
||||
- or `git clone https://github.com/ether/etherpad-lite.git` (for this you need git, obviously)
|
||||
- or `git clone --branch master https://github.com/ether/etherpad-lite.git` (for this you need git, obviously)
|
||||
2. start `bin\installOnWindows.bat`
|
||||
|
||||
Now, run `start.bat` and open <http://localhost:9001> in your browser.
|
||||
|
@ -114,9 +107,9 @@ Etherpad is written in JavaScript on both the server and client so it's easy for
|
|||
|
||||
# HTTP API
|
||||
Etherpad is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API)
|
||||
that allows your web application to manage pads, users and groups. It is recommended to use the [available client implementations](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) in order to interact with this API.
|
||||
that allows your web application to manage pads, users and groups. It is recommended to use the [available client implementations](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) in order to interact with this API.
|
||||
|
||||
# jQuery plugin
|
||||
# jQuery plugin
|
||||
There is a [jQuery plugin](https://github.com/ether/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website.
|
||||
|
||||
# Plugin Framework
|
||||
|
|
|
@ -8,7 +8,7 @@ if(process.argv.length != 2)
|
|||
process.exit(1);
|
||||
}
|
||||
|
||||
//initalize the variables
|
||||
//initialize the variables
|
||||
var db, settings, padManager;
|
||||
var npm = require("../src/node_modules/npm");
|
||||
var async = require("../src/node_modules/async");
|
||||
|
@ -25,7 +25,7 @@ async.series([
|
|||
settings = require('../src/node/utils/Settings');
|
||||
db = require('../src/node/db/DB');
|
||||
|
||||
//initalize the database
|
||||
//initialize the database
|
||||
db.init(callback);
|
||||
},
|
||||
//load pads
|
||||
|
|
|
@ -38,4 +38,4 @@ bin/installDeps.sh $* || exit 1
|
|||
echo "Started Etherpad..."
|
||||
|
||||
SCRIPTPATH=`pwd -P`
|
||||
node "${$SCRIPTPATH}/node_modules/ep_etherpad-lite/node/server.js" $*
|
||||
node "${SCRIPTPATH}/node_modules/ep_etherpad-lite/node/server.js" $*
|
||||
|
|
|
@ -422,7 +422,7 @@ function convertPad(padId, callback)
|
|||
|
||||
/**
|
||||
* This parses a Page like Etherpad uses them in the databases
|
||||
* The offsets descripes the length of a unit in the page, the data are
|
||||
* The offsets describes the length of a unit in the page, the data are
|
||||
* all values behind each other
|
||||
*/
|
||||
function parsePage(array, pageStart, offsets, data, json)
|
||||
|
|
|
@ -11,18 +11,10 @@ fi
|
|||
#Prepare the environment
|
||||
bin/installDeps.sh || exit 1
|
||||
|
||||
hash node-inspector > /dev/null 2>&1 || {
|
||||
echo "You need to install node-inspector to run the tests!" >&2
|
||||
echo "You can install it with npm" >&2
|
||||
echo "Run: npm install -g node-inspector" >&2
|
||||
exit 1
|
||||
}
|
||||
echo "If you are new to debugging Node.js with Chrome DevTools, take a look at this page:"
|
||||
echo "https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27"
|
||||
echo "Open 'chrome://inspect' on Chrome to start debugging."
|
||||
|
||||
node-inspector &
|
||||
|
||||
echo "If you are new to node-inspector, take a look at this video: https://youtu.be/AOnK3NVnxL8"
|
||||
|
||||
node --debug node_modules/ep_etherpad-lite/node/server.js $*
|
||||
|
||||
#Kill node-inspector before ending
|
||||
kill $!
|
||||
#Use 0.0.0.0 to allow external connections to the debugger
|
||||
#(ex: running Etherpad on a docker container). Use default port # (9229)
|
||||
node --inspect=0.0.0.0:9229 node_modules/ep_etherpad-lite/node/server.js $*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env PYTHONUNBUFFERED=1 python2
|
||||
#!/usr/bin/env PYTHONUNBUFFERED=1 python
|
||||
#
|
||||
# Created by Bjarni R. Einarsson, placed in the public domain. Go wild!
|
||||
#
|
||||
|
@ -12,34 +12,37 @@ try:
|
|||
assert(os.path.exists(dirtydb_input))
|
||||
assert(not os.path.exists(dirtydb_output))
|
||||
except:
|
||||
print
|
||||
print 'Usage: %s /path/to/dirty.db' % sys.argv[0]
|
||||
print
|
||||
print 'Note: Will create a file named dirty.db.new in the same folder,'
|
||||
print ' please make sure permissions are OK and a file by that'
|
||||
print ' name does not exist already. This script works by omitting'
|
||||
print ' duplicate lines from the dirty.db file, keeping only the'
|
||||
print ' last (latest) instance. No revision data should be lost,'
|
||||
print ' but be careful, make backups. If it breaks you get to keep'
|
||||
print ' both pieces!'
|
||||
print
|
||||
print()
|
||||
print('Usage: %s /path/to/dirty.db' % sys.argv[0])
|
||||
print()
|
||||
print('Note: Will create a file named dirty.db.new in the same folder,')
|
||||
print(' please make sure permissions are OK and a file by that')
|
||||
print(' name does not exist already. This script works by omitting')
|
||||
print(' duplicate lines from the dirty.db file, keeping only the')
|
||||
print(' last (latest) instance. No revision data should be lost,')
|
||||
print(' but be careful, make backups. If it breaks you get to keep')
|
||||
print(' both pieces!')
|
||||
print()
|
||||
sys.exit(1)
|
||||
|
||||
dirtydb = {}
|
||||
lines = 0
|
||||
with open(dirtydb_input, 'r') as fd:
|
||||
print 'Reading %s' % dirtydb_input
|
||||
print('Reading %s' % dirtydb_input)
|
||||
for line in fd:
|
||||
lines += 1
|
||||
data = json.loads(line)
|
||||
dirtydb[data['key']] = line
|
||||
try:
|
||||
data = json.loads(line)
|
||||
dirtydb[data['key']] = line
|
||||
except:
|
||||
print("Skipping invalid JSON!")
|
||||
if lines % 10000 == 0:
|
||||
sys.stderr.write('.')
|
||||
print
|
||||
print 'OK, found %d unique keys in %d lines' % (len(dirtydb), lines)
|
||||
print()
|
||||
print('OK, found %d unique keys in %d lines' % (len(dirtydb), lines))
|
||||
|
||||
with open(dirtydb_output, 'w') as fd:
|
||||
for data in dirtydb.values():
|
||||
for data in list(dirtydb.values()):
|
||||
fd.write(data)
|
||||
|
||||
print 'Wrote data to %s. All done!' % dirtydb_output
|
||||
print('Wrote data to %s. All done!' % dirtydb_output)
|
||||
|
|
|
@ -56,20 +56,6 @@ if [ -d "../bin" ]; then
|
|||
cd "../"
|
||||
fi
|
||||
|
||||
#Is gnu-grep (ggrep) installed on SunOS (Solaris)
|
||||
if [ $(uname) = "SunOS" ]; then
|
||||
hash ggrep > /dev/null 2>&1 || {
|
||||
echo "Please install ggrep (pkg install gnu-grep)" >&2
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
|
||||
#Is curl installed?
|
||||
hash curl > /dev/null 2>&1 || {
|
||||
echo "Please install curl" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
#Is node installed?
|
||||
#Not checking io.js, default installation creates a symbolic link to node
|
||||
hash node > /dev/null 2>&1 || {
|
||||
|
@ -116,44 +102,12 @@ echo "Ensure that all dependencies are up to date... If this is the first time
|
|||
cd ep_etherpad-lite
|
||||
npm install --no-save --loglevel warn
|
||||
) || {
|
||||
rm -rf node_modules
|
||||
rm -rf src/node_modules
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "Ensure jQuery is downloaded and up to date..."
|
||||
DOWNLOAD_JQUERY="true"
|
||||
NEEDED_VERSION="1.9.1"
|
||||
if [ -f "src/static/js/jquery.js" ]; then
|
||||
if [ $(uname) = "SunOS" ]; then
|
||||
VERSION=$(head -n 3 src/static/js/jquery.js | ggrep -o "v[0-9]\.[0-9]\(\.[0-9]\)\?")
|
||||
else
|
||||
VERSION=$(head -n 3 src/static/js/jquery.js | grep -o "v[0-9]\.[0-9]\(\.[0-9]\)\?")
|
||||
fi
|
||||
|
||||
if [ ${VERSION#v} = $NEEDED_VERSION ]; then
|
||||
DOWNLOAD_JQUERY="false"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $DOWNLOAD_JQUERY = "true" ]; then
|
||||
curl -lo src/static/js/jquery.js https://code.jquery.com/jquery-$NEEDED_VERSION.js || exit 1
|
||||
fi
|
||||
|
||||
#Remove all minified data to force node creating it new
|
||||
echo "Clearing minified cache..."
|
||||
rm -f var/minified*
|
||||
|
||||
echo "Ensure custom css/js files are created..."
|
||||
|
||||
for f in "index" "pad" "timeslider"
|
||||
do
|
||||
if [ ! -f "src/static/custom/$f.js" ]; then
|
||||
cp "src/static/custom/js.template" "src/static/custom/$f.js" || exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "src/static/custom/$f.css" ]; then
|
||||
cp "src/static/custom/css.template" "src/static/custom/$f.css" || exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
|
|
|
@ -18,14 +18,6 @@ cmd /C npm install --loglevel warn || exit /B 1
|
|||
|
||||
cd /D "%~dp0\.."
|
||||
|
||||
echo _
|
||||
echo Copying custom templates...
|
||||
set custom_dir=node_modules\ep_etherpad-lite\static\custom
|
||||
FOR %%f IN (index pad timeslider) DO (
|
||||
if NOT EXIST "%custom_dir%\%%f.js" copy "%custom_dir%\js.template" "%custom_dir%\%%f.js"
|
||||
if NOT EXIST "%custom_dir%\%%f.css" copy "%custom_dir%\css.template" "%custom_dir%\%%f.css"
|
||||
)
|
||||
|
||||
echo _
|
||||
echo Clearing cache...
|
||||
del /S var\minified*
|
||||
|
@ -39,4 +31,4 @@ IF NOT EXIST settings.json (
|
|||
)
|
||||
|
||||
echo _
|
||||
echo Installed Etherpad! To run Etherpad type start.bat
|
||||
echo Installed Etherpad! To run Etherpad type start.bat
|
||||
|
|
|
@ -6,12 +6,17 @@ require("ep_etherpad-lite/node_modules/npm").load({}, function(er,npm) {
|
|||
// to work with a real database. Please make a backup of your dirty.db
|
||||
// file before using this script, just to be safe.
|
||||
|
||||
// It might be necessary to run the script using more memory:
|
||||
// `node --max-old-space-size=4096 bin/migrateDirtyDBtoRealDB.js`
|
||||
|
||||
|
||||
var settings = require("ep_etherpad-lite/node/utils/Settings");
|
||||
var dirty = require("../src/node_modules/dirty")('var/dirty.db');
|
||||
var ueberDB = require("../src/node_modules/ueberdb2");
|
||||
var log4js = require("../src/node_modules/log4js");
|
||||
var dbWrapperSettings = {
|
||||
"cache": "0", // The cache slows things down when you're mostly writing.
|
||||
"writeInterval": 0 // Write directly to the database, don't buffer
|
||||
};
|
||||
var db = new ueberDB.database(settings.dbType, settings.dbSettings, dbWrapperSettings, log4js.getLogger("ueberDB"));
|
||||
|
||||
|
|
|
@ -356,7 +356,7 @@ Called from: src/static/js/ace2_inner.js
|
|||
|
||||
Things in context:
|
||||
|
||||
1. dynamicCSS - css manger for inner ace
|
||||
1. dynamicCSS - css manager for inner ace
|
||||
2. outerDynamicCSS - css manager for outer ace
|
||||
3. parentDynamicCSS - css manager for parent document
|
||||
4. info - author style info
|
||||
|
|
|
@ -379,7 +379,7 @@ Restores revision from past as new changeset
|
|||
returns
|
||||
|
||||
* a part of the chat history, when `start` and `end` are given
|
||||
* the whole chat histroy, when no extra parameters are given
|
||||
* the whole chat history, when no extra parameters are given
|
||||
|
||||
|
||||
*Example returns:*
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
# Custom static files
|
||||
Etherpad allows you to include your own static files in the browser, by modifying the files in `static/custom`.
|
||||
|
||||
* `index.js` Javascript that'll be run in `/`
|
||||
* `index.css` Stylesheet affecting `/`
|
||||
* `pad.js` Javascript that'll be run in `/p/:padid`
|
||||
* `pad.css` Stylesheet affecting `/p/:padid`
|
||||
* `timeslider.js` Javascript that'll be run in `/p/:padid/timeslider`
|
||||
* `timeslider.css` Stylesheet affecting `/p/:padid/timeslider`
|
||||
* `favicon.ico` Overrides the default favicon.
|
||||
* `robots.txt` Overrides the default `robots.txt`.
|
|
@ -13,7 +13,7 @@ Contains all information about pads
|
|||
* **head** - the number of the latest revision
|
||||
* **chatHead** - the number of the latest chat entry
|
||||
* **public** - flag that disables security for this pad
|
||||
* **passwordHash** - string that contains a bcrypt hashed password for this pad
|
||||
* **passwordHash** - string that contains a salted sha512 sum of this pad's password
|
||||
|
||||
### pad:$PADID:revs:$REVNUM
|
||||
Saves a revision $REVNUM of pad $PADID
|
||||
|
|
Binary file not shown.
|
@ -1,7 +1,7 @@
|
|||
@include documentation
|
||||
@include stats
|
||||
@include localization
|
||||
@include custom_static
|
||||
@include skins
|
||||
@include api/api
|
||||
@include plugins
|
||||
@include database
|
||||
|
|
|
@ -47,6 +47,22 @@ You can omit the `FUNCTIONNAME` part, if the exported function has got the same
|
|||
### Client hooks and server hooks
|
||||
There are server hooks, which will be executed on the server (e.g. `expressCreateServer`), and there are client hooks, which are executed on the client (e.g. `acePopulateDomLine`). Be sure to not make assumptions about the environment your code is running in, e.g. don't try to access `process`, if you know your code will be run on the client, and likewise, don't try to access `window` on the server...
|
||||
|
||||
### Styling
|
||||
When you install a client-side plugin (e.g. one that implements at least one client-side hook), the plugin name is added to the `class` attribute of the div `#editorcontainerbox` in the main window.
|
||||
This gives you the opportunity of tuning the appearance of the main UI in your plugin.
|
||||
|
||||
For example, this is the markup with no plugins installed:
|
||||
```html
|
||||
<div id="editorcontainerbox" class="">
|
||||
```
|
||||
|
||||
and this is the contents after installing `someplugin`:
|
||||
```html
|
||||
<div id="editorcontainerbox" class="ep_someplugin">
|
||||
```
|
||||
|
||||
This feature was introduced in Etherpad **1.8**.
|
||||
|
||||
### Parts
|
||||
As your plugins become more and more complex, you will find yourself in the need to manage dependencies between plugins. E.g. you want the hooks of a certain plugin to be executed before (or after) yours. You can also manage these dependencies in your plugin definition file `ep.json`:
|
||||
|
||||
|
|
19
doc/skins.md
Normal file
19
doc/skins.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Skins
|
||||
You can customize Etherpad appearance using skins.
|
||||
A skin is a directory located under `static/skins/<skin_name>`, with the following contents:
|
||||
|
||||
* `index.js`: javascript that will be run in `/`
|
||||
* `index.css`: stylesheet affecting `/`
|
||||
* `pad.js`: javascript that will be run in `/p/:padid`
|
||||
* `pad.css`: stylesheet affecting `/p/:padid`
|
||||
* `timeslider.js`: javascript that will be run in `/p/:padid/timeslider`
|
||||
* `timeslider.css`: stylesheet affecting `/p/:padid/timeslider`
|
||||
* `favicon.ico`: overrides the default favicon
|
||||
* `robots.txt`: overrides the default `robots.txt`
|
||||
|
||||
You can choose a skin changing the parameter `skinName` in `settings.json`.
|
||||
|
||||
Since Etherpad **1.7.5**, two skins are included:
|
||||
|
||||
* `no-skin`: an empty skin, leaving the default Etherpad appearance unchanged, that you can use as a guidance to develop your own.
|
||||
* `colibris`: a new, experimental skin, that will become the default in Etherpad 2.0.
|
|
@ -18,6 +18,19 @@
|
|||
*/
|
||||
"favicon": "favicon.ico",
|
||||
|
||||
/*
|
||||
* Skin name.
|
||||
*
|
||||
* Its value has to be an existing directory under src/static/skins.
|
||||
* You can write your own, or use one of the included ones:
|
||||
*
|
||||
* - "no-skin": an empty skin (default). This yields the unmodified,
|
||||
* traditional Etherpad theme.
|
||||
* - "colibris": the new experimental skin (since Etherpad 1.8), candidate to
|
||||
* become the default in Etherpad 2.0
|
||||
*/
|
||||
"skinName": "no-skin",
|
||||
|
||||
/*
|
||||
* IP and port which etherpad should bind at
|
||||
*/
|
||||
|
@ -56,18 +69,16 @@
|
|||
* You shouldn't use "dirty" for for anything else than testing or
|
||||
* development.
|
||||
*
|
||||
* For a complete list of the supported drivers, please consult:
|
||||
*
|
||||
* Database specific settings are dependent on dbType, and go in dbSettings.
|
||||
* Remember that since Etherpad 1.6.0 you can also store these informations in
|
||||
* credentials.json.
|
||||
*
|
||||
* For a complete list of the supported drivers, please refer to:
|
||||
* https://www.npmjs.com/package/ueberdb2
|
||||
*/
|
||||
|
||||
"dbType" : "dirty",
|
||||
|
||||
/*
|
||||
* Database specific settings (dependent on dbType).
|
||||
*
|
||||
* Remember that since Etherpad 1.6.0 you can also store these informations in
|
||||
* credentials.json.
|
||||
*/
|
||||
"dbSettings" : {
|
||||
"filename" : "var/dirty.db"
|
||||
},
|
||||
|
|
|
@ -61,7 +61,7 @@
|
|||
"pad.importExport.exportword": "مايكروسوفت وورد",
|
||||
"pad.importExport.exportpdf": "صيغة المستندات المحمولة",
|
||||
"pad.importExport.exportopen": "ODF (نسق المستند المفتوح)",
|
||||
"pad.importExport.abiword.innerHTML": "لايمكنك الاستيراد إلا من نص عادي أو من تنسيقات إتش تي إم إل. للحصول على المزيد من ميزات الاستيراد المتقدمة، يرجى تثبيت أبيورد <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"></a>.",
|
||||
"pad.importExport.abiword.innerHTML": "لا يمكنك الاستيراد إلا من نص عادي أو من تنسيقات HTML. للحصول على المزيد من ميزات الاستيراد المتقدمة، يرجى <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">تثبيت AbiWord</a>.",
|
||||
"pad.modals.connected": "متصل.",
|
||||
"pad.modals.reconnecting": "إعادة الاتصال ببادك",
|
||||
"pad.modals.forcereconnect": "فرض إعادة الاتصال",
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
"pad.toolbar.redo.title": "Връщане (Ctrl+Y)",
|
||||
"pad.toolbar.settings.title": "Настройки",
|
||||
"pad.colorpicker.save": "Съхраняване",
|
||||
"pad.colorpicker.cancel": "Отказване",
|
||||
"pad.colorpicker.cancel": "Отказ",
|
||||
"pad.loading": "Зареждане...",
|
||||
"pad.wrongPassword": "Неправилна парола",
|
||||
"pad.settings.language": "Език:",
|
||||
|
@ -29,7 +29,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.modals.cancel": "Отказване",
|
||||
"pad.modals.cancel": "Отказ",
|
||||
"pad.modals.userdup": "Отворен в друг прозорец",
|
||||
"pad.modals.userdup.explanation": "Изглежда, че този пад е отворен на повече от един раздел в браузъра на компютъра.",
|
||||
"pad.modals.looping.explanation": "Има проблеми с комуникацията със сървъра за синхронизация.",
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.importExport.abiword.innerHTML": "Ne c'hallit ket emporzjiañ furmadoù testennoù kriz pe html. Evit arc'hwelioù enporzhiañ emdroetoc'h, staliit <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">abiword</a> mar plij.",
|
||||
"pad.importExport.abiword.innerHTML": "Ne c'hallit ket enporzhiañ furmadoù testennoù kriz pe HTML hepken. Evit arc'hwelioù enporzhiañ emdroetoc'h, staliit <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">staliañ Abiword</a> mar plij.",
|
||||
"pad.modals.connected": "Kevreet.",
|
||||
"pad.modals.reconnecting": "Adkevreañ war-zu ho pad...",
|
||||
"pad.modals.forcereconnect": "Adkevreañ dre heg",
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
"Christian List",
|
||||
"Peter Alberti",
|
||||
"Steenth",
|
||||
"Joedalton"
|
||||
"Joedalton",
|
||||
"Saederup92"
|
||||
]
|
||||
},
|
||||
"index.newPad": "Ny Pad",
|
||||
|
@ -43,6 +44,7 @@
|
|||
"pad.settings.fontType": "Skrifttype:",
|
||||
"pad.settings.fontType.normal": "Normal",
|
||||
"pad.settings.fontType.monospaced": "Fastbredde",
|
||||
"pad.settings.fontType.trebuchet": "Blide",
|
||||
"pad.settings.globalView": "Global visning",
|
||||
"pad.settings.language": "Sprog:",
|
||||
"pad.importExport.import_export": "Import/Eksport",
|
||||
|
|
|
@ -13,7 +13,8 @@
|
|||
"Macofe",
|
||||
"Fitoschido",
|
||||
"Dgstranz",
|
||||
"Luzcaru"
|
||||
"Luzcaru",
|
||||
"Tiberius1701"
|
||||
]
|
||||
},
|
||||
"index.newPad": "Nuevo pad",
|
||||
|
@ -83,14 +84,14 @@
|
|||
"pad.modals.slowcommit.explanation": "El servidor no responde.",
|
||||
"pad.modals.slowcommit.cause": "Puede deberse a problemas con tu conexión de red.",
|
||||
"pad.modals.badChangeset.explanation": "Has hecho una edición clasificada como ilegal por el servidor de sincronización.",
|
||||
"pad.modals.badChangeset.cause": "Esto podría deberse a una mala configuración del servidor o algún otro comportamiento inesperado. Contacta al administrador del servicio, si piensas que esto es un error. Intenta reconectarte con el fin de seguir editando.",
|
||||
"pad.modals.badChangeset.cause": "Esto podría deberse a una mala configuración del servidor o algún otro comportamiento inesperado. Contacta con administrador del servicio, si piensas que esto es un error. Intenta volver a conectar para continuar editando.",
|
||||
"pad.modals.corruptPad.explanation": "El pad que intentas acceder está dañado.",
|
||||
"pad.modals.corruptPad.cause": "Esto puede deberse a una mala configuración del servidor o algún otro comportamiento inesperado. Contacta al administrador del servicio.",
|
||||
"pad.modals.corruptPad.cause": "Esto puede deberse a una mala configuración del servidor o algún otro comportamiento inesperado. Contacta con el administrador del servicio.",
|
||||
"pad.modals.deleted": "Borrado.",
|
||||
"pad.modals.deleted.explanation": "Este pad ha sido borrado.",
|
||||
"pad.modals.disconnected": "Te has desconectado.",
|
||||
"pad.modals.disconnected.explanation": "Se perdió la conexión con el servidor",
|
||||
"pad.modals.disconnected.cause": "El servidor podría no estar disponible. Contacta al administrador del servicio si esto continúa sucediendo.",
|
||||
"pad.modals.disconnected.cause": "El servidor podría no estar disponible. Contacta con el administrador del servicio si esto continúa sucediendo.",
|
||||
"pad.share": "Compatir este pad",
|
||||
"pad.share.readonly": "Solo lectura",
|
||||
"pad.share.link": "Enlace",
|
||||
|
@ -139,5 +140,5 @@
|
|||
"pad.impexp.uploadFailed": "El envío falló. Inténtalo de nuevo.",
|
||||
"pad.impexp.importfailed": "Fallo al importar",
|
||||
"pad.impexp.copypaste": "Intenta copiar y pegar",
|
||||
"pad.impexp.exportdisabled": "La exportación al formato {{type}} está desactivada. Contacta a tu administrador de sistemas."
|
||||
"pad.impexp.exportdisabled": "La exportación al formato {{type}} está desactivada. Contacta con tu administrador del sistema."
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.importExport.abiword.innerHTML": "Só pode importar texto simple ou formatos HTML. Para obter máis información sobre as características de importación avanzadas <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instale abiword</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "Só pode importar texto simple ou formatos HTML. Para obter máis información sobre as características de importación avanzadas <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instale AbiWord</a>.",
|
||||
"pad.modals.connected": "Conectado.",
|
||||
"pad.modals.reconnecting": "Reconectando co seu documento...",
|
||||
"pad.modals.forcereconnect": "Forzar a reconexión",
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.importExport.abiword.innerHTML": "Þú getur aðeins flutt inn úr hreinum texta eða HTML sniðum. Til að geta nýtt \nfleiri þróaðri innflutningssnið <a href=\"https://github.com/ether/etherpad-li\nte/wiki/How-to-e\nnable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-\nSLES-with-AbiWord\">settu þá upp abiword forritið</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "Þú getur aðeins flutt inn úr hreinum texta eða HTML sniðum. Til að geta nýtt \nfleiri þróaðri innflutningssnið <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">settu þá upp AbiWord forritið</a>.",
|
||||
"pad.modals.connected": "Tengt.",
|
||||
"pad.modals.reconnecting": "Endurtengist skrifblokkinni þinni...",
|
||||
"pad.modals.forcereconnect": "Þvinga endurtengingu",
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
"Eitvys200",
|
||||
"Mantak111",
|
||||
"I-svetaines",
|
||||
"Zygimantus"
|
||||
"Zygimantus",
|
||||
"Vogone"
|
||||
]
|
||||
},
|
||||
"index.newPad": "Naujas bloknotas",
|
||||
|
@ -54,7 +55,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Atvirasis dokumento formatas)",
|
||||
"pad.importExport.abiword.innerHTML": "Galite importuoti tik iš paprasto teksto ar HTML formato. Dėl išplėstinių importavimo funkcijų prašome <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">įdiegti abiword</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "Galite importuoti tik iš paprasto teksto ar HTML formato. Dėl išplėstinių importavimo funkcijų prašome <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">įdiegti AbiWord</a>.",
|
||||
"pad.modals.connected": "Prisijungta.",
|
||||
"pad.modals.reconnecting": "Iš naujo prisijungiama prie Jūsų bloknoto",
|
||||
"pad.modals.forcereconnect": "Priversti prisijungti iš naujo",
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.importExport.abiword.innerHTML": "Можете да увезувате само од прост текст и HTML-формат. Понапредни можности за увоз ќе добиете ако <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">воспоставите AbiWord</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "Можете да увезувате само од прост текст и HTML-формат. Понапредни можности за увоз ќе добиете ако <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">воспоставите AbiWord</a>.",
|
||||
"pad.modals.connected": "Поврзано.",
|
||||
"pad.modals.reconnecting": "Ве преповрзувам со тетратката...",
|
||||
"pad.modals.forcereconnect": "Наметни преповрзување",
|
||||
|
|
|
@ -7,14 +7,15 @@
|
|||
"Praveenp",
|
||||
"Santhosh.thottingal",
|
||||
"Nesi",
|
||||
"Jinoytommanjaly"
|
||||
"Jinoytommanjaly",
|
||||
"Ambadyanands"
|
||||
]
|
||||
},
|
||||
"index.newPad": "പുതിയ പാഡ്",
|
||||
"index.createOpenPad": "അല്ലെങ്കിൽ പേരുപയോഗിച്ച് പാഡ് സൃഷ്ടിക്കുക/തുറക്കുക:",
|
||||
"pad.toolbar.bold.title": "കടുപ്പത്തിലെഴുതുക (Ctrl-B)",
|
||||
"pad.toolbar.italic.title": "ചെരിച്ചെഴുതുക (Ctrl-I)",
|
||||
"pad.toolbar.underline.title": "അടിവരയിടുക (Ctrl-U)",
|
||||
"pad.toolbar.bold.title": "കടുപ്പത്തിലെഴുതുക (Ctrl+B)",
|
||||
"pad.toolbar.italic.title": "ചെരിച്ചെഴുതുക (Ctrl+I)",
|
||||
"pad.toolbar.underline.title": "അടിവരയിടുക (Ctrl+U)",
|
||||
"pad.toolbar.strikethrough.title": "വെട്ടുക (Ctrl+5)",
|
||||
"pad.toolbar.ol.title": "ക്രമത്തിലുള്ള പട്ടിക (Ctrl+Shift+N)",
|
||||
"pad.toolbar.ul.title": "ക്രമരഹിത പട്ടിക (Ctrl+Shift+L)",
|
||||
|
@ -22,7 +23,7 @@
|
|||
"pad.toolbar.unindent.title": "ഇടത്തേക്ക് തള്ളുക (ഷിഫ്റ്റ്+ടാബ്)",
|
||||
"pad.toolbar.undo.title": "തിരസ്കരിക്കുക (Ctrl-Z)",
|
||||
"pad.toolbar.redo.title": "വീണ്ടും ചെയ്യുക (Ctrl-Y)",
|
||||
"pad.toolbar.clearAuthorship.title": "രചയിതാക്കൾക്കുള്ള നിറം കളയുക (Ctrl+Shift+C)",
|
||||
"pad.toolbar.clearAuthorship.title": "രചയിതാക്കൾക്കുള്ള നിറങ്ങൾ കളയുക (Ctrl+Shift+C)",
|
||||
"pad.toolbar.import_export.title": "വ്യത്യസ്ത ഫയൽ തരങ്ങളിലേക്ക്/തരങ്ങളിൽ നിന്ന് ഇറക്കുമതി/കയറ്റുമതി ചെയ്യുക",
|
||||
"pad.toolbar.timeslider.title": "സമയരേഖ",
|
||||
"pad.toolbar.savedRevision.title": "നാൾപ്പതിപ്പ് സേവ് ചെയ്യുക",
|
||||
|
@ -58,10 +59,11 @@
|
|||
"pad.importExport.exportword": "മൈക്രോസോഫ്റ്റ് വേഡ്",
|
||||
"pad.importExport.exportpdf": "പി.ഡി.എഫ്.",
|
||||
"pad.importExport.exportopen": "ഒ.ഡി.എഫ്. (ഓപ്പൺ ഡോക്യുമെന്റ് ഫോർമാറ്റ്)",
|
||||
"pad.importExport.abiword.innerHTML": "പ്ലെയിൻ ടെക്സ്റ്റോ എച്ച്.റ്റി.എം.എൽ. തരമോ മാത്രമേ താങ്കൾക്ക് ഇറക്കുമതി ചെയ്യാനാവൂ. കൂടുതൽ വിപുലീകൃത ഇറക്കുമതി സൗകര്യങ്ങൾക്കായി ദയവായി <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">അബിവേഡ് ഇൻസ്റ്റോൾ ചെയ്യുക</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "പ്ലെയിൻ ടെക്സ്റ്റോ എച്ച്.റ്റി.എം.എൽ. തരമോ മാത്രമേ താങ്കൾക്ക് ഇറക്കുമതി ചെയ്യാനാവൂ. കൂടുതൽ വിപുലീകൃത ഇറക്കുമതി സൗകര്യങ്ങൾക്കായി ദയവായി <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">അബിവേഡ് ഇൻസ്റ്റോൾ ചെയ്യുക</a>.",
|
||||
"pad.modals.connected": "ബന്ധിപ്പിച്ചിരിക്കുന്നു.",
|
||||
"pad.modals.reconnecting": "താങ്കളുടെ പാഡിലേയ്ക്ക് വീണ്ടും ബന്ധിപ്പിക്കുന്നു...",
|
||||
"pad.modals.forcereconnect": "എന്തായാലും ബന്ധിപ്പിക്കുക",
|
||||
"pad.modals.reconnecttimer": "വീണ്ടും ബന്ധപ്പെടുവാൻ ശ്രമിക്കുന്നു",
|
||||
"pad.modals.cancel": "റദ്ദാക്കുക",
|
||||
"pad.modals.userdup": "മറ്റൊരു ജാലകത്തിൽ തുറന്നിരിക്കുന്നു",
|
||||
"pad.modals.userdup.explanation": "ഈ കമ്പ്യൂട്ടറിൽ ഈ പാഡ് ഒന്നിലധികം ബ്രൗസർ ജാലകങ്ങളിൽ തുറന്നതായി കാണുന്നു.",
|
||||
|
@ -99,6 +101,7 @@
|
|||
"timeslider.exportCurrent": "ഈ പതിപ്പ് ഇങ്ങനെ എടുക്കുക:",
|
||||
"timeslider.version": "പതിപ്പ് {{version}}",
|
||||
"timeslider.saved": "സേവ് ചെയ്തത് {{month}} {{day}}, {{year}}",
|
||||
"timeslider.playPause": "പാഡിലെ ഉള്ളടക്കങ്ങൾ പ്ലേ / പോസ് ചെയ്യുക",
|
||||
"timeslider.backRevision": "ഈ പാഡിലെ ഒരു നാൾപ്പതിപ്പിലേക്ക് മടങ്ങുക",
|
||||
"timeslider.forwardRevision": "ഈ പാഡിലെ അടുത്ത മാറ്റത്തിലേക്ക് പോവുക",
|
||||
"timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}",
|
||||
|
|
62
src/locales/mnw.json
Normal file
62
src/locales/mnw.json
Normal file
|
@ -0,0 +1,62 @@
|
|||
{
|
||||
"@metadata": {
|
||||
"authors": [
|
||||
"Aue Nai"
|
||||
]
|
||||
},
|
||||
"index.newPad": "တၞးတၟိ",
|
||||
"pad.toolbar.bold.title": "လ္စံက် (Ctrl+B)",
|
||||
"pad.toolbar.italic.title": "ဒစေၚ် (Ctrl+I)",
|
||||
"pad.toolbar.underline.title": "သက်ပၞောန်သၟဝ် (Ctrl+U)",
|
||||
"pad.toolbar.strikethrough.title": "ခရက်ပၞောန်လဒေါဝ် (Ctrl+5)",
|
||||
"pad.colorpicker.save": "ဂိုင်သိပ်",
|
||||
"pad.colorpicker.cancel": "တးပဲါ",
|
||||
"pad.loading": "ပတိုန်ဒၟံၚ်",
|
||||
"pad.wrongPassword": "ကောန်ဍေၚ်မၞးဂှ် ဗၠေတ်မံၚ်",
|
||||
"pad.settings.language": "အရေဝ်ဘာသာ",
|
||||
"pad.importExport.import_export": "ပလုပ်/ပတိတ်",
|
||||
"pad.importExport.importSuccessful": "ဍိုက်ပေၚ်စိုပ်ဒတုဲ",
|
||||
"pad.importExport.exporthtml": "HTML",
|
||||
"pad.importExport.exportplain": "လိက်ပလး",
|
||||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.modals.reconnecttimer": "ဂစာန်မံၚ်သွက်ကလေၚ်ဆက်လုပ်",
|
||||
"pad.modals.cancel": "တးပဲါ",
|
||||
"pad.modals.unauth": "အခေါၚ်အဝဵုဟွံမွဲ",
|
||||
"pad.modals.deleted": "ပလီု",
|
||||
"pad.modals.deleted.explanation": "တၞးဏအ်ဒးဒုၚ်တးပဲါထောံယျ။",
|
||||
"pad.modals.disconnected": "မၞးဆက်စၠောံဟွံမွဲမံၚ်ယျ",
|
||||
"pad.share": "ပါ်ပရအ်တၞးဏအ်ညိ",
|
||||
"pad.share.readonly": "ဆ အယာံမာတ်ဗှ်ဟေၚ်",
|
||||
"pad.share.link": "လေန်",
|
||||
"pad.share.emebdcode": "Embed URL",
|
||||
"timeslider.pageTitle": "{{appTitle}} Timeslider",
|
||||
"timeslider.toolbar.returnbutton": "ကလၚ်တၞးတေံ",
|
||||
"timeslider.toolbar.authors": "ကဝိ",
|
||||
"timeslider.toolbar.authorsList": "ကဝိ ဟွံမွဲ",
|
||||
"timeslider.toolbar.exportlink.title": "ပတိတ်",
|
||||
"timeslider.version": "ဗာရှောန်{{version}}",
|
||||
"timeslider.saved": "သီဂိုၚ်လဝ် {{month}} {{day}}, {{year}}",
|
||||
"timeslider.month.january": "ဇာန်နဝါရဳ",
|
||||
"timeslider.month.february": "ဖေဖဝ်ဝါရဳ",
|
||||
"timeslider.month.march": "မာတ်",
|
||||
"timeslider.month.april": "ဨပြဳ",
|
||||
"timeslider.month.may": "မေ",
|
||||
"timeslider.month.june": "ဂျောန်",
|
||||
"timeslider.month.july": "ဂျူလာင်",
|
||||
"timeslider.month.august": "အဝ်ဂေတ်",
|
||||
"timeslider.month.september": "\nသေပ်တေမ်ပါ",
|
||||
"timeslider.month.october": "\nအံက်တဝ်ပါ",
|
||||
"timeslider.month.november": "\nနဝ်ဝေမ်ပါ",
|
||||
"timeslider.month.december": "ဒဳဇြေန်ပါ",
|
||||
"timeslider.unnamedauthors": "{{num}} ဟွံကဵုယၟု {[ဂမၠိုၚ်(num) မွဲ: ကဝိ, တၞဟ်: ကဝိဂမၠိုၚ် ]}",
|
||||
"pad.userlist.entername": "စုတ် ယၟုညးလွပ်",
|
||||
"pad.userlist.unnamed": "ဟွံကဵုလဝ်ယၟု",
|
||||
"pad.userlist.guest": "ကၟုဲ",
|
||||
"pad.userlist.deny": "တးပဲါ",
|
||||
"pad.userlist.approve": "သ္ပကဵုဒတန်",
|
||||
"pad.impexp.importbutton": " မပၠောပ်စုတ် လၟုဟ်",
|
||||
"pad.impexp.importing": "မပၠောပ်စုတ်ဒၟံၚ်...",
|
||||
"pad.impexp.importfailed": "မပၠောပ်စုတ်တအ်လီုအာ"
|
||||
}
|
|
@ -15,7 +15,7 @@
|
|||
"pad.toolbar.redo.title": "Occeppa (Ctrl+Y)",
|
||||
"pad.toolbar.settings.title": "Tlatlālīliztli",
|
||||
"pad.colorpicker.save": "Xicpiya",
|
||||
"pad.colorpicker.cancel": "Xiccāhua",
|
||||
"pad.colorpicker.cancel": "Moxitiniz",
|
||||
"pad.settings.padSettings": "Pad Ītlatlālīliz",
|
||||
"pad.settings.myView": "Notlachiyaliz",
|
||||
"pad.settings.language": "Tlahtōlli:",
|
||||
|
@ -24,6 +24,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.modals.cancel": "Moxitiniz",
|
||||
"pad.modals.deleted": "Omopohpoloh.",
|
||||
"pad.modals.deleted.explanation": "Ōmopoloh inīn Pad.",
|
||||
"timeslider.version": "Inīc {{version}} Cuepaliztli",
|
||||
|
|
|
@ -4,11 +4,14 @@
|
|||
"Siebrand",
|
||||
"Macofe",
|
||||
"Robin0van0der0vliet",
|
||||
"Robin van der Vliet"
|
||||
"Robin van der Vliet",
|
||||
"Mainframe98",
|
||||
"KlaasZ4usV",
|
||||
"Rickvl"
|
||||
]
|
||||
},
|
||||
"index.newPad": "Nieuw pad",
|
||||
"index.createOpenPad": "Pad maken op openen met de naam:",
|
||||
"index.createOpenPad": "of maak/open een pad met de naam:",
|
||||
"pad.toolbar.bold.title": "Vet (Ctrl-B)",
|
||||
"pad.toolbar.italic.title": "Cursief (Ctrl-I)",
|
||||
"pad.toolbar.underline.title": "Onderstrepen (Ctrl-U)",
|
||||
|
@ -55,7 +58,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "Pdf",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit Tekst zonder opmaak of een HTML-opmaak. <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">Installeer abiword</a> om meer geavanceerde importmogelijkheden te krijgen.",
|
||||
"pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit Tekst zonder opmaak of een HTML-opmaak. <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">Installeer AbiWord</a> om meer geavanceerde importmogelijkheden te krijgen.",
|
||||
"pad.modals.connected": "Verbonden.",
|
||||
"pad.modals.reconnecting": "Opnieuw verbinding maken met uw pad...",
|
||||
"pad.modals.forcereconnect": "Opnieuw verbinden",
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.importExport.abiword.innerHTML": "Você só pode importar de formatos de texto puro ou html. Para recursos de importação mais avançados <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instale o abiword</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "Só é possível importar texto sem formatação ou HTML. Para obter funcionalidades de importação mais avançadas, por favor <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instale o AbiWord</a>.",
|
||||
"pad.modals.connected": "Conectado.",
|
||||
"pad.modals.reconnecting": "Reconectando à sua nota...",
|
||||
"pad.modals.forcereconnect": "Forçar reconexão",
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
{
|
||||
"@metadata": {
|
||||
"authors": [
|
||||
"Mehtab ahmed"
|
||||
"Mehtab ahmed",
|
||||
"Tweety"
|
||||
]
|
||||
},
|
||||
"index.newPad": "نئين پٽي",
|
||||
|
@ -32,18 +33,19 @@
|
|||
"pad.settings.fontType": "اکرن جو قسم:",
|
||||
"pad.settings.globalView": "عالمي نظارو",
|
||||
"pad.settings.language": "ٻولي:",
|
||||
"pad.importExport.import_export": "درآمد ڪريو\\برآمد ڪريو",
|
||||
"pad.importExport.import_export": "برآمد/درآمد",
|
||||
"pad.importExport.import": "ڪو به متن وارو فائيل يا دستاويز چاڙهيو",
|
||||
"pad.importExport.importSuccessful": "ڪامياب!",
|
||||
"pad.importExport.export": "هاڻوڪي پٽي برآمد ڪريو جي طور:",
|
||||
"pad.importExport.exporthtml": "HTML",
|
||||
"pad.importExport.exportplain": "سادو متن",
|
||||
"pad.importExport.exportplain": "سدا اکر",
|
||||
"pad.importExport.exportword": "مائيڪرسافٽ ورڊ",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (کليل دستاويز فارميٽ)",
|
||||
"pad.modals.connected": "ڳنڍيل.",
|
||||
"pad.modals.reconnecting": "توهان جي پٽي سان ٻيهر ڳنڍي رهيو آهي...",
|
||||
"pad.modals.forcereconnect": "جبري طور ٻيهر ڳنڍيو",
|
||||
"pad.modals.cancel": "رد",
|
||||
"pad.modals.userdup": "هڪ ٻي دري ۾ کليل",
|
||||
"pad.modals.unauth": "اختيار نه آهي",
|
||||
"pad.modals.initsocketfail": "سَروَرَ کي پڄي نٿو سگھجي.",
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
{
|
||||
"@metadata": {
|
||||
"authors": [
|
||||
"Saosukham"
|
||||
"Saosukham",
|
||||
"Ninjastrikers",
|
||||
"Saimawnkham"
|
||||
]
|
||||
},
|
||||
"index.newPad": "ၽႅတ်ႉမႂ်ႇ",
|
||||
|
@ -50,10 +52,12 @@
|
|||
"pad.importExport.exportword": "မၢႆႇၶရူဝ်ႇသွပ်ႉဝၢတ်ႉ",
|
||||
"pad.importExport.exportpdf": "ၽီႇတီႇဢႅပ်ႉၾ်",
|
||||
"pad.importExport.exportopen": "ဢူဝ်တီႇဢႅပ်ႉၾ် (Open Document Format)",
|
||||
"pad.importExport.abiword.innerHTML": "ၸဝ်ႈၵဝ်ႇၸၢင်ႈလုၵ်ႉတီႈ လိၵ်ႈပဝ်ႇသေ သူင်ႇၶဝ်ႈၵႂႃႇ ဢမ်ႇၼၼ် ပိူင်လၢႆႈ HTML. ပုၼ်ႈတႃႇ ၸိူဝ်းပိူင်မႂ်ႇ ဢၼ်သူင်ႇၶဝ်ႈမႃးၼၼ်ႉ ၶွပ်ႈၸႂ်သေ <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">install abiword</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "ၸဝ်ႈၵဝ်ႇတေ ၸၢင်ႈလုၵ်ႉတီႈ တူဝ်လိၵ်ႈလွၼ်ႉလွၼ်ႉ ဢမ်ႇၼၼ် HTML သေ သူင်ႇၶဝ်ႈၵႂႃႇၵူၺ်း။ တွၼ်ႈတႃႇ လၢႆးၵၢၼ်သူင်ႇၶဝ်ႈၶိုၵ်ႉတွၼ်းတၢင်ႇၸိူဝ်းၼၼ်ႉ ၶႅၼ်းတေႃႈ <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">ဢူၼ်းသႂ်ႇ AbiWord</a>.",
|
||||
"pad.modals.connected": "ၵွင်ႉသၢၼ်ယဝ်ႉ",
|
||||
"pad.modals.reconnecting": "ၶိုၼ်းၵွင်ႉသၢၼ်ၸူး ၽႅတ်ႉၸဝ်ႈၵဝ်ႇယူႇ",
|
||||
"pad.modals.forcereconnect": "တဵၵ်းၸႂ်ႉ ၶိုၼ်းၵွင်ႉသၢၼ်",
|
||||
"pad.modals.reconnecttimer": "ၶတ်းၸႂ်တူၺ်း တႃႇၶိုၼ်းၵွင်ႉသိုပ်ႇၸူး",
|
||||
"pad.modals.cancel": "ဢမ်ႇႁဵတ်း",
|
||||
"pad.modals.userdup": "ပိုတ်ႇတမ်ႈတီႈ ၼႃႈတူမႂ်ႇ",
|
||||
"pad.modals.userdup.explanation": "တမ်ႈတီႈၼႂ်းၶွမ်းတၢင်ႇဢၼ်ၼၼ်ႉ ၽႅတ်ႉဢၼ်ၼႆႉ လႅပ်ႉပိုတ်ႇဝႆႉ တမ်ႈတီႈ ပရၢဝ်ႇသႃႇတၢင်ႇတီႈယူႇ",
|
||||
"pad.modals.userdup.advice": "ၶိုၼ်းၵွင်ႉသၢၼ်တၢင် တမ်ႈတီႈ ဝိၼ်းတူဝ်းၼႆႉ",
|
||||
|
@ -67,6 +71,7 @@
|
|||
"pad.modals.slowcommit.explanation": "သႃႇဝႃႇ ဢမ်ႇတွပ်ႇပၼ်",
|
||||
"pad.modals.slowcommit.cause": "ၼႆႉပူပ်ႉၺႃး ပၼ်ႁႃ ၵိုၵ်းလူၺ်ႈ သၢႆၼႅင်ႈၵွင်ႉသၢၼ်",
|
||||
"pad.modals.badChangeset.explanation": "ၶေႃႈထတ်း ဢၼ်ၸဝ်ႈၵဝ်ႇႁဵတ်းၼၼ်ႉ မၼ်းဢမ်ႇႁူမ်ႈၶဝ်ႈၶႂၢင်ႇ ၸွမ်းၼင်ႇ သႃႇဝႃႇဢၼ် ၸၼ်ထိင်းဝႆႉ",
|
||||
"pad.modals.badChangeset.cause": "ၼႆႉမၼ်းၸၢင်ႈပဵၼ်ယွၼ်ႉပိူဝ်ႈ လွင်ႈၵုမ်းၵၢၼ်သႃႇပိူဝ်ႇ ၽိတ်းပိူင်ႈဝႆႉ ဢမ်ႇၼၼ် ပဵၼ်ယွၼ်ႉလွင်ႈဢၼ်ဢမ်ႇမုင်ႈမွင်းဝႆႉ။ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇယိၼ်းဝႃႈပဵၼ်လွင်ႈၽိတ်းပိူင်ႈၼႆ ၶႅၼ်းတေႃႈၵပ်းသိုပ်ႇၸူးတင်း ၽူႈၵုမ်းၵၢၼ် ၵၢၼ်ၸွႆႈသၢင်ႈလႄႈ။ ၶိုၼ်းၶတ်းၸႂ်ၵွင်ႉသိုပ်ႇသေ တွၼ်ႈတႃႇ သိုပ်ႇႁဵတ်းလွင်ႈမႄးထတ်း။",
|
||||
"pad.modals.corruptPad.explanation": "ၽႅတ်ႉဢၼ်ၸဝ်ႈၵဝ်ႇပေႃႉၼၼ်ႉ ၶဝ်ႈၽိတ်းဝႆႉ",
|
||||
"pad.modals.corruptPad.cause": "ဢၼ်ၼႆႉ သႃႇဝႃႇဢၼ်ၸၼ်ထိင်းမၼ်း ၽိတ်းဝႆႉ ဢမ်ႇၼၼ် ဢမ်ႇမုင်ႈမွင်းသေ ၽိတ်းပိူင်ႈဝႆႉယဝ်ႉ။ ၶႅၼ်းတေႃႈ ၵပ်းသိုပ်ႇတမ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်.",
|
||||
"pad.modals.deleted": "ယႃႉ",
|
||||
|
@ -103,7 +108,7 @@
|
|||
"timeslider.month.august": "ဢေႃးၵၢတ်ႉ",
|
||||
"timeslider.month.september": "သႅပ်ႉထိမ်ႇပႃႇ",
|
||||
"timeslider.month.october": "ဢွၵ်ႇထူဝ်ႇပႃႇ",
|
||||
"timeslider.month.november": "ၼူဝ်ႇဝႅမ်ႇပႃႇ",
|
||||
"timeslider.month.november": "ၼူဝ်ႇဝႅမ်ႇပႃႇ",
|
||||
"timeslider.month.december": "တီႇသႅမ်ႇပႃႇ",
|
||||
"timeslider.unnamedauthors": "{{num}} ဢမ်ႇသႂ်ႇၸိုဝ်ႈ {[plural(num) ၼိုင်ႈ: ၽူႈတႅမ်ႈလိၵ်ႈ, တၢင်ႇၸိူဝ်း: ၽူႈတႅမ်ႈလိၵ်ႈၶဝ် ]}",
|
||||
"pad.savedrevs.marked": "ဢၼ်မႄးဝႆႉၼႆႉ ယၢမ်းလဵဝ် ၶိုၼ်းမႄး ၵဵပ်းသိမ်းဝႆႉ ၸိူင်ႉၼင်ႇဢၼ်ၼိုင်ႈ",
|
||||
|
|
|
@ -53,10 +53,12 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (Open Document Format)",
|
||||
"pad.importExport.abiword.innerHTML": "Mund të importoni vetëm prej formati tekst i thjeshtë ose html. Për veçori më të thelluara importimi, ju lutemi, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">instaloni Abiword-in</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "Mund të importoni vetëm prej formati tekst i thjeshtë ose HTML. Për veçori më të thelluara importimi, ju lutemi, <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">instaloni Abiword-in</a>.",
|
||||
"pad.modals.connected": "I lidhur.",
|
||||
"pad.modals.reconnecting": "Po rilidheni te blloku juaj…",
|
||||
"pad.modals.forcereconnect": "Rilidhje e detyruar",
|
||||
"pad.modals.reconnecttimer": "Provë për rilidhje pas",
|
||||
"pad.modals.cancel": "Anuloje",
|
||||
"pad.modals.userdup": "Hapur në një tjetër dritare",
|
||||
"pad.modals.userdup.explanation": "Ky bllok duket se gjendet i hapur në më shumë se një dritare shfletuesi në këtë kompjuter.",
|
||||
"pad.modals.userdup.advice": "Rilidhuni që të përdoret kjo dritare.",
|
||||
|
|
|
@ -9,7 +9,8 @@
|
|||
"Lxlalexlxl",
|
||||
"Григорій Пугач",
|
||||
"Bunyk",
|
||||
"Piramidion"
|
||||
"Piramidion",
|
||||
"Movses"
|
||||
]
|
||||
},
|
||||
"index.newPad": "Створити",
|
||||
|
@ -24,25 +25,25 @@
|
|||
"pad.toolbar.unindent.title": "Виступ (Shift+TAB)",
|
||||
"pad.toolbar.undo.title": "Скасувати (Ctrl-Z)",
|
||||
"pad.toolbar.redo.title": "Повторити (Ctrl-Y)",
|
||||
"pad.toolbar.clearAuthorship.title": "Очистити кольори документу (Ctrl+Shift+C)",
|
||||
"pad.toolbar.clearAuthorship.title": "Очистити кольори авторства (Ctrl+Shift+C)",
|
||||
"pad.toolbar.import_export.title": "Імпорт/Експорт з використанням різних форматів файлів",
|
||||
"pad.toolbar.timeslider.title": "Шкала часу",
|
||||
"pad.toolbar.savedRevision.title": "Зберегти версію",
|
||||
"pad.toolbar.settings.title": "Налаштування",
|
||||
"pad.toolbar.embed.title": "Поділитись та вбудувати цей документ",
|
||||
"pad.toolbar.showusers.title": "Показати користувачів цього документу",
|
||||
"pad.toolbar.showusers.title": "Показати користувачів цього документа",
|
||||
"pad.colorpicker.save": "Зберегти",
|
||||
"pad.colorpicker.cancel": "Скасувати",
|
||||
"pad.loading": "Завантаження…",
|
||||
"pad.noCookie": "Реп'яшки не знайдено. Будь-ласка, увімкніть реп'яшки у вашому браузері!",
|
||||
"pad.passwordRequired": "Вам необхідний пароль для доступу до цього документу",
|
||||
"pad.permissionDenied": "Ви не має дозволу для доступу до цього документу",
|
||||
"pad.passwordRequired": "Вам необхідний пароль для доступу до цього документа",
|
||||
"pad.permissionDenied": "У Вас немає дозволу для доступу до цього документа",
|
||||
"pad.wrongPassword": "Неправильний пароль",
|
||||
"pad.settings.padSettings": "Налаштування документу",
|
||||
"pad.settings.padSettings": "Налаштування документа",
|
||||
"pad.settings.myView": "Мій Вигляд",
|
||||
"pad.settings.stickychat": "Завжди відображувати чат",
|
||||
"pad.settings.chatandusers": "Показати чат і користувачів",
|
||||
"pad.settings.colorcheck": "Кольори документу",
|
||||
"pad.settings.colorcheck": "Кольори авторства",
|
||||
"pad.settings.linenocheck": "Номери рядків",
|
||||
"pad.settings.rtlcheck": "Читати вміст з права на ліво?",
|
||||
"pad.settings.fontType": "Тип шрифту:",
|
||||
|
@ -60,9 +61,9 @@
|
|||
"pad.importExport.exportword": "Microsoft Word",
|
||||
"pad.importExport.exportpdf": "PDF",
|
||||
"pad.importExport.exportopen": "ODF (документ OpenOffice)",
|
||||
"pad.importExport.abiword.innerHTML": "Ви можете імпортувати лище формати простого тексту або html. Для більш просунутих способів імпорту <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\">встановіть abiword</a>.",
|
||||
"pad.importExport.abiword.innerHTML": "Ви можете імпортувати лище формати простого тексту або HTML. Для більш просунутих способів імпорту <a href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-with-AbiWord\">встановіть AbiWord</a>.",
|
||||
"pad.modals.connected": "З'єднано.",
|
||||
"pad.modals.reconnecting": "Перепідлючення до Вашого документу..",
|
||||
"pad.modals.reconnecting": "Перепідлючення до Вашого документа..",
|
||||
"pad.modals.forcereconnect": "Примусове перепідключення",
|
||||
"pad.modals.reconnecttimer": "Триває спроба відновлення з'єднання",
|
||||
"pad.modals.cancel": "Скасувати",
|
||||
|
@ -92,10 +93,10 @@
|
|||
"pad.share.link": "Посилання",
|
||||
"pad.share.emebdcode": "Вставити URL",
|
||||
"pad.chat": "Чат",
|
||||
"pad.chat.title": "Відкрити чат для цього документу.",
|
||||
"pad.chat.title": "Відкрити чат для цього документа.",
|
||||
"pad.chat.loadmessages": "Завантажити більше повідомлень",
|
||||
"timeslider.pageTitle": "Часова шкала {{appTitle}}",
|
||||
"timeslider.toolbar.returnbutton": "Повернутись до документу",
|
||||
"timeslider.toolbar.returnbutton": "Повернутись до документа",
|
||||
"timeslider.toolbar.authors": "Автори:",
|
||||
"timeslider.toolbar.authorsList": "Немає авторів",
|
||||
"timeslider.toolbar.exportlink.title": "Експорт",
|
||||
|
@ -129,8 +130,8 @@
|
|||
"pad.editbar.clearcolors": "Очистити кольори у всьому документі?",
|
||||
"pad.impexp.importbutton": "Імпортувати зараз",
|
||||
"pad.impexp.importing": "Імпорт...",
|
||||
"pad.impexp.confirmimport": "Імпортування файлу перезапише поточний текст документу. Ви дійсно хочете продовжити?",
|
||||
"pad.impexp.convertFailed": "Ми не можемо імпортувати цей файл. Будь ласка, використайте інший формат документу, або прямо скопіюйте та вставте",
|
||||
"pad.impexp.confirmimport": "Імпортування файлу перезапише поточний текст документа. Ви дійсно хочете продовжити?",
|
||||
"pad.impexp.convertFailed": "Ми не можемо імпортувати цей файл. Будь ласка, використайте інший формат документа, або прямо скопіюйте та вставте",
|
||||
"pad.impexp.padHasData": "Ми були не в стані імпортувати цей файл, тому що ця панель, вже відредактована, будь ласка, імпортуйте на нову панель",
|
||||
"pad.impexp.uploadFailed": "Завантаження не вдалось, будь ласка, спробуйте знову",
|
||||
"pad.impexp.importfailed": "Помилка при імпортуванні",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# About the folder structure
|
||||
|
||||
* **db** - all modules that are accesing the data structure and are communicating directly to the database
|
||||
* **db** - all modules that are accessing the data structure and are communicating directly to the database
|
||||
* **handler** - all modules that responds directly to requests/messages of the browser
|
||||
* **utils** - helper modules
|
||||
|
||||
|
|
|
@ -137,15 +137,13 @@ exports.getRevisionChangeset = function(padID, rev, callback)
|
|||
if (rev !== undefined && typeof rev !== "number")
|
||||
{
|
||||
// try to parse the number
|
||||
if (!isNaN(parseInt(rev)))
|
||||
{
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
else
|
||||
if (isNaN(parseInt(rev)))
|
||||
{
|
||||
callback(new customError("rev is not a number", "apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
|
||||
// ensure this is not a negative number
|
||||
|
@ -184,17 +182,17 @@ exports.getRevisionChangeset = function(padID, rev, callback)
|
|||
|
||||
callback(null, changeset);
|
||||
})
|
||||
}
|
||||
//the client wants the latest changeset, lets return it to him
|
||||
else
|
||||
{
|
||||
pad.getRevisionChangeset(pad.getHeadRevisionNumber(), function(err, changeset)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
callback(null, changeset);
|
||||
})
|
||||
return;
|
||||
}
|
||||
|
||||
//the client wants the latest changeset, lets return it to him
|
||||
pad.getRevisionChangeset(pad.getHeadRevisionNumber(), function(err, changeset)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
callback(null, changeset);
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -219,15 +217,13 @@ exports.getText = function(padID, rev, callback)
|
|||
if(rev !== undefined && typeof rev != "number")
|
||||
{
|
||||
//try to parse the number
|
||||
if(!isNaN(parseInt(rev)))
|
||||
{
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
else
|
||||
if(isNaN(parseInt(rev)))
|
||||
{
|
||||
callback(new customError("rev is not a number", "apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
|
||||
//ensure this is not a negativ number
|
||||
|
@ -268,13 +264,13 @@ exports.getText = function(padID, rev, callback)
|
|||
|
||||
callback(null, data);
|
||||
})
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//the client wants the latest text, lets return it to him
|
||||
else
|
||||
{
|
||||
var padText = exportTxt.getTXTFromAtext(pad, pad.atext);
|
||||
callback(null, {"text": padText});
|
||||
}
|
||||
var padText = exportTxt.getTXTFromAtext(pad, pad.atext);
|
||||
callback(null, {"text": padText});
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -359,15 +355,13 @@ exports.getHTML = function(padID, rev, callback)
|
|||
|
||||
if (rev !== undefined && typeof rev != "number")
|
||||
{
|
||||
if (!isNaN(parseInt(rev)))
|
||||
{
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
else
|
||||
if (isNaN(parseInt(rev)))
|
||||
{
|
||||
callback(new customError("rev is not a number","apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
|
||||
if(rev !== undefined && rev < 0)
|
||||
|
@ -405,19 +399,19 @@ exports.getHTML = function(padID, rev, callback)
|
|||
var data = {html: html};
|
||||
callback(null, data);
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//the client wants the latest text, lets return it to him
|
||||
else
|
||||
exportHtml.getPadHTML(pad, undefined, function (err, html)
|
||||
{
|
||||
exportHtml.getPadHTML(pad, undefined, function (err, html)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
html = "<!DOCTYPE HTML><html><body>" +html; // adds HTML head
|
||||
html += "</body></html>";
|
||||
var data = {html: html};
|
||||
callback(null, data);
|
||||
});
|
||||
}
|
||||
if(ERR(err, callback)) return;
|
||||
html = "<!DOCTYPE HTML><html><body>" +html; // adds HTML head
|
||||
html += "</body></html>";
|
||||
var data = {html: html};
|
||||
callback(null, data);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -448,11 +442,10 @@ exports.setHTML = function(padID, html, callback)
|
|||
if(e){
|
||||
callback(new customError("HTML is malformed","apierror"));
|
||||
return;
|
||||
}else{
|
||||
//update the clients on the pad
|
||||
padMessageHandler.updatePadClients(pad, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
//update the clients on the pad
|
||||
padMessageHandler.updatePadClients(pad, callback);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -641,15 +634,13 @@ exports.saveRevision = function(padID, rev, callback)
|
|||
if(rev !== undefined && typeof rev != "number")
|
||||
{
|
||||
//try to parse the number
|
||||
if(!isNaN(parseInt(rev)))
|
||||
{
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
else
|
||||
if(isNaN(parseInt(rev)))
|
||||
{
|
||||
callback(new customError("rev is not a number", "apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
|
||||
//ensure this is not a negativ number
|
||||
|
@ -732,8 +723,9 @@ exports.createPad = function(padID, text, callback)
|
|||
callback(new customError("createPad can't create group pads","apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
//check for url special characters
|
||||
else if(padID.match(/(\/|\?|&|#)/))
|
||||
if(padID.match(/(\/|\?|&|#)/))
|
||||
{
|
||||
callback(new customError("malformed padID: Remove special characters","apierror"));
|
||||
return;
|
||||
|
@ -782,15 +774,13 @@ exports.restoreRevision = function (padID, rev, callback)
|
|||
if (rev !== undefined && typeof rev != "number")
|
||||
{
|
||||
//try to parse the number
|
||||
if (!isNaN(parseInt(rev)))
|
||||
{
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
else
|
||||
if (isNaN(parseInt(rev)))
|
||||
{
|
||||
callback(new customError("rev is not a number", "apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
rev = parseInt(rev);
|
||||
}
|
||||
|
||||
//ensure this is not a negativ number
|
||||
|
@ -959,11 +949,10 @@ exports.getPadID = function(roID, callback)
|
|||
if(retrievedPadID == null)
|
||||
{
|
||||
callback(new customError("padID does not exist","apierror"));
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
callback(null, {padID: retrievedPadID});
|
||||
}
|
||||
|
||||
callback(null, {padID: retrievedPadID});
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1127,9 +1116,9 @@ exports.sendClientsMessage = function (padID, msg, callback) {
|
|||
getPadSafe(padID, true, function (err, pad) {
|
||||
if (ERR(err, callback)) {
|
||||
return;
|
||||
} else {
|
||||
padMessageHandler.handleCustomMessage(padID, msg, callback);
|
||||
}
|
||||
|
||||
padMessageHandler.handleCustomMessage(padID, msg, callback);
|
||||
} );
|
||||
}
|
||||
|
||||
|
@ -1177,30 +1166,26 @@ exports.createDiffHTML = function(padID, startRev, endRev, callback){
|
|||
if(startRev !== undefined && typeof startRev != "number")
|
||||
{
|
||||
//try to parse the number
|
||||
if(!isNaN(parseInt(startRev)))
|
||||
{
|
||||
startRev = parseInt(startRev, 10);
|
||||
}
|
||||
else
|
||||
if(isNaN(parseInt(startRev)))
|
||||
{
|
||||
callback({stop: "startRev is not a number"});
|
||||
return;
|
||||
}
|
||||
|
||||
startRev = parseInt(startRev, 10);
|
||||
}
|
||||
|
||||
//check if rev is a number
|
||||
if(endRev !== undefined && typeof endRev != "number")
|
||||
{
|
||||
//try to parse the number
|
||||
if(!isNaN(parseInt(endRev)))
|
||||
{
|
||||
endRev = parseInt(endRev, 10);
|
||||
}
|
||||
else
|
||||
if(isNaN(parseInt(endRev)))
|
||||
{
|
||||
callback({stop: "endRev is not a number"});
|
||||
return;
|
||||
}
|
||||
|
||||
endRev = parseInt(endRev, 10);
|
||||
}
|
||||
|
||||
//get the pad
|
||||
|
|
|
@ -104,16 +104,16 @@ function mapAuthorWithDBKey (mapperkey, mapper, callback)
|
|||
//return the author
|
||||
callback(null, author);
|
||||
});
|
||||
}
|
||||
//there is a author with this mapper
|
||||
else
|
||||
{
|
||||
//update the timestamp of this author
|
||||
db.setSub("globalAuthor:" + author, ["timestamp"], new Date().getTime());
|
||||
|
||||
//return the author
|
||||
callback(null, {authorID: author});
|
||||
return;
|
||||
}
|
||||
|
||||
//there is a author with this mapper
|
||||
//update the timestamp of this author
|
||||
db.setSub("globalAuthor:" + author, ["timestamp"], new Date().getTime());
|
||||
|
||||
//return the author
|
||||
callback(null, {authorID: author});
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -209,20 +209,19 @@ exports.listPadsOfAuthor = function (authorID, callback)
|
|||
if(author == null)
|
||||
{
|
||||
callback(new customError("authorID does not exist","apierror"))
|
||||
return;
|
||||
}
|
||||
|
||||
//everything is fine, return the pad IDs
|
||||
else
|
||||
var pads = [];
|
||||
if(author.padIDs != null)
|
||||
{
|
||||
var pads = [];
|
||||
if(author.padIDs != null)
|
||||
for (var padId in author.padIDs)
|
||||
{
|
||||
for (var padId in author.padIDs)
|
||||
{
|
||||
pads.push(padId);
|
||||
}
|
||||
pads.push(padId);
|
||||
}
|
||||
callback(null, {padIDs: pads});
|
||||
}
|
||||
callback(null, {padIDs: pads});
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -62,13 +62,12 @@ exports.deleteGroup = function(groupID, callback)
|
|||
if(_group == null)
|
||||
{
|
||||
callback(new customError("groupID does not exist","apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
//group exists, everything is fine
|
||||
else
|
||||
{
|
||||
group = _group;
|
||||
callback();
|
||||
}
|
||||
group = _group;
|
||||
callback();
|
||||
});
|
||||
},
|
||||
//iterate trough all pads of this groups and delete them
|
||||
|
@ -213,34 +212,35 @@ exports.createGroupIfNotExistsFor = function(groupMapper, callback)
|
|||
//try to get a group for this mapper
|
||||
db.get("mapper2group:"+groupMapper, function(err, groupID)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
function createGroupForMapper(cb) {
|
||||
exports.createGroup(function(err, responseObj)
|
||||
{
|
||||
if(ERR(err, cb)) return;
|
||||
|
||||
//create the mapper entry for this group
|
||||
db.set("mapper2group:"+groupMapper, responseObj.groupID);
|
||||
|
||||
cb(null, responseObj);
|
||||
});
|
||||
}
|
||||
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
// there is a group for this mapper
|
||||
if(groupID) {
|
||||
exports.doesGroupExist(groupID, function(err, exists) {
|
||||
if(ERR(err, callback)) return;
|
||||
if(exists) return callback(null, {groupID: groupID});
|
||||
|
||||
// hah, the returned group doesn't exist, let's create one
|
||||
createGroupForMapper(callback)
|
||||
})
|
||||
}
|
||||
//there is no group for this mapper, let's create a group
|
||||
else {
|
||||
createGroupForMapper(callback)
|
||||
}
|
||||
|
||||
function createGroupForMapper(cb) {
|
||||
exports.createGroup(function(err, responseObj)
|
||||
{
|
||||
if(ERR(err, cb)) return;
|
||||
|
||||
//create the mapper entry for this group
|
||||
db.set("mapper2group:"+groupMapper, responseObj.groupID);
|
||||
|
||||
cb(null, responseObj);
|
||||
});
|
||||
}
|
||||
// there is a group for this mapper
|
||||
if(groupID) {
|
||||
exports.doesGroupExist(groupID, function(err, exists) {
|
||||
if(ERR(err, callback)) return;
|
||||
if(exists) return callback(null, {groupID: groupID});
|
||||
|
||||
// hah, the returned group doesn't exist, let's create one
|
||||
createGroupForMapper(callback)
|
||||
})
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//there is no group for this mapper, let's create a group
|
||||
createGroupForMapper(callback)
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -261,12 +261,11 @@ exports.createGroupPad = function(groupID, padName, text, callback)
|
|||
if(exists == false)
|
||||
{
|
||||
callback(new customError("groupID does not exist","apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
//group exists, everything is fine
|
||||
else
|
||||
{
|
||||
callback();
|
||||
}
|
||||
callback();
|
||||
});
|
||||
},
|
||||
//ensure pad does not exists
|
||||
|
@ -280,12 +279,11 @@ exports.createGroupPad = function(groupID, padName, text, callback)
|
|||
if(exists == true)
|
||||
{
|
||||
callback(new customError("padName does already exist","apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
//pad does not exist, everything is fine
|
||||
else
|
||||
{
|
||||
callback();
|
||||
}
|
||||
callback();
|
||||
});
|
||||
},
|
||||
//create the pad
|
||||
|
@ -320,19 +318,18 @@ exports.listPads = function(groupID, callback)
|
|||
if(exists == false)
|
||||
{
|
||||
callback(new customError("groupID does not exist","apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
//group exists, let's get the pads
|
||||
else
|
||||
db.getSub("group:" + groupID, ["pads"], function(err, result)
|
||||
{
|
||||
db.getSub("group:" + groupID, ["pads"], function(err, result)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
var pads = [];
|
||||
for ( var padId in result ) {
|
||||
pads.push(padId);
|
||||
}
|
||||
callback(null, {padIDs: pads});
|
||||
});
|
||||
}
|
||||
if(ERR(err, callback)) return;
|
||||
var pads = [];
|
||||
for ( var padId in result ) {
|
||||
pads.push(padId);
|
||||
}
|
||||
callback(null, {padIDs: pads});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -476,28 +476,27 @@ Pad.prototype.copy = function copy(destinationID, force, callback) {
|
|||
// if it's a group pad, let's make sure the group exists.
|
||||
function(callback)
|
||||
{
|
||||
if (destinationID.indexOf("$") != -1)
|
||||
if (destinationID.indexOf("$") === -1)
|
||||
{
|
||||
destGroupID = destinationID.split("$")[0]
|
||||
groupManager.doesGroupExist(destGroupID, function (err, exists)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
//group does not exist
|
||||
if(exists == false)
|
||||
{
|
||||
callback(new customError("groupID does not exist for destinationID","apierror"));
|
||||
return;
|
||||
}
|
||||
//everything is fine, continue
|
||||
else
|
||||
{
|
||||
callback();
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
|
||||
destGroupID = destinationID.split("$")[0]
|
||||
groupManager.doesGroupExist(destGroupID, function (err, exists)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
//group does not exist
|
||||
if(exists == false)
|
||||
{
|
||||
callback(new customError("groupID does not exist for destinationID","apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
//everything is fine, continue
|
||||
callback();
|
||||
});
|
||||
},
|
||||
// if the pad exists, we should abort, unless forced.
|
||||
function(callback)
|
||||
|
@ -506,27 +505,29 @@ Pad.prototype.copy = function copy(destinationID, force, callback) {
|
|||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
if(exists == true)
|
||||
{
|
||||
if (!force)
|
||||
{
|
||||
console.error("erroring out without force");
|
||||
callback(new customError("destinationID already exists","apierror"));
|
||||
console.error("erroring out without force - after");
|
||||
return;
|
||||
}
|
||||
else // exists and forcing
|
||||
{
|
||||
padManager.getPad(destinationID, function(err, pad) {
|
||||
if (ERR(err, callback)) return;
|
||||
pad.remove(callback);
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
/*
|
||||
* this is the negation of a truthy comparison. Has been left in this
|
||||
* wonky state to keep the old (possibly buggy) behaviour
|
||||
*/
|
||||
if (!(exists == true))
|
||||
{
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!force)
|
||||
{
|
||||
console.error("erroring out without force");
|
||||
callback(new customError("destinationID already exists","apierror"));
|
||||
console.error("erroring out without force - after");
|
||||
return;
|
||||
}
|
||||
|
||||
// exists and forcing
|
||||
padManager.getPad(destinationID, function(err, pad) {
|
||||
if (ERR(err, callback)) return;
|
||||
pad.remove(callback);
|
||||
});
|
||||
});
|
||||
},
|
||||
// copy the 'pad' entry
|
||||
|
@ -622,29 +623,28 @@ Pad.prototype.remove = function remove(callback) {
|
|||
//is it a group pad? -> delete the entry of this pad in the group
|
||||
function(callback)
|
||||
{
|
||||
//is it a group pad?
|
||||
if(padID.indexOf("$")!=-1)
|
||||
{
|
||||
var groupID = padID.substring(0,padID.indexOf("$"));
|
||||
|
||||
db.get("group:" + groupID, function (err, group)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
//remove the pad entry
|
||||
delete group.pads[padID];
|
||||
|
||||
//set the new value
|
||||
db.set("group:" + groupID, group);
|
||||
|
||||
callback();
|
||||
});
|
||||
}
|
||||
//its no group pad, nothing to do here
|
||||
else
|
||||
if(padID.indexOf("$") === -1)
|
||||
{
|
||||
// it isn't a group pad, nothing to do here
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
|
||||
// it is a group pad
|
||||
var groupID = padID.substring(0,padID.indexOf("$"));
|
||||
|
||||
db.get("group:" + groupID, function (err, group)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
//remove the pad entry
|
||||
delete group.pads[padID];
|
||||
|
||||
//set the new value
|
||||
db.set("group:" + groupID, group);
|
||||
|
||||
callback();
|
||||
});
|
||||
},
|
||||
//remove the readonly entries
|
||||
function(callback)
|
||||
|
|
|
@ -159,21 +159,20 @@ exports.getPad = function(id, text, callback)
|
|||
if(pad != null)
|
||||
{
|
||||
callback(null, pad);
|
||||
return;
|
||||
}
|
||||
//try to load pad
|
||||
else
|
||||
{
|
||||
pad = new Pad(id);
|
||||
|
||||
//initalize the pad
|
||||
pad.init(text, function(err)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
globalPads.set(id, pad);
|
||||
padList.addPad(id);
|
||||
callback(null, pad);
|
||||
});
|
||||
}
|
||||
//try to load pad
|
||||
pad = new Pad(id);
|
||||
|
||||
//initalize the pad
|
||||
pad.init(text, function(err)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
globalPads.set(id, pad);
|
||||
padList.addPad(id);
|
||||
callback(null, pad);
|
||||
});
|
||||
}
|
||||
|
||||
exports.listAllPads = function(cb)
|
||||
|
@ -206,30 +205,28 @@ exports.sanitizePadId = function(padId, callback) {
|
|||
if(transform_index >= padIdTransforms.length)
|
||||
{
|
||||
callback(padId);
|
||||
return;
|
||||
}
|
||||
|
||||
//check if padId exists
|
||||
else
|
||||
exports.doesPadExists(padId, function(junk, exists)
|
||||
{
|
||||
exports.doesPadExists(padId, function(junk, exists)
|
||||
if(exists)
|
||||
{
|
||||
if(exists)
|
||||
{
|
||||
callback(padId);
|
||||
}
|
||||
else
|
||||
{
|
||||
//get the next transformation *that's different*
|
||||
var transformedPadId = padId;
|
||||
while(transformedPadId == padId && transform_index < padIdTransforms.length)
|
||||
{
|
||||
transformedPadId = padId.replace(padIdTransforms[transform_index][0], padIdTransforms[transform_index][1]);
|
||||
transform_index += 1;
|
||||
}
|
||||
//check the next transform
|
||||
exports.sanitizePadId(transformedPadId, callback, transform_index);
|
||||
}
|
||||
});
|
||||
}
|
||||
callback(padId);
|
||||
return;
|
||||
}
|
||||
|
||||
//get the next transformation *that's different*
|
||||
var transformedPadId = padId;
|
||||
while(transformedPadId == padId && transform_index < padIdTransforms.length)
|
||||
{
|
||||
transformedPadId = padId.replace(padIdTransforms[transform_index][0], padIdTransforms[transform_index][1]);
|
||||
transform_index += 1;
|
||||
}
|
||||
//check the next transform
|
||||
exports.sanitizePadId(transformedPadId, callback, transform_index);
|
||||
});
|
||||
}
|
||||
|
||||
exports.isValidPadId = function(padId)
|
||||
|
|
|
@ -90,13 +90,13 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback)
|
|||
// grant or deny access, with author of token
|
||||
callback(null, statusObject);
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// user may create new pads - no need to check anything
|
||||
else
|
||||
{
|
||||
// grant access, with author of token
|
||||
callback(null, statusObject);
|
||||
}
|
||||
// grant access, with author of token
|
||||
callback(null, statusObject);
|
||||
});
|
||||
|
||||
//don't continue
|
||||
|
|
|
@ -90,15 +90,13 @@ exports.createSession = function(groupID, authorID, validUntil, callback)
|
|||
if(typeof validUntil != "number")
|
||||
{
|
||||
//try to parse the number
|
||||
if(!isNaN(parseInt(validUntil)))
|
||||
{
|
||||
validUntil = parseInt(validUntil);
|
||||
}
|
||||
else
|
||||
if(isNaN(parseInt(validUntil)))
|
||||
{
|
||||
callback(new customError("validUntil is not a number","apierror"));
|
||||
return;
|
||||
}
|
||||
|
||||
validUntil = parseInt(validUntil);
|
||||
}
|
||||
|
||||
//ensure this is not a negativ number
|
||||
|
@ -353,7 +351,7 @@ function listSessionsWithDBKey (dbkey, callback)
|
|||
{
|
||||
if (err == "apierror: sessionID does not exist")
|
||||
{
|
||||
console.warn("Found bad session " + sessionID + " in " + dbkey + ".");
|
||||
console.warn(`Found bad session ${sessionID} in ${dbkey}`);
|
||||
}
|
||||
else if(ERR(err, callback))
|
||||
{
|
||||
|
|
|
@ -18,30 +18,36 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
var absolutePaths = require('../utils/AbsolutePaths');
|
||||
var ERR = require("async-stacktrace");
|
||||
var fs = require("fs");
|
||||
var api = require("../db/API");
|
||||
var log4js = require('log4js');
|
||||
var padManager = require("../db/PadManager");
|
||||
var randomString = require("../utils/randomstring");
|
||||
var argv = require('../utils/Cli').argv;
|
||||
|
||||
var apiHandlerLogger = log4js.getLogger('APIHandler');
|
||||
|
||||
//ensure we have an apikey
|
||||
var apikey = null;
|
||||
var apikeyFilename = argv.apikey || "./APIKEY.txt";
|
||||
var apikeyFilename = absolutePaths.makeAbsolute(argv.apikey || "./APIKEY.txt");
|
||||
try
|
||||
{
|
||||
apikey = fs.readFileSync(apikeyFilename,"utf8");
|
||||
apiHandlerLogger.info(`Api key file read from: "${apikeyFilename}"`);
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
apiHandlerLogger.info(`Api key file "${apikeyFilename}" not found. Creating with random contents.`);
|
||||
apikey = randomString(32);
|
||||
fs.writeFileSync(apikeyFilename,apikey,"utf8");
|
||||
}
|
||||
|
||||
//a list of all functions
|
||||
var version =
|
||||
{ "1":
|
||||
var version = {};
|
||||
|
||||
version["1"] = Object.assign({},
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
|
@ -71,433 +77,67 @@ var version =
|
|||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
}
|
||||
, "1.1":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
);
|
||||
|
||||
version["1.1"] = Object.assign({}, version["1"],
|
||||
{ "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
}
|
||||
, "1.2":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
);
|
||||
|
||||
version["1.2"] = Object.assign({}, version["1.1"],
|
||||
{ "checkToken" : []
|
||||
}
|
||||
, "1.2.1":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "listAllPads" : []
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
);
|
||||
|
||||
version["1.2.1"] = Object.assign({}, version["1.2"],
|
||||
{ "listAllPads" : []
|
||||
}
|
||||
, "1.2.7":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "listAllPads" : []
|
||||
, "createDiffHTML" : ["padID", "startRev", "endRev"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
, "getChatHistory" : ["padID"]
|
||||
);
|
||||
|
||||
version["1.2.7"] = Object.assign({}, version["1.2.1"],
|
||||
{ "createDiffHTML" : ["padID", "startRev", "endRev"]
|
||||
, "getChatHistory" : ["padID", "start", "end"]
|
||||
, "getChatHead" : ["padID"]
|
||||
}
|
||||
, "1.2.8":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "listAllPads" : []
|
||||
, "createDiffHTML" : ["padID", "startRev", "endRev"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getAttributePool" : ["padID"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
);
|
||||
|
||||
version["1.2.8"] = Object.assign({}, version["1.2.7"],
|
||||
{ "getAttributePool" : ["padID"]
|
||||
, "getRevisionChangeset" : ["padID", "rev"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
, "getChatHistory" : ["padID"]
|
||||
, "getChatHistory" : ["padID", "start", "end"]
|
||||
, "getChatHead" : ["padID"]
|
||||
}
|
||||
, "1.2.9":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "listAllPads" : []
|
||||
, "createDiffHTML" : ["padID", "startRev", "endRev"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getAttributePool" : ["padID"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getRevisionChangeset" : ["padID", "rev"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "copyPad" : ["sourceID", "destinationID", "force"]
|
||||
);
|
||||
|
||||
version["1.2.9"] = Object.assign({}, version["1.2.8"],
|
||||
{ "copyPad" : ["sourceID", "destinationID", "force"]
|
||||
, "movePad" : ["sourceID", "destinationID", "force"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
, "getChatHistory" : ["padID"]
|
||||
, "getChatHistory" : ["padID", "start", "end"]
|
||||
, "getChatHead" : ["padID"]
|
||||
}
|
||||
, "1.2.10":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "listAllPads" : []
|
||||
, "createDiffHTML" : ["padID", "startRev", "endRev"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getAttributePool" : ["padID"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getRevisionChangeset" : ["padID", "rev"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "copyPad" : ["sourceID", "destinationID", "force"]
|
||||
, "movePad" : ["sourceID", "destinationID", "force"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "getPadID" : ["roID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
, "getChatHistory" : ["padID"]
|
||||
, "getChatHistory" : ["padID", "start", "end"]
|
||||
, "getChatHead" : ["padID"]
|
||||
);
|
||||
|
||||
version["1.2.10"] = Object.assign({}, version["1.2.9"],
|
||||
{ "getPadID" : ["roID"]
|
||||
}
|
||||
, "1.2.11":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "listAllPads" : []
|
||||
, "createDiffHTML" : ["padID", "startRev", "endRev"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getAttributePool" : ["padID"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getSavedRevisionsCount" : ["padID"]
|
||||
);
|
||||
|
||||
version["1.2.11"] = Object.assign({}, version["1.2.10"],
|
||||
{ "getSavedRevisionsCount" : ["padID"]
|
||||
, "listSavedRevisions" : ["padID"]
|
||||
, "saveRevision" : ["padID", "rev"]
|
||||
, "getRevisionChangeset" : ["padID", "rev"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "copyPad" : ["sourceID", "destinationID", "force"]
|
||||
, "movePad" : ["sourceID", "destinationID", "force"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "getPadID" : ["roID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
, "getChatHistory" : ["padID"]
|
||||
, "getChatHistory" : ["padID", "start", "end"]
|
||||
, "getChatHead" : ["padID"]
|
||||
, "restoreRevision" : ["padID", "rev"]
|
||||
}
|
||||
, "1.2.12":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "listAllPads" : []
|
||||
, "createDiffHTML" : ["padID", "startRev", "endRev"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getAttributePool" : ["padID"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getSavedRevisionsCount" : ["padID"]
|
||||
, "listSavedRevisions" : ["padID"]
|
||||
, "saveRevision" : ["padID", "rev"]
|
||||
, "getRevisionChangeset" : ["padID", "rev"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "copyPad" : ["sourceID", "destinationID", "force"]
|
||||
, "movePad" : ["sourceID", "destinationID", "force"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "getPadID" : ["roID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
, "appendChatMessage" : ["padID", "text", "authorID", "time"]
|
||||
, "getChatHistory" : ["padID"]
|
||||
, "getChatHistory" : ["padID", "start", "end"]
|
||||
, "getChatHead" : ["padID"]
|
||||
, "restoreRevision" : ["padID", "rev"]
|
||||
);
|
||||
|
||||
version["1.2.12"] = Object.assign({}, version["1.2.11"],
|
||||
{ "appendChatMessage" : ["padID", "text", "authorID", "time"]
|
||||
}
|
||||
, "1.2.13":
|
||||
{ "createGroup" : []
|
||||
, "createGroupIfNotExistsFor" : ["groupMapper"]
|
||||
, "deleteGroup" : ["groupID"]
|
||||
, "listPads" : ["groupID"]
|
||||
, "listAllPads" : []
|
||||
, "createDiffHTML" : ["padID", "startRev", "endRev"]
|
||||
, "createPad" : ["padID", "text"]
|
||||
, "createGroupPad" : ["groupID", "padName", "text"]
|
||||
, "createAuthor" : ["name"]
|
||||
, "createAuthorIfNotExistsFor": ["authorMapper" , "name"]
|
||||
, "listPadsOfAuthor" : ["authorID"]
|
||||
, "createSession" : ["groupID", "authorID", "validUntil"]
|
||||
, "deleteSession" : ["sessionID"]
|
||||
, "getSessionInfo" : ["sessionID"]
|
||||
, "listSessionsOfGroup" : ["groupID"]
|
||||
, "listSessionsOfAuthor" : ["authorID"]
|
||||
, "getText" : ["padID", "rev"]
|
||||
, "setText" : ["padID", "text"]
|
||||
, "getHTML" : ["padID", "rev"]
|
||||
, "setHTML" : ["padID", "html"]
|
||||
, "getAttributePool" : ["padID"]
|
||||
, "getRevisionsCount" : ["padID"]
|
||||
, "getSavedRevisionsCount" : ["padID"]
|
||||
, "listSavedRevisions" : ["padID"]
|
||||
, "saveRevision" : ["padID", "rev"]
|
||||
, "getRevisionChangeset" : ["padID", "rev"]
|
||||
, "getLastEdited" : ["padID"]
|
||||
, "deletePad" : ["padID"]
|
||||
, "copyPad" : ["sourceID", "destinationID", "force"]
|
||||
, "movePad" : ["sourceID", "destinationID", "force"]
|
||||
, "getReadOnlyID" : ["padID"]
|
||||
, "getPadID" : ["roID"]
|
||||
, "setPublicStatus" : ["padID", "publicStatus"]
|
||||
, "getPublicStatus" : ["padID"]
|
||||
, "setPassword" : ["padID", "password"]
|
||||
, "isPasswordProtected" : ["padID"]
|
||||
, "listAuthorsOfPad" : ["padID"]
|
||||
, "padUsersCount" : ["padID"]
|
||||
, "getAuthorName" : ["authorID"]
|
||||
, "padUsers" : ["padID"]
|
||||
, "sendClientsMessage" : ["padID", "msg"]
|
||||
, "listAllGroups" : []
|
||||
, "checkToken" : []
|
||||
, "appendChatMessage" : ["padID", "text", "authorID", "time"]
|
||||
, "getChatHistory" : ["padID"]
|
||||
, "getChatHistory" : ["padID", "start", "end"]
|
||||
, "getChatHead" : ["padID"]
|
||||
, "restoreRevision" : ["padID", "rev"]
|
||||
, "appendText" : ["padID", "text"]
|
||||
);
|
||||
|
||||
version["1.2.13"] = Object.assign({}, version["1.2.12"],
|
||||
{ "appendText" : ["padID", "text"]
|
||||
}
|
||||
};
|
||||
);
|
||||
|
||||
// set the latest available API version here
|
||||
exports.latestApiVersion = '1.2.13';
|
||||
|
@ -525,7 +165,7 @@ exports.handle = function(apiVersion, functionName, fields, req, res)
|
|||
}
|
||||
}
|
||||
|
||||
//say goodbye if this is an unkown API version
|
||||
//say goodbye if this is an unknown API version
|
||||
if(!isKnownApiVersion)
|
||||
{
|
||||
res.statusCode = 404;
|
||||
|
@ -544,7 +184,7 @@ exports.handle = function(apiVersion, functionName, fields, req, res)
|
|||
}
|
||||
}
|
||||
|
||||
//say goodbye if this is a unkown function
|
||||
//say goodbye if this is a unknown function
|
||||
if(!isKnownFunctionname)
|
||||
{
|
||||
res.send({code: 3, message: "no such function", data: null});
|
||||
|
@ -608,7 +248,7 @@ function callAPI(apiVersion, functionName, fields, req, res)
|
|||
{
|
||||
res.send({code: 1, message: err.message, data: null});
|
||||
}
|
||||
//an unkown error happend
|
||||
//an unknown error happend
|
||||
else
|
||||
{
|
||||
res.send({code: 2, message: "internal error", data: null});
|
||||
|
|
|
@ -34,9 +34,18 @@ var ERR = require("async-stacktrace")
|
|||
, log4js = require("log4js")
|
||||
, hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js");
|
||||
|
||||
//load abiword only if its enabled
|
||||
if(settings.abiword != null)
|
||||
var abiword = require("../utils/Abiword");
|
||||
var convertor = null;
|
||||
var exportExtension = "htm";
|
||||
|
||||
//load abiword only if its enabled and if soffice is disabled
|
||||
if(settings.abiword != null && settings.soffice === null)
|
||||
convertor = require("../utils/Abiword");
|
||||
|
||||
//load soffice only if its enabled
|
||||
if(settings.soffice != null) {
|
||||
convertor = require("../utils/LibreOffice");
|
||||
exportExtension = "html";
|
||||
}
|
||||
|
||||
//for node 0.6 compatibily, os.tmpDir() only works from 0.8
|
||||
var tmpDirectory = process.env.TEMP || process.env.TMPDIR || process.env.TMP || '/tmp';
|
||||
|
@ -49,7 +58,7 @@ exports.doImport = function(req, res, padId)
|
|||
var apiLogger = log4js.getLogger("ImportHandler");
|
||||
|
||||
//pipe to a file
|
||||
//convert file to html via abiword
|
||||
//convert file to html via abiword or soffice
|
||||
//set html in the pad
|
||||
|
||||
var srcFile, destFile
|
||||
|
@ -57,12 +66,12 @@ exports.doImport = function(req, res, padId)
|
|||
, text
|
||||
, importHandledByPlugin
|
||||
, directDatabaseAccess
|
||||
, useAbiword;
|
||||
, useConvertor;
|
||||
|
||||
var randNum = Math.floor(Math.random()*0xFFFFFFFF);
|
||||
|
||||
// setting flag for whether to use abiword or not
|
||||
useAbiword = (abiword != null);
|
||||
// setting flag for whether to use convertor or not
|
||||
useConvertor = (convertor != null);
|
||||
|
||||
async.series([
|
||||
//save the uploaded file to /tmp
|
||||
|
@ -76,13 +85,14 @@ exports.doImport = function(req, res, padId)
|
|||
if(err || files.file === undefined) {
|
||||
if(err) console.warn("Uploading Error: " + err.stack);
|
||||
callback("uploadFailed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//everything ok, continue
|
||||
else {
|
||||
//save the path of the uploaded file
|
||||
srcFile = files.file.path;
|
||||
callback();
|
||||
}
|
||||
//save the path of the uploaded file
|
||||
srcFile = files.file.path;
|
||||
callback();
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -96,21 +106,22 @@ exports.doImport = function(req, res, padId)
|
|||
//if the file ending is known, continue as normal
|
||||
if(fileEndingKnown) {
|
||||
callback();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//we need to rename this file with a .txt ending
|
||||
else {
|
||||
if(settings.allowUnknownFileEnds === true){
|
||||
var oldSrcFile = srcFile;
|
||||
srcFile = path.join(path.dirname(srcFile),path.basename(srcFile, fileEnding)+".txt");
|
||||
fs.rename(oldSrcFile, srcFile, callback);
|
||||
}else{
|
||||
console.warn("Not allowing unknown file type to be imported", fileEnding);
|
||||
callback("uploadFailed");
|
||||
}
|
||||
if(settings.allowUnknownFileEnds === true){
|
||||
var oldSrcFile = srcFile;
|
||||
srcFile = path.join(path.dirname(srcFile),path.basename(srcFile, fileEnding)+".txt");
|
||||
fs.rename(oldSrcFile, srcFile, callback);
|
||||
}else{
|
||||
console.warn("Not allowing unknown file type to be imported", fileEnding);
|
||||
callback("uploadFailed");
|
||||
}
|
||||
},
|
||||
function(callback){
|
||||
destFile = path.join(tmpDirectory, "etherpad_import_" + randNum + ".htm");
|
||||
destFile = path.join(tmpDirectory, "etherpad_import_" + randNum + "." + exportExtension);
|
||||
|
||||
// Logic for allowing external Import Plugins
|
||||
hooks.aCallAll("import", {srcFile: srcFile, destFile: destFile}, function(err, result){
|
||||
|
@ -123,77 +134,88 @@ exports.doImport = function(req, res, padId)
|
|||
},
|
||||
function(callback) {
|
||||
var fileEnding = path.extname(srcFile).toLowerCase()
|
||||
var fileIsEtherpad = (fileEnding === ".etherpad");
|
||||
var fileIsNotEtherpad = (fileEnding !== ".etherpad");
|
||||
|
||||
if(fileIsEtherpad){
|
||||
// we do this here so we can see if the pad has quit ea few edits
|
||||
padManager.getPad(padId, function(err, _pad){
|
||||
var headCount = _pad.head;
|
||||
if(headCount >= 10){
|
||||
apiLogger.warn("Direct database Import attempt of a pad that already has content, we wont be doing this")
|
||||
return callback("padHasData");
|
||||
}else{
|
||||
fs.readFile(srcFile, "utf8", function(err, _text){
|
||||
directDatabaseAccess = true;
|
||||
importEtherpad.setPadRaw(padId, _text, function(err){
|
||||
callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}else{
|
||||
if (fileIsNotEtherpad) {
|
||||
callback();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// we do this here so we can see if the pad has quit ea few edits
|
||||
padManager.getPad(padId, function(err, _pad){
|
||||
var headCount = _pad.head;
|
||||
if(headCount >= 10){
|
||||
apiLogger.warn("Direct database Import attempt of a pad that already has content, we wont be doing this")
|
||||
return callback("padHasData");
|
||||
}
|
||||
|
||||
fs.readFile(srcFile, "utf8", function(err, _text){
|
||||
directDatabaseAccess = true;
|
||||
importEtherpad.setPadRaw(padId, _text, function(err){
|
||||
callback();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
//convert file to html
|
||||
function(callback) {
|
||||
if(!importHandledByPlugin && !directDatabaseAccess){
|
||||
var fileEnding = path.extname(srcFile).toLowerCase();
|
||||
var fileIsHTML = (fileEnding === ".html" || fileEnding === ".htm");
|
||||
var fileIsTXT = (fileEnding === ".txt");
|
||||
if (fileIsTXT) useAbiword = false; // Don't use abiword for text files
|
||||
// See https://github.com/ether/etherpad-lite/issues/2572
|
||||
if (useAbiword && !fileIsHTML) {
|
||||
abiword.convertFile(srcFile, destFile, "htm", function(err) {
|
||||
//catch convert errors
|
||||
if(err) {
|
||||
console.warn("Converting Error:", err);
|
||||
return callback("convertFailed");
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// if no abiword only rename
|
||||
fs.rename(srcFile, destFile, callback);
|
||||
}
|
||||
}else{
|
||||
if (importHandledByPlugin || directDatabaseAccess) {
|
||||
callback();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var fileEnding = path.extname(srcFile).toLowerCase();
|
||||
var fileIsHTML = (fileEnding === ".html" || fileEnding === ".htm");
|
||||
var fileIsTXT = (fileEnding === ".txt");
|
||||
if (fileIsTXT) useConvertor = false; // Don't use convertor for text files
|
||||
// See https://github.com/ether/etherpad-lite/issues/2572
|
||||
if (fileIsHTML || (useConvertor === false)) {
|
||||
// if no convertor only rename
|
||||
fs.rename(srcFile, destFile, callback);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
convertor.convertFile(srcFile, destFile, exportExtension, function(err) {
|
||||
//catch convert errors
|
||||
if(err) {
|
||||
console.warn("Converting Error:", err);
|
||||
return callback("convertFailed");
|
||||
}
|
||||
|
||||
callback();
|
||||
});
|
||||
},
|
||||
|
||||
function(callback) {
|
||||
if (!useAbiword && !directDatabaseAccess){
|
||||
// Read the file with no encoding for raw buffer access.
|
||||
fs.readFile(destFile, function(err, buf) {
|
||||
if (err) throw err;
|
||||
var isAscii = true;
|
||||
// Check if there are only ascii chars in the uploaded file
|
||||
for (var i=0, len=buf.length; i<len; i++) {
|
||||
if (buf[i] > 240) {
|
||||
isAscii=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isAscii) {
|
||||
callback();
|
||||
} else {
|
||||
callback("uploadFailed");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (useConvertor || directDatabaseAccess) {
|
||||
callback();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Read the file with no encoding for raw buffer access.
|
||||
fs.readFile(destFile, function(err, buf) {
|
||||
if (err) throw err;
|
||||
var isAscii = true;
|
||||
// Check if there are only ascii chars in the uploaded file
|
||||
for (var i=0, len=buf.length; i<len; i++) {
|
||||
if (buf[i] > 240) {
|
||||
isAscii=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isAscii) {
|
||||
callback("uploadFailed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
callback();
|
||||
});
|
||||
},
|
||||
|
||||
//get the pad object
|
||||
|
@ -207,32 +229,34 @@ exports.doImport = function(req, res, padId)
|
|||
|
||||
//read the text
|
||||
function(callback) {
|
||||
if(!directDatabaseAccess){
|
||||
fs.readFile(destFile, "utf8", function(err, _text){
|
||||
if(ERR(err, callback)) return;
|
||||
text = _text;
|
||||
// Title needs to be stripped out else it appends it to the pad..
|
||||
text = text.replace("<title>", "<!-- <title>");
|
||||
text = text.replace("</title>","</title>-->");
|
||||
|
||||
//node on windows has a delay on releasing of the file lock.
|
||||
//We add a 100ms delay to work around this
|
||||
if(os.type().indexOf("Windows") > -1){
|
||||
setTimeout(function() {callback();}, 100);
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
}else{
|
||||
if (directDatabaseAccess) {
|
||||
callback();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
fs.readFile(destFile, "utf8", function(err, _text){
|
||||
if(ERR(err, callback)) return;
|
||||
text = _text;
|
||||
// Title needs to be stripped out else it appends it to the pad..
|
||||
text = text.replace("<title>", "<!-- <title>");
|
||||
text = text.replace("</title>","</title>-->");
|
||||
|
||||
//node on windows has a delay on releasing of the file lock.
|
||||
//We add a 100ms delay to work around this
|
||||
if(os.type().indexOf("Windows") > -1){
|
||||
setTimeout(function() {callback();}, 100);
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//change text of the pad and broadcast the changeset
|
||||
function(callback) {
|
||||
if(!directDatabaseAccess){
|
||||
var fileEnding = path.extname(srcFile).toLowerCase();
|
||||
if (importHandledByPlugin || useAbiword || fileEnding == ".htm" || fileEnding == ".html") {
|
||||
if (importHandledByPlugin || useConvertor || fileEnding == ".htm" || fileEnding == ".html") {
|
||||
importHtml.setPadHTML(pad, text, function(e){
|
||||
if(e) apiLogger.warn("Error importing, possibly caused by malformed HTML");
|
||||
});
|
||||
|
@ -248,33 +272,37 @@ exports.doImport = function(req, res, padId)
|
|||
padManager.unloadPad(padId);
|
||||
// direct Database Access means a pad user should perform a switchToPad
|
||||
// and not attempt to recieve updated pad data..
|
||||
if(!directDatabaseAccess){
|
||||
padMessageHandler.updatePadClients(pad, function(){
|
||||
callback();
|
||||
});
|
||||
}else{
|
||||
if (directDatabaseAccess) {
|
||||
callback();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
padMessageHandler.updatePadClients(pad, function(){
|
||||
callback();
|
||||
});
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
//clean up temporary files
|
||||
function(callback) {
|
||||
if(!directDatabaseAccess){
|
||||
//for node < 0.7 compatible
|
||||
var fileExists = fs.exists || path.exists;
|
||||
async.parallel([
|
||||
function(callback){
|
||||
fileExists (srcFile, function(exist) { (exist)? fs.unlink(srcFile, callback): callback(); });
|
||||
},
|
||||
function(callback){
|
||||
fileExists (destFile, function(exist) { (exist)? fs.unlink(destFile, callback): callback(); });
|
||||
}
|
||||
], callback);
|
||||
}else{
|
||||
if (directDatabaseAccess) {
|
||||
callback();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//for node < 0.7 compatible
|
||||
var fileExists = fs.exists || path.exists;
|
||||
async.parallel([
|
||||
function(callback){
|
||||
fileExists (srcFile, function(exist) { (exist)? fs.unlink(srcFile, callback): callback(); });
|
||||
},
|
||||
function(callback){
|
||||
fileExists (destFile, function(exist) { (exist)? fs.unlink(destFile, callback): callback(); });
|
||||
}
|
||||
], callback);
|
||||
}
|
||||
], function(err) {
|
||||
var status = "ok";
|
||||
|
|
|
@ -244,59 +244,71 @@ exports.handleMessage = function(client, message)
|
|||
}
|
||||
};
|
||||
|
||||
if (message) {
|
||||
async.series([
|
||||
handleMessageHook,
|
||||
//check permissions
|
||||
function(callback)
|
||||
{
|
||||
// client tried to auth for the first time (first msg from the client)
|
||||
if(message.type == "CLIENT_READY") {
|
||||
createSessionInfo(client, message);
|
||||
}
|
||||
|
||||
// Note: message.sessionID is an entirely different kind of
|
||||
// session from the sessions we use here! Beware!
|
||||
// FIXME: Call our "sessions" "connections".
|
||||
// FIXME: Use a hook instead
|
||||
// FIXME: Allow to override readwrite access with readonly
|
||||
|
||||
// Simulate using the load testing tool
|
||||
if(!sessioninfos[client.id].auth){
|
||||
console.error("Auth was never applied to a session. If you are using the stress-test tool then restart Etherpad and the Stress test tool.")
|
||||
return;
|
||||
}else{
|
||||
var auth = sessioninfos[client.id].auth;
|
||||
var checkAccessCallback = function(err, statusObject)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
//access was granted
|
||||
if(statusObject.accessStatus == "grant")
|
||||
{
|
||||
callback();
|
||||
}
|
||||
//no access, send the client a message that tell him why
|
||||
else
|
||||
{
|
||||
client.json.send({accessStatus: statusObject.accessStatus})
|
||||
}
|
||||
};
|
||||
//check if pad is requested via readOnly
|
||||
if (auth.padID.indexOf("r.") === 0) {
|
||||
//Pad is readOnly, first get the real Pad ID
|
||||
readOnlyManager.getPadId(auth.padID, function(err, value) {
|
||||
ERR(err);
|
||||
securityManager.checkAccess(value, auth.sessionID, auth.token, auth.password, checkAccessCallback);
|
||||
});
|
||||
} else {
|
||||
securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, auth.password, checkAccessCallback);
|
||||
}
|
||||
}
|
||||
},
|
||||
finalHandler
|
||||
]);
|
||||
/*
|
||||
* In a previous version of this code, an "if (message)" wrapped the
|
||||
* following async.series().
|
||||
* This ugly "!Boolean(message)" is a lame way to exactly negate the truthy
|
||||
* condition and replace it with an early return, while being sure to leave
|
||||
* the original behaviour unchanged.
|
||||
*
|
||||
* A shallower code could maybe make more evident latent logic errors.
|
||||
*/
|
||||
if (!Boolean(message)) {
|
||||
return;
|
||||
}
|
||||
|
||||
async.series([
|
||||
handleMessageHook,
|
||||
//check permissions
|
||||
function(callback)
|
||||
{
|
||||
// client tried to auth for the first time (first msg from the client)
|
||||
if(message.type == "CLIENT_READY") {
|
||||
createSessionInfo(client, message);
|
||||
}
|
||||
|
||||
// Note: message.sessionID is an entirely different kind of
|
||||
// session from the sessions we use here! Beware!
|
||||
// FIXME: Call our "sessions" "connections".
|
||||
// FIXME: Use a hook instead
|
||||
// FIXME: Allow to override readwrite access with readonly
|
||||
|
||||
// Simulate using the load testing tool
|
||||
if(!sessioninfos[client.id].auth){
|
||||
console.error("Auth was never applied to a session. If you are using the stress-test tool then restart Etherpad and the Stress test tool.")
|
||||
return;
|
||||
}
|
||||
|
||||
var auth = sessioninfos[client.id].auth;
|
||||
var checkAccessCallback = function(err, statusObject)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
//access was granted
|
||||
if(statusObject.accessStatus == "grant")
|
||||
{
|
||||
callback();
|
||||
}
|
||||
//no access, send the client a message that tell him why
|
||||
else
|
||||
{
|
||||
client.json.send({accessStatus: statusObject.accessStatus})
|
||||
}
|
||||
};
|
||||
|
||||
//check if pad is requested via readOnly
|
||||
if (auth.padID.indexOf("r.") === 0) {
|
||||
//Pad is readOnly, first get the real Pad ID
|
||||
readOnlyManager.getPadId(auth.padID, function(err, value) {
|
||||
ERR(err);
|
||||
securityManager.checkAccess(value, auth.sessionID, auth.token, auth.password, checkAccessCallback);
|
||||
});
|
||||
} else {
|
||||
securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, auth.password, checkAccessCallback);
|
||||
}
|
||||
},
|
||||
finalHandler
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1268,6 +1280,7 @@ function handleClientReady(client, message)
|
|||
// client is read only you would open a security hole 1 swedish
|
||||
// mile wide...
|
||||
var clientVars = {
|
||||
"skinName": settings.skinName,
|
||||
"accountPrivs": {
|
||||
"maxRevisions": 100
|
||||
},
|
||||
|
|
|
@ -12,15 +12,15 @@ var serverName;
|
|||
exports.createServer = function () {
|
||||
console.log("Report bugs at https://github.com/ether/etherpad-lite/issues")
|
||||
|
||||
serverName = "Etherpad " + settings.getGitCommit() + " (http://etherpad.org)";
|
||||
serverName = `Etherpad ${settings.getGitCommit()} (http://etherpad.org)`;
|
||||
|
||||
console.log("Your Etherpad version is " + settings.getEpVersion() + " (" + settings.getGitCommit() + ")");
|
||||
console.log(`Your Etherpad version is ${settings.getEpVersion()} (${settings.getGitCommit()})`);
|
||||
|
||||
exports.restartServer();
|
||||
|
||||
console.log("You can access your Etherpad instance at http://" + settings.ip + ":" + settings.port + "/");
|
||||
console.log(`You can access your Etherpad instance at http://${settings.ip}:${settings.port}/`);
|
||||
if(!_.isEmpty(settings.users)){
|
||||
console.log("The plugin admin page is at http://" + settings.ip + ":" + settings.port + "/admin/plugins");
|
||||
console.log(`The plugin admin page is at http://${settings.ip}:${settings.port}/admin/plugins`);
|
||||
}
|
||||
else{
|
||||
console.warn("Admin username and password not set in settings.json. To access admin please uncomment and edit 'users' in settings.json");
|
||||
|
@ -42,9 +42,9 @@ exports.restartServer = function () {
|
|||
|
||||
if (settings.ssl) {
|
||||
|
||||
console.log( "SSL -- enabled");
|
||||
console.log( "SSL -- server key file: " + settings.ssl.key );
|
||||
console.log( "SSL -- Certificate Authority's certificate file: " + settings.ssl.cert );
|
||||
console.log("SSL -- enabled");
|
||||
console.log(`SSL -- server key file: ${settings.ssl.key}`);
|
||||
console.log(`SSL -- Certificate Authority's certificate file: ${settings.ssl.cert}`);
|
||||
|
||||
var options = {
|
||||
key: fs.readFileSync( settings.ssl.key ),
|
||||
|
|
|
@ -28,15 +28,13 @@ exports.socketio = function (hook_name, args, cb) {
|
|||
if (err) {
|
||||
return console.log(err);
|
||||
}
|
||||
else
|
||||
{
|
||||
//if showSettingsInAdminPage is set to false, then return NOT_ALLOWED in the result
|
||||
if(settings.showSettingsInAdminPage === false) {
|
||||
socket.emit("settings", {results:'NOT_ALLOWED'});
|
||||
}
|
||||
else {
|
||||
socket.emit("settings", {results: data});
|
||||
}
|
||||
|
||||
//if showSettingsInAdminPage is set to false, then return NOT_ALLOWED in the result
|
||||
if(settings.showSettingsInAdminPage === false) {
|
||||
socket.emit("settings", {results:'NOT_ALLOWED'});
|
||||
}
|
||||
else {
|
||||
socket.emit("settings", {results: data});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -8,26 +8,25 @@ exports.expressCreateServer = function (hook_name, args, cb) {
|
|||
if(!padManager.isValidPadId(padId) || /\/$/.test(req.url))
|
||||
{
|
||||
res.status(404).send('Such a padname is forbidden');
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
padManager.sanitizePadId(padId, function(sanitizedPadId) {
|
||||
//the pad id was sanitized, so we redirect to the sanitized version
|
||||
if(sanitizedPadId != padId)
|
||||
{
|
||||
var real_url = sanitizedPadId;
|
||||
real_url = encodeURIComponent(real_url);
|
||||
var query = url.parse(req.url).query;
|
||||
if ( query ) real_url += '?' + query;
|
||||
res.header('Location', real_url);
|
||||
res.status(302).send('You should be redirected to <a href="' + real_url + '">' + real_url + '</a>');
|
||||
}
|
||||
//the pad id was fine, so just render it
|
||||
else
|
||||
{
|
||||
next();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
padManager.sanitizePadId(padId, function(sanitizedPadId) {
|
||||
//the pad id was sanitized, so we redirect to the sanitized version
|
||||
if(sanitizedPadId != padId)
|
||||
{
|
||||
var real_url = sanitizedPadId;
|
||||
real_url = encodeURIComponent(real_url);
|
||||
var query = url.parse(req.url).query;
|
||||
if ( query ) real_url += '?' + query;
|
||||
res.header('Location', real_url);
|
||||
res.status(302).send('You should be redirected to <a href="' + real_url + '">' + real_url + '</a>');
|
||||
}
|
||||
//the pad id was fine, so just render it
|
||||
else
|
||||
{
|
||||
next();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -26,13 +26,13 @@ exports.expressCreateServer = function (hook_name, args, cb) {
|
|||
//serve robots.txt
|
||||
args.app.get('/robots.txt', function(req, res)
|
||||
{
|
||||
var filePath = path.normalize(__dirname + "/../../../static/custom/robots.txt");
|
||||
var filePath = path.join(settings.root, "src", "static", "skins", settings.skinName, "robots.txt");
|
||||
res.sendFile(filePath, function(err)
|
||||
{
|
||||
//there is no custom favicon, send the default robots.txt which dissallows all
|
||||
if(err)
|
||||
{
|
||||
filePath = path.normalize(__dirname + "/../../../static/robots.txt");
|
||||
filePath = path.join(settings.root, "src", "static", "robots.txt");
|
||||
res.sendFile(filePath);
|
||||
}
|
||||
});
|
||||
|
@ -79,13 +79,14 @@ exports.expressCreateServer = function (hook_name, args, cb) {
|
|||
//serve favicon.ico from all path levels except as a pad name
|
||||
args.app.get( /\/favicon.ico$/, function(req, res)
|
||||
{
|
||||
var filePath = path.normalize(__dirname + "/../../../static/custom/favicon.ico");
|
||||
var filePath = path.join(settings.root, "src", "static", "skins", settings.skinName, "favicon.ico");
|
||||
|
||||
res.sendFile(filePath, function(err)
|
||||
{
|
||||
//there is no custom favicon, send the default favicon
|
||||
if(err)
|
||||
{
|
||||
filePath = path.normalize(__dirname + "/../../../static/favicon.ico");
|
||||
filePath = path.join(settings.root, "src", "static", "favicon.ico");
|
||||
res.sendFile(filePath);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -52,7 +52,7 @@ if(os.type().indexOf("Windows") > -1)
|
|||
abiword.on('exit', function (code)
|
||||
{
|
||||
if(code != 0) {
|
||||
return callback("Abiword died with exit code " + code);
|
||||
return callback(`Abiword died with exit code ${code}`);
|
||||
}
|
||||
|
||||
if(stdoutBuffer != "")
|
||||
|
@ -91,7 +91,7 @@ else
|
|||
abiword.on('exit', function (code)
|
||||
{
|
||||
spawnAbiword();
|
||||
stdoutCallback("Abiword died with exit code " + code);
|
||||
stdoutCallback(`Abiword died with exit code ${code}`);
|
||||
});
|
||||
|
||||
//delegate the processing of stdout to a other function
|
||||
|
|
153
src/node/utils/AbsolutePaths.js
Normal file
153
src/node/utils/AbsolutePaths.js
Normal file
|
@ -0,0 +1,153 @@
|
|||
/**
|
||||
* Library for deterministic relative filename expansion for Etherpad.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 2018 - muxator
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS-IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var log4js = require('log4js');
|
||||
var path = require('path');
|
||||
var _ = require('underscore');
|
||||
|
||||
var absPathLogger = log4js.getLogger('AbsolutePaths');
|
||||
|
||||
/*
|
||||
* findEtherpadRoot() computes its value only on first invocation.
|
||||
* Subsequent invocations are served from this variable.
|
||||
*/
|
||||
var etherpadRoot = null;
|
||||
|
||||
/**
|
||||
* If stringArray's last elements are exactly equal to lastDesiredElements,
|
||||
* returns a copy in which those last elements are popped, or false otherwise.
|
||||
*
|
||||
* @param {string[]} stringArray - The input array.
|
||||
* @param {string[]} lastDesiredElements - The elements to remove from the end
|
||||
* of the input array.
|
||||
* @return {string[]|boolean} The shortened array, or false if there was no
|
||||
* overlap.
|
||||
*/
|
||||
var popIfEndsWith = function(stringArray, lastDesiredElements) {
|
||||
if (stringArray.length <= lastDesiredElements.length) {
|
||||
absPathLogger.debug(`In order to pop "${lastDesiredElements.join(path.sep)}" from "${stringArray.join(path.sep)}", it should contain at least ${lastDesiredElements.length + 1 } elements`);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const lastElementsFound = _.last(stringArray, lastDesiredElements.length);
|
||||
|
||||
if (_.isEqual(lastElementsFound, lastDesiredElements)) {
|
||||
return _.initial(stringArray, lastDesiredElements.length);
|
||||
}
|
||||
|
||||
absPathLogger.debug(`${stringArray.join(path.sep)} does not end with "${lastDesiredElements.join(path.sep)}"`);
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* Heuristically computes the directory in which Etherpad is installed.
|
||||
*
|
||||
* All the relative paths have to be interpreted against this absolute base
|
||||
* path. Since the Unix and Windows install have a different layout on disk,
|
||||
* they are treated as two special cases.
|
||||
*
|
||||
* The path is computed only on first invocation. Subsequent invocations return
|
||||
* a cached value.
|
||||
*
|
||||
* The cached value is stored in AbsolutePaths.etherpadRoot via a side effect.
|
||||
*
|
||||
* @return {string} The identified absolute base path. If such path cannot be
|
||||
* identified, prints a log and exits the application.
|
||||
*/
|
||||
exports.findEtherpadRoot = function() {
|
||||
if (etherpadRoot !== null) {
|
||||
return etherpadRoot;
|
||||
}
|
||||
|
||||
const findRoot = require('find-root');
|
||||
const foundRoot = findRoot(__dirname);
|
||||
|
||||
var directoriesToStrip;
|
||||
if (process.platform === 'win32') {
|
||||
/*
|
||||
* Given the structure of our Windows package, foundRoot's value
|
||||
* will be the following on win32:
|
||||
*
|
||||
* <BASE_DIR>\node_modules\ep_etherpad-lite
|
||||
*/
|
||||
directoriesToStrip = ['node_modules', 'ep_etherpad-lite'];
|
||||
} else {
|
||||
/*
|
||||
* On Unix platforms, foundRoot's value will be:
|
||||
*
|
||||
* <BASE_DIR>\src
|
||||
*/
|
||||
directoriesToStrip = ['src'];
|
||||
}
|
||||
|
||||
const maybeEtherpadRoot = popIfEndsWith(foundRoot.split(path.sep), directoriesToStrip);
|
||||
if (maybeEtherpadRoot === false) {
|
||||
absPathLogger.error(`Could not identity Etherpad base path in this ${process.platform} installation in "${foundRoot}"`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// SIDE EFFECT on this module-level variable
|
||||
etherpadRoot = maybeEtherpadRoot.join(path.sep);
|
||||
|
||||
if (path.isAbsolute(etherpadRoot)) {
|
||||
return etherpadRoot;
|
||||
}
|
||||
|
||||
absPathLogger.error(`To run, Etherpad has to identify an absolute base path. This is not: "${etherpadRoot}"`);
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
/**
|
||||
* Receives a filesystem path in input. If the path is absolute, returns it
|
||||
* unchanged. If the path is relative, an absolute version of it is returned,
|
||||
* built prepending exports.findEtherpadRoot() to it.
|
||||
*
|
||||
* @param {string} somePath - an absolute or relative path
|
||||
* @return {string} An absolute path. If the input path was already absolute,
|
||||
* it is returned unchanged. Otherwise it is interpreted
|
||||
* relative to exports.root.
|
||||
*/
|
||||
exports.makeAbsolute = function(somePath) {
|
||||
if (path.isAbsolute(somePath)) {
|
||||
return somePath;
|
||||
}
|
||||
|
||||
const rewrittenPath = path.normalize(path.join(exports.findEtherpadRoot(), somePath));
|
||||
|
||||
absPathLogger.debug(`Relative path "${somePath}" can be rewritten to "${rewrittenPath}"`);
|
||||
return rewrittenPath;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns whether arbitraryDir is a subdirectory of parent.
|
||||
*
|
||||
* @param {string} parent - a path to check arbitraryDir against
|
||||
* @param {string} arbitraryDir - the function will check if this directory is
|
||||
* a subdirectory of the base one
|
||||
* @return {boolean}
|
||||
*/
|
||||
exports.isSubdir = function(parent, arbitraryDir) {
|
||||
// modified from: https://stackoverflow.com/questions/37521893/determine-if-a-path-is-subdirectory-of-another-in-node-js#45242825
|
||||
const relative = path.relative(parent, arbitraryDir);
|
||||
const isSubdir = !!relative && !relative.startsWith('..') && !path.isAbsolute(relative);
|
||||
|
||||
return isSubdir;
|
||||
};
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
var async = require("async");
|
||||
var fs = require("fs");
|
||||
var log4js = require('log4js');
|
||||
var os = require("os");
|
||||
var path = require("path");
|
||||
var settings = require("./Settings");
|
||||
|
@ -26,6 +27,8 @@ var spawn = require("child_process").spawn;
|
|||
// Conversion tasks will be queued up, so we don't overload the system
|
||||
var queue = async.queue(doConvertTask, 1);
|
||||
|
||||
var libreOfficeLogger = log4js.getLogger('LibreOffice');
|
||||
|
||||
/**
|
||||
* Convert a file from one type to another
|
||||
*
|
||||
|
@ -56,13 +59,18 @@ function doConvertTask(task, callback) {
|
|||
var tmpDir = os.tmpdir();
|
||||
|
||||
async.series([
|
||||
// Generate a PDF file with LibreOffice
|
||||
/*
|
||||
* use LibreOffice to convert task.srcFile to another format, given in
|
||||
* task.type
|
||||
*/
|
||||
function(callback) {
|
||||
libreOfficeLogger.debug(`Converting ${task.srcFile} to format ${task.type}. The result will be put in ${tmpDir}`);
|
||||
var soffice = spawn(settings.soffice, [
|
||||
'--headless',
|
||||
'--invisible',
|
||||
'--nologo',
|
||||
'--nolockcheck',
|
||||
'--writer',
|
||||
'--convert-to', task.type,
|
||||
task.srcFile,
|
||||
'--outdir', tmpDir
|
||||
|
@ -80,22 +88,24 @@ function doConvertTask(task, callback) {
|
|||
stdoutBuffer += data.toString();
|
||||
});
|
||||
|
||||
// Throw an exception if libreoffice failed
|
||||
soffice.on('exit', function(code) {
|
||||
if (code != 0) {
|
||||
return callback("LibreOffice died with exit code " + code + " and message: " + stdoutBuffer);
|
||||
// Throw an exception if libreoffice failed
|
||||
return callback(`LibreOffice died with exit code ${code} and message: ${stdoutBuffer}`);
|
||||
}
|
||||
|
||||
// if LibreOffice exited succesfully, go on with processing
|
||||
callback();
|
||||
})
|
||||
},
|
||||
|
||||
// Move the PDF file to the correct place
|
||||
// Move the converted file to the correct place
|
||||
function(callback) {
|
||||
var filename = path.basename(task.srcFile);
|
||||
var pdfFilename = filename.substr(0, filename.lastIndexOf('.')) + '.' + task.type;
|
||||
var pdfPath = path.join(tmpDir, pdfFilename);
|
||||
fs.rename(pdfPath, task.destFile, callback);
|
||||
var sourceFilename = filename.substr(0, filename.lastIndexOf('.')) + '.' + task.type;
|
||||
var sourcePath = path.join(tmpDir, sourceFilename);
|
||||
libreOfficeLogger.debug(`Renaming ${sourcePath} to ${task.destFile}`);
|
||||
fs.rename(sourcePath, task.destFile, callback);
|
||||
}
|
||||
], function(err) {
|
||||
// Invoke the callback for the local queue
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* 2018 - muxator
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
var absolutePaths = require('./AbsolutePaths');
|
||||
var fs = require("fs");
|
||||
var os = require("os");
|
||||
var path = require('path');
|
||||
|
@ -31,7 +32,8 @@ var suppressDisableMsg = " -- To suppress these warning messages change suppress
|
|||
var _ = require("underscore");
|
||||
|
||||
/* Root path of the installation */
|
||||
exports.root = path.normalize(path.join(npm.dir, ".."));
|
||||
exports.root = absolutePaths.findEtherpadRoot();
|
||||
console.log(`All relative paths will be interpreted relative to the identified Etherpad base dir: ${exports.root}`);
|
||||
|
||||
/**
|
||||
* The app title, visible e.g. in the browser window
|
||||
|
@ -45,6 +47,14 @@ exports.favicon = "favicon.ico";
|
|||
exports.faviconPad = "../" + exports.favicon;
|
||||
exports.faviconTimeslider = "../../" + exports.favicon;
|
||||
|
||||
/*
|
||||
* Skin name.
|
||||
*
|
||||
* Initialized to null, so we can spot an old configuration file and invite the
|
||||
* user to update it before falling back to the default.
|
||||
*/
|
||||
exports.skinName = null;
|
||||
|
||||
/**
|
||||
* The IP ep-lite should listen to
|
||||
*/
|
||||
|
@ -78,7 +88,7 @@ exports.dbType = "dirty";
|
|||
/**
|
||||
* This setting is passed with dbType to ueberDB to set up the database
|
||||
*/
|
||||
exports.dbSettings = { "filename" : path.join(exports.root, "dirty.db") };
|
||||
exports.dbSettings = { "filename" : path.join(exports.root, "var/dirty.db") };
|
||||
|
||||
/**
|
||||
* The default Text of a new pad
|
||||
|
@ -339,34 +349,27 @@ exports.getEpVersion = function() {
|
|||
|
||||
exports.reloadSettings = function reloadSettings() {
|
||||
// Discover where the settings file lives
|
||||
var settingsFilename = argv.settings || "settings.json";
|
||||
|
||||
var settingsFilename = absolutePaths.makeAbsolute(argv.settings || "settings.json");
|
||||
|
||||
// Discover if a credential file exists
|
||||
var credentialsFilename = argv.credentials || "credentials.json";
|
||||
|
||||
if (path.resolve(settingsFilename)===settingsFilename) {
|
||||
settingsFilename = path.resolve(settingsFilename);
|
||||
} else {
|
||||
settingsFilename = path.resolve(path.join(exports.root, settingsFilename));
|
||||
}
|
||||
|
||||
if (path.resolve(credentialsFilename)===credentialsFilename) {
|
||||
credentialsFilename = path.resolve(credentialsFilename);
|
||||
}
|
||||
var credentialsFilename = absolutePaths.makeAbsolute(argv.credentials || "credentials.json");
|
||||
|
||||
var settingsStr, credentialsStr;
|
||||
try{
|
||||
//read the settings sync
|
||||
settingsStr = fs.readFileSync(settingsFilename).toString();
|
||||
console.info(`Settings loaded from: ${settingsFilename}`);
|
||||
} catch(e){
|
||||
console.warn('No settings file found. Continuing using defaults!');
|
||||
console.warn(`No settings file found in ${settingsFilename}. Continuing using defaults!`);
|
||||
}
|
||||
|
||||
try{
|
||||
//read the credentials sync
|
||||
credentialsStr = fs.readFileSync(credentialsFilename).toString();
|
||||
console.info(`Credentials file read from: ${credentialsFilename}`);
|
||||
} catch(e){
|
||||
// Doesn't matter if no credentials file found..
|
||||
console.info(`No credentials file found in ${credentialsFilename}. Ignoring.`);
|
||||
}
|
||||
|
||||
// try to parse the settings
|
||||
|
@ -378,7 +381,7 @@ exports.reloadSettings = function reloadSettings() {
|
|||
settings = JSON.parse(settingsStr);
|
||||
}
|
||||
}catch(e){
|
||||
console.error('There was an error processing your settings.json file: '+e.message);
|
||||
console.error(`There was an error processing your settings file from ${settingsFilename}:` + e.message);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
|
@ -390,10 +393,10 @@ exports.reloadSettings = function reloadSettings() {
|
|||
//loop trough the settings
|
||||
for(var i in settings)
|
||||
{
|
||||
//test if the setting start with a low character
|
||||
//test if the setting start with a lowercase character
|
||||
if(i.charAt(0).search("[a-z]") !== 0)
|
||||
{
|
||||
console.warn("Settings should start with a low character: '" + i + "'");
|
||||
console.warn(`Settings should start with a lowercase character: '${i}'`);
|
||||
}
|
||||
|
||||
//we know this setting, so we overwrite it
|
||||
|
@ -409,17 +412,17 @@ exports.reloadSettings = function reloadSettings() {
|
|||
//this setting is unkown, output a warning and throw it away
|
||||
else
|
||||
{
|
||||
console.warn("Unknown Setting: '" + i + "'. This setting doesn't exist or it was removed");
|
||||
console.warn(`Unknown Setting: '${i}'. This setting doesn't exist or it was removed`);
|
||||
}
|
||||
}
|
||||
|
||||
//loop trough the settings
|
||||
for(var i in credentials)
|
||||
{
|
||||
//test if the setting start with a low character
|
||||
//test if the setting start with a lowercase character
|
||||
if(i.charAt(0).search("[a-z]") !== 0)
|
||||
{
|
||||
console.warn("Settings should start with a low character: '" + i + "'");
|
||||
console.warn(`Settings should start with a lowercase character: '${i}'`);
|
||||
}
|
||||
|
||||
//we know this setting, so we overwrite it
|
||||
|
@ -435,7 +438,7 @@ exports.reloadSettings = function reloadSettings() {
|
|||
//this setting is unkown, output a warning and throw it away
|
||||
else
|
||||
{
|
||||
console.warn("Unknown Setting: '" + i + "'. This setting doesn't exist or it was removed");
|
||||
console.warn(`Unknown Setting: '${i}'. This setting doesn't exist or it was removed`);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -444,6 +447,42 @@ exports.reloadSettings = function reloadSettings() {
|
|||
process.env['DEBUG'] = 'socket.io:' + exports.loglevel; // Used by SocketIO for Debug
|
||||
log4js.replaceConsole();
|
||||
|
||||
if (!exports.skinName) {
|
||||
console.warn(`No "skinName" parameter found. Please check out settings.json.template and update your settings.json. Falling back to the default "no-skin".`);
|
||||
exports.skinName = "no-skin";
|
||||
}
|
||||
|
||||
// checks if skinName has an acceptable value, otherwise falls back to "no-skin"
|
||||
if (exports.skinName) {
|
||||
const skinBasePath = path.join(exports.root, "src", "static", "skins");
|
||||
const countPieces = exports.skinName.split(path.sep).length;
|
||||
|
||||
if (countPieces != 1) {
|
||||
console.error(`skinName must be the name of a directory under "${skinBasePath}". This is not valid: "${exports.skinName}". Falling back to the default "no-skin".`);
|
||||
|
||||
exports.skinName = "no-skin";
|
||||
}
|
||||
|
||||
// informative variable, just for the log messages
|
||||
var skinPath = path.normalize(path.join(skinBasePath, exports.skinName));
|
||||
|
||||
// what if someone sets skinName == ".." or "."? We catch him!
|
||||
if (absolutePaths.isSubdir(skinBasePath, skinPath) === false) {
|
||||
console.error(`Skin path ${skinPath} must be a subdirectory of ${skinBasePath}. Falling back to the default "no-skin".`);
|
||||
|
||||
exports.skinName = "no-skin";
|
||||
skinPath = path.join(skinBasePath, exports.skinName);
|
||||
}
|
||||
|
||||
if (fs.existsSync(skinPath) === false) {
|
||||
console.error(`Skin path ${skinPath} does not exist. Falling back to the default "no-skin".`);
|
||||
exports.skinName = "no-skin";
|
||||
skinPath = path.join(skinBasePath, exports.skinName);
|
||||
}
|
||||
|
||||
console.info(`Using skin "${exports.skinName}" in dir: ${skinPath}`);
|
||||
}
|
||||
|
||||
if(exports.abiword){
|
||||
// Check abiword actually exists
|
||||
if(exports.abiword != null)
|
||||
|
@ -476,10 +515,12 @@ exports.reloadSettings = function reloadSettings() {
|
|||
}
|
||||
|
||||
if (!exports.sessionKey) {
|
||||
var sessionkeyFilename = argv.sessionkey || "./SESSIONKEY.txt";
|
||||
var sessionkeyFilename = absolutePaths.makeAbsolute(argv.sessionkey || "./SESSIONKEY.txt");
|
||||
try {
|
||||
exports.sessionKey = fs.readFileSync(sessionkeyFilename,"utf8");
|
||||
console.info(`Session key loaded from: ${sessionkeyFilename}`);
|
||||
} catch(e) {
|
||||
console.info(`Session key file "${sessionkeyFilename}" not found. Creating with random contents.`);
|
||||
exports.sessionKey = randomString(32);
|
||||
fs.writeFileSync(sessionkeyFilename,exports.sessionKey,"utf8");
|
||||
}
|
||||
|
@ -492,7 +533,9 @@ exports.reloadSettings = function reloadSettings() {
|
|||
if(!exports.suppressErrorsInPadText){
|
||||
exports.defaultPadText = exports.defaultPadText + "\nWarning: " + dirtyWarning + suppressDisableMsg;
|
||||
}
|
||||
console.warn(dirtyWarning);
|
||||
|
||||
exports.dbSettings.filename = absolutePaths.makeAbsolute(exports.dbSettings.filename);
|
||||
console.warn(dirtyWarning + ` File location: ${exports.dbSettings.filename}`);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -116,7 +116,7 @@ _.extend(Button.prototype, {
|
|||
|
||||
|
||||
|
||||
SelectButton = function (attributes) {
|
||||
var SelectButton = function (attributes) {
|
||||
this.attributes = attributes;
|
||||
this.options = [];
|
||||
};
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
{
|
||||
"name": "John McLear"
|
||||
},
|
||||
{
|
||||
"name": "Antonio Muci"
|
||||
},
|
||||
{
|
||||
"name": "Hans Pinckaers"
|
||||
},
|
||||
|
@ -32,26 +35,27 @@
|
|||
"channels": "0.0.4",
|
||||
"cheerio": "0.20.0",
|
||||
"clean-css": "3.4.19",
|
||||
"cookie-parser": "1.3.4",
|
||||
"ejs": "2.5.7",
|
||||
"cookie-parser": "1.4.3",
|
||||
"ejs": "2.6.1",
|
||||
"etherpad-require-kernel": "1.0.9",
|
||||
"etherpad-yajsml": "0.0.2",
|
||||
"express": "4.16.3",
|
||||
"express": "4.16.4",
|
||||
"express-session": "1.15.6",
|
||||
"find-root": "1.1.0",
|
||||
"formidable": "1.2.1",
|
||||
"graceful-fs": "4.1.3",
|
||||
"graceful-fs": "4.1.11",
|
||||
"jsonminify": "0.4.1",
|
||||
"languages4translatewiki": "0.1.3",
|
||||
"log4js": "0.6.35",
|
||||
"measured-core": "1.11.2",
|
||||
"npm": "6.4.0",
|
||||
"npm": "6.4.1",
|
||||
"object.values": "^1.0.4",
|
||||
"request": "2.83.0",
|
||||
"request": "2.88.0",
|
||||
"resolve": "1.1.7",
|
||||
"security": "1.0.0",
|
||||
"semver": "5.1.0",
|
||||
"semver": "5.6.0",
|
||||
"slide": "1.1.6",
|
||||
"socket.io": "1.7.3",
|
||||
"socket.io": "2.1.1",
|
||||
"swagger-node-express": "2.1.3",
|
||||
"tinycon": "0.0.1",
|
||||
"ueberdb2": "0.4.0",
|
||||
|
@ -66,7 +70,7 @@
|
|||
"mocha": "5.2.0",
|
||||
"nyc": "^12.0.2",
|
||||
"supertest": "3.0.0",
|
||||
"wd": "1.10.3"
|
||||
"wd": "1.11.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0",
|
||||
|
@ -74,11 +78,12 @@
|
|||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/ether/etherpad-lite.git"
|
||||
"url": "https://github.com/ether/etherpad-lite.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "nyc mocha --timeout 5000 ../tests/backend/specs/api"
|
||||
},
|
||||
"version": "1.7.0",
|
||||
"version": "1.7.5",
|
||||
"license": "Apache-2.0"
|
||||
}
|
||||
|
||||
|
|
|
@ -791,6 +791,10 @@ table#otheruserstable {
|
|||
border: 0
|
||||
}
|
||||
|
||||
.buttonicon:before {
|
||||
font-family: "fontawesome-etherpad";
|
||||
}
|
||||
|
||||
.buttonicon:focus{
|
||||
border: 1px solid #666;
|
||||
}
|
||||
|
@ -1320,19 +1324,7 @@ input[type=checkbox] {
|
|||
|
||||
}
|
||||
|
||||
[data-icon]:before {
|
||||
font-family: "fontawesome-etherpad" !important;
|
||||
content: attr(data-icon);
|
||||
font-style: normal !important;
|
||||
font-weight: normal !important;
|
||||
font-variant: normal !important;
|
||||
text-transform: none !important;
|
||||
speak: none;
|
||||
line-height: 1;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
[data-icon]:before,
|
||||
[class^="icon-"]:before,
|
||||
[class*=" icon-"]:before {
|
||||
font-family: "fontawesome-etherpad" !important;
|
||||
|
|
3
src/static/custom/.gitignore
vendored
3
src/static/custom/.gitignore
vendored
|
@ -1,3 +0,0 @@
|
|||
*
|
||||
!.gitignore
|
||||
!*.template
|
|
@ -347,6 +347,24 @@
|
|||
"css": "slideshare",
|
||||
"code": 59441,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "d35a1d35efeb784d1dc9ac18b9b6c2b6",
|
||||
"css": "pencil",
|
||||
"code": 59449,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "0ddd3e8201ccc7d41f7b7c9d27eca6c1",
|
||||
"css": "link",
|
||||
"code": 59450,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "8fb55fd696d9a0f58f3b27c1d8633750",
|
||||
"css": "table",
|
||||
"code": 61646,
|
||||
"src": "fontawesome"
|
||||
}
|
||||
]
|
||||
}
|
Binary file not shown.
|
@ -1,68 +1,130 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Copyright (C) 2015 by original authors @ fontello.com</metadata>
|
||||
<metadata>Copyright (C) 2018 by original authors @ fontello.com</metadata>
|
||||
<defs>
|
||||
<font id="fontawesome-etherpad" horiz-adv-x="1000" >
|
||||
<font-face font-family="fontawesome-etherpad" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
||||
<missing-glyph horiz-adv-x="1000" />
|
||||
<glyph glyph-name="align-left" unicode="" d="m1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-714q-15 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-857q-15 0-25 11t-11 25v72q0 14 11 25t25 10h857q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-643q-15 0-25 10t-11 25v72q0 14 11 25t25 11h643q14 0 25-11t10-25z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="print" unicode="" d="m214-7h500v143h-500v-143z m0 357h500v214h-89q-22 0-38 16t-16 38v89h-357v-357z m643-36q0 15-10 25t-26 11-25-11-10-25 10-25 25-10 26 10 10 25z m72 0v-232q0-7-6-12t-12-6h-125v-89q0-22-16-38t-38-16h-536q-22 0-37 16t-16 38v89h-125q-7 0-13 6t-5 12v232q0 44 32 76t75 31h36v304q0 22 16 38t37 16h375q23 0 50-12t42-26l85-85q15-16 27-43t11-49v-143h35q45 0 76-31t32-76z" horiz-adv-x="928.6" />
|
||||
<glyph glyph-name="doc" unicode="" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="file-pdf" unicode="" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-287 331q18-14 47-31 33 4 65 4 82 0 99-27 9-13 1-29 0-1-1-1l-1-2v0q-3-21-39-21-27 0-65 11t-72 29q-123-13-219-46-85-146-135-146-8 0-15 4l-14 6q0 1-3 3-6 6-4 20 5 23 32 51t73 54q8 5 13-3 1-1 1-2 29 47 60 110 38 76 58 146-13 46-17 89t4 71q6 22 23 22h12q13 0 20-8 10-12 5-38-1-3-2-4 0-2 0-5v-17q-1-68-8-107 31-91 82-133z m-322-229q30 13 77 88-29-22-49-47t-28-41z m223 513q-9-23-2-73 1 4 4 24 0 2 4 24 1 3 3 5-1 0-1 1t0 1-1 1q0 12-7 20 0-1 0-1v-2z m-70-368q76 30 159 45-1 0-7 5t-9 8q-43 37-71 98-15-48-47-110-16-31-25-46z m361 8q-14 14-78 14 42-16 69-16 8 0 10 1 0 0-1 1z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="file-word" unicode="" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-656 500v-59h39l92-369h88l72 271q4 11 5 25 1 9 1 14h3l1-14q1-1 2-11t3-14l72-271h89l91 369h39v59h-167v-59h50l-55-245q-3-11-4-25l-1-12h-3l-1 12q-1 2-2 11t-3 14l-81 304h-63l-81-304q-1-5-2-13t-2-12l-2-12h-2l-2 12q-1 14-4 25l-55 245h50v59h-167z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="file-excel" unicode="" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-547 131v-59h157v59h-42l58 90q3 4 5 9t5 8 2 2h1q0-2 2-6 2-2 3-4t3-4 4-5l60-90h-43v-59h163v59h-38l-107 152 108 158h38v59h-156v-59h41l-57-89q-2-4-6-9t-5-8l-1-1h-1q-1 2-3 5-3 6-9 13l-59 89h42v59h-162v-59h38l106-152-109-158h-38z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="file-powerpoint" unicode="" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-554 131v-59h183v59h-52v93h76q43 0 66 9 37 12 59 48t23 82q0 45-21 78t-56 49q-27 10-72 10h-206v-59h52v-310h-52z m197 156h-66v150h67q29 0 46-10 31-19 31-64 0-50-34-67-18-9-44-9z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="file-image" unicode="" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-72 250v-178h-571v107l107 107 71-71 215 214z m-464 108q-45 0-76 31t-31 76 31 76 76 31 76-31 31-76-31-76-76-31z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="users" unicode="" d="m331 350q-90-3-148-71h-75q-45 0-77 22t-31 66q0 197 69 197 4 0 25-11t54-24 66-12q38 0 75 13-3-21-3-37 0-78 45-143z m598-356q0-66-41-105t-108-39h-488q-68 0-108 39t-41 105q0 30 2 58t8 61 14 61 24 54 35 45 48 30 62 11q6 0 24-12t41-26 59-27 76-12 75 12 60 27 41 26 23 12q35 0 63-11t47-30 35-45 24-54 15-61 8-61 2-58z m-572 713q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z m393-214q0-89-63-152t-151-62-152 62-63 152 63 151 152 63 151-63 63-151z m321-126q0-43-31-66t-77-22h-75q-57 68-147 71 45 65 45 143 0 16-3 37 37-13 74-13 33 0 67 12t54 24 24 11q69 0 69-197z m-71 340q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z" horiz-adv-x="1071.4" />
|
||||
<glyph glyph-name="user" unicode="" d="m786 66q0-67-41-106t-108-39h-488q-67 0-108 39t-41 106q0 30 2 58t8 61 15 60 24 55 34 45 48 30 62 11q5 0 24-12t41-27 60-27 75-12 74 12 61 27 41 27 24 12q34 0 62-11t48-30 34-45 24-55 15-60 8-61 2-58z m-179 498q0-88-63-151t-151-63-152 63-62 151 62 152 152 63 151-63 63-152z" horiz-adv-x="785.7" />
|
||||
<glyph glyph-name="mail" unicode="" d="m929 11v428q-18-20-39-37-149-114-238-188-28-24-46-38t-48-27-57-13h-2q-26 0-57 13t-48 27-46 38q-88 74-238 188-21 17-39 37v-428q0-8 6-13t12-5h822q7 0 12 5t6 13z m0 586v14t-1 7-1 7-3 5-5 4-8 2h-822q-7 0-12-6t-6-12q0-94 82-159 108-85 224-177 4-2 20-16t25-21 25-18 28-15 24-5h2q11 0 24 5t28 15 25 18 25 21 20 16q116 92 224 177 30 24 56 65t26 73z m71 21v-607q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63v607q0 37 26 63t63 26h822q37 0 63-26t26-63z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="videocam" unicode="" d="m1000 654v-608q0-23-22-32-7-3-14-3-15 0-25 10l-225 225v-92q0-67-47-114t-113-47h-393q-67 0-114 47t-47 114v392q0 67 47 114t114 47h393q66 0 113-47t47-114v-92l225 225q10 10 25 10 7 0 14-3 22-9 22-32z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="picture" unicode="" d="m357 529q0-45-31-76t-76-32-76 32-31 76 31 75 76 32 76-32 31-75z m572-215v-250h-786v107l178 179 90-89 285 285z m53 393h-893q-7 0-12-5t-6-13v-678q0-8 6-13t12-5h893q7 0 13 5t5 13v678q0 7-5 13t-13 5z m89-18v-678q0-37-26-63t-63-27h-893q-36 0-63 27t-26 63v678q0 37 26 63t63 27h893q37 0 63-27t26-63z" horiz-adv-x="1071.4" />
|
||||
<glyph glyph-name="eye-off" unicode="" d="m310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-12 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-92l157 281q4-26 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-86t81-102q11-19 11-39z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="spinner" unicode="" d="m277 100q0-33-24-57t-57-23q-33 0-56 23t-24 57 24 57 56 23q33 0 57-23t24-57z m241-107q0-30-21-51t-51-21-50 21-21 51 21 50 50 21 51-21 21-50z m-339 357q0-37-27-63t-63-26-63 26-26 63 26 63 63 26 63-26 27-63z m580-250q0-26-18-44t-45-18-44 18-18 44 18 44 44 19 45-19 18-44z m-464 500q0-41-29-69t-70-29-69 29-29 69 29 69 69 29 70-29 29-69z m259 107q0-45-32-76t-76-31-75 31-32 76 32 76 75 31 76-31 32-76z m303-357q0-22-15-38t-38-16-38 16-16 38 16 38 38 16 38-16 15-38z m-116 250q0-18-13-32t-32-13-31 13-13 32 13 31 31 14 32-14 13-31z" horiz-adv-x="875" />
|
||||
<glyph glyph-name="align-center" unicode="" d="m1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-500q-14 0-25 11t-11 25v71q0 15 11 25t25 11h500q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-786q-14 0-25 11t-11 25v72q0 14 11 25t25 10h786q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-358q-14 0-25 10t-10 25v72q0 14 10 25t25 11h358q14 0 25-11t10-25z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="align-right" unicode="" d="m1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 214v-71q0-15-11-25t-25-11h-714q-14 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m0 215v-72q0-14-11-25t-25-11h-857q-14 0-25 11t-11 25v72q0 14 11 25t25 10h857q15 0 25-10t11-25z m0 214v-72q0-14-11-25t-25-10h-643q-14 0-25 10t-10 25v72q0 14 10 25t25 11h643q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="align-justify" unicode="" d="m1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 214v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 215v-72q0-14-11-25t-25-11h-928q-15 0-25 11t-11 25v72q0 14 11 25t25 10h928q15 0 25-10t11-25z m0 214v-72q0-14-11-25t-25-10h-928q-15 0-25 10t-11 25v72q0 14 11 25t25 11h928q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="list" unicode="" d="m143 118v-107q0-7-5-13t-13-5h-107q-7 0-13 5t-5 13v107q0 7 5 12t13 6h107q7 0 13-6t5-12z m0 214v-107q0-7-5-13t-13-5h-107q-7 0-13 5t-5 13v107q0 7 5 13t13 5h107q7 0 13-5t5-13z m0 214v-107q0-7-5-12t-13-6h-107q-7 0-13 6t-5 12v107q0 8 5 13t13 5h107q7 0 13-5t5-13z m857-428v-107q0-7-5-13t-13-5h-750q-7 0-12 5t-6 13v107q0 7 6 12t12 6h750q7 0 13-6t5-12z m-857 643v-107q0-8-5-13t-13-5h-107q-7 0-13 5t-5 13v107q0 7 5 12t13 6h107q7 0 13-6t5-12z m857-429v-107q0-7-5-13t-13-5h-750q-7 0-12 5t-6 13v107q0 7 6 13t12 5h750q7 0 13-5t5-13z m0 214v-107q0-7-5-12t-13-6h-750q-7 0-12 6t-6 12v107q0 8 6 13t12 5h750q7 0 13-5t5-13z m0 215v-107q0-8-5-13t-13-5h-750q-7 0-12 5t-6 13v107q0 7 6 12t12 6h750q7 0 13-6t5-12z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="indent-left" unicode="" d="m214 546v-321q0-7-5-13t-13-5q-7 0-12 5l-161 161q-5 5-5 13t5 13l161 160q5 5 12 5 8 0 13-5t5-13z m786-428v-107q0-7-5-13t-13-5h-964q-7 0-13 5t-5 13v107q0 7 5 12t13 6h964q7 0 13-6t5-12z m0 214v-107q0-7-5-13t-13-5h-607q-7 0-13 5t-5 13v107q0 7 5 13t13 5h607q7 0 13-5t5-13z m0 214v-107q0-7-5-12t-13-6h-607q-7 0-13 6t-5 12v107q0 8 5 13t13 5h607q7 0 13-5t5-13z m0 215v-107q0-8-5-13t-13-5h-964q-7 0-13 5t-5 13v107q0 7 5 12t13 6h964q7 0 13-6t5-12z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="indent-right" unicode="" d="m196 386q0-8-5-13l-160-161q-5-5-13-5-7 0-13 5t-5 13v321q0 8 5 13t13 5q8 0 13-5l160-160q5-5 5-13z m804-268v-107q0-7-5-13t-13-5h-964q-7 0-13 5t-5 13v107q0 7 5 12t13 6h964q7 0 13-6t5-12z m0 214v-107q0-7-5-13t-13-5h-607q-7 0-13 5t-5 13v107q0 7 5 13t13 5h607q7 0 13-5t5-13z m0 214v-107q0-7-5-12t-13-6h-607q-7 0-13 6t-5 12v107q0 8 5 13t13 5h607q7 0 13-5t5-13z m0 215v-107q0-8-5-13t-13-5h-964q-7 0-13 5t-5 13v107q0 7 5 12t13 6h964q7 0 13-6t5-12z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="list-bullet" unicode="" d="m214 64q0-44-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m0 286q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m786-232v-107q0-7-5-13t-13-5h-678q-8 0-13 5t-5 13v107q0 7 5 12t13 6h678q7 0 13-6t5-12z m-786 518q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m786-232v-108q0-7-5-12t-13-5h-678q-8 0-13 5t-5 12v108q0 7 5 12t13 5h678q7 0 13-5t5-12z m0 285v-107q0-7-5-12t-13-6h-678q-8 0-13 6t-5 12v107q0 8 5 13t13 5h678q7 0 13-5t5-13z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="list-numbered" unicode="" d="m213-54q0-45-31-70t-75-26q-60 0-96 37l31 49q28-25 60-25 16 0 28 8t12 24q0 35-59 31l-14 31q4 6 18 24t24 31 20 21v1q-9 0-27-1t-27 0v-30h-59v85h186v-49l-53-65q28-6 45-27t17-49z m1 350v-89h-202q-4 20-4 30 0 29 14 52t31 38 37 27 31 24 14 25q0 14-9 22t-22 7q-25 0-45-32l-47 33q13 28 40 44t59 16q40 0 68-23t28-63q0-28-19-51t-42-36-42-28-20-30h71v34h59z m786-178v-107q0-8-5-13t-13-5h-678q-8 0-13 5t-5 13v107q0 8 5 13t13 5h678q7 0 13-6t5-12z m-786 502v-56h-187v56h60q0 22 0 68t1 67v7h-1q-5-10-28-30l-40 42 76 71h59v-225h60z m786-216v-108q0-7-5-12t-13-5h-678q-8 0-13 5t-5 12v108q0 7 5 12t13 5h678q7 0 13-5t5-12z m0 285v-107q0-7-5-12t-13-6h-678q-8 0-13 6t-5 12v107q0 8 5 13t13 5h678q7 0 13-5t5-13z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="underline" unicode="" d="m27 726q-21 1-25 2l-2 49q7 0 22 0 34 0 63-2 74-4 92-4 48 0 94 2 65 2 82 3 31 0 48 1l-1-8 1-36v-5q-33-5-69-5-33 0-44-14-7-7-7-73 0-8 0-18t0-15l1-128 8-156q3-69 28-112 20-33 54-52 49-26 98-26 58 0 107 16 31 10 55 28 27 20 37 36 20 31 29 63 12 41 12 128 0 44-2 72t-6 68-8 89l-2 33q-3 37-13 49-19 20-43 19l-56-1-8 2 1 48h47l114-6q43-2 110 6l10-2q3-21 3-28 0-4-2-17-25-7-47-8-41-6-44-9-8-9-8-23 0-4 0-15t1-17q5-11 13-221 3-109-9-170-8-42-23-68-21-36-62-69-42-32-102-49-61-19-142-19-93 0-159 26-66 26-99 68-34 42-47 109-9 44-9 132v186q0 105-9 119-14 20-82 21z m830-787v36q0 8-5 13t-13 5h-821q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h821q8 0 13 5t5 13z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="strike" unicode="" d="m982 350q8 0 13-5t5-13v-36q0-7-5-12t-13-5h-964q-8 0-13 5t-5 12v36q0 8 5 13t13 5h964z m-712 36q-16 19-29 44-27 54-27 105 0 101 75 173 74 71 219 71 28 0 94-11 36-7 98-27 6-21 12-66 8-68 8-102 0-10-3-25l-7-2-46 4-8 1q-28 83-58 114-49 51-117 51-64 0-102-33-37-32-37-81 0-41 37-79t156-72q38-11 96-36 33-16 53-29h-414z m282-143h230q4-22 4-51 0-62-23-119-13-30-40-58-20-19-61-45-44-27-85-37-45-12-113-12-64 0-109 13l-78 23q-32 8-40 15-5 5-5 12v8q0 60-1 87 0 17 0 38l1 20v25l57 1q8-19 17-40t12-31 7-15q20-32 45-52 24-20 59-32 33-12 73-12 36 0 78 15 43 14 68 48 26 34 26 72 0 47-45 87-19 16-77 40z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="superscript" unicode="" d="m501 86v-93h-139l-89 141-13 23q-4 5-6 12h-2l-5-12q-5-11-14-25l-86-139h-144v93h71l110 162-103 152h-76v94h154l77-127q1-2 13-24 4-5 6-11h2q1 5 6 11l14 24 78 127h143v-94h-69l-103-149 114-165h61z m355 379v-115h-287l-1 15q-3 16-3 26 0 35 15 65t36 48 47 37 47 30 36 30 15 36q0 21-17 35t-39 13q-29 0-54-21-8-7-20-22l-59 52q15 20 35 37 46 36 105 36 61 0 99-33t38-89q0-31-13-57t-35-43-45-33-46-28-37-29-17-35h130v45h70z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="subscript" unicode="" d="m501 86v-93h-139l-89 141-13 23q-4 5-6 12h-2l-5-12q-5-11-14-25l-86-139h-144v93h71l110 162-103 152h-76v94h154l77-127q1-2 13-24 4-5 6-11h2q1 5 6 11l14 24 78 127h143v-94h-69l-103-149 114-165h61z m356-121v-115h-287l-2 15q-2 25-2 26 0 35 15 65t36 48 47 37 47 30 36 30 15 36q0 21-17 35t-39 13q-29 0-54-21-8-6-20-22l-59 52q15 20 35 37 45 36 105 36 62 0 99-33t38-89q0-37-19-66t-47-48-55-35-49-35-23-41h130v45h70z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="font" unicode="" d="m405 538l-95-251q18 0 76-1t89-1q11 0 32 1-48 141-102 252z m-405-617l1 44q13 4 31 7t32 6 28 8 25 17 17 28l132 344 156 404h72q4-8 6-12l114-268q19-44 60-144t63-153q9-19 33-81t40-94q11-25 19-31 11-9 49-17t47-11q4-22 4-32 0-2-1-7t0-8q-35 0-106 5t-107 4q-42 0-120-4t-99-4q0 24 2 43l73 16q1 0 7 1t9 2 8 3 9 4 6 4 5 6 1 8q0 9-17 54t-40 99-24 56l-251 1q-14-33-43-109t-28-91q0-12 8-21t24-14 27-7 32-5 23-2q1-11 1-32 0-5-2-16-32 0-97 6t-97 6q-5 0-15-3t-12-2q-45-8-105-8z" horiz-adv-x="928.6" />
|
||||
<glyph glyph-name="bold" unicode="" d="m310 1q41-18 78-18 210 0 210 187 0 64-23 101-15 24-35 41t-37 26-45 14-47 6-53 1q-40 0-56-6 0-29 0-88t-1-89q0-4 0-37t0-54 2-47 7-37z m-8 417q23-4 61-4 46 0 80 7t61 25 41 50 15 79q0 39-16 68t-45 46-60 24-69 8q-28 0-73-7 0-28 3-84t2-85q0-15 0-45t-1-44q0-26 1-38z m-302-497l1 53q9 2 48 9t59 15q4 7 7 15t4 19 4 18 1 21 0 19v36q0 548-12 572-2 5-12 8t-25 6-28 4-27 3-17 2l-2 46q55 1 190 6t208 5q13 0 38 0t38 0q39 0 76-7t72-24 60-39 41-59 16-76q0-29-9-54t-22-40-36-32-41-25-47-22q86-20 144-75t57-139q0-55-20-100t-52-73-77-47-91-27-98-8q-25 0-74 2t-74 1q-59 0-171-6t-129-7z" horiz-adv-x="785.7" />
|
||||
<glyph glyph-name="italic" unicode="" d="m0-78l10 48q3 1 45 12t62 21q16 19 23 56 1 4 35 162t63 303 29 165v14q-13 7-30 11t-39 4-32 3l10 58q19-2 67-4t84-4 67-1q27 0 55 1t67 4 55 4q-2-22-10-50-17-6-57-16t-60-19q-5-10-8-23t-5-23-4-25-4-24q-15-82-49-234t-43-198q-1-5-7-32t-11-51-9-46-4-32l1-10q9-3 103-18-2-24-9-55-6 0-18-1t-18-1q-16 0-49 6t-48 6q-77 1-115 1-28 0-79-5t-68-6z" horiz-adv-x="571.4" />
|
||||
<glyph glyph-name="header" unicode="" d="m939-79q-25 0-74 2t-75 2q-24 0-73-2t-74-2q-14 0-21 12t-7 25q0 17 9 26t22 9 29 4 25 9q18 11 18 78l0 218q0 12-1 17-7 3-28 3h-376q-22 0-29-3 0-5 0-17l-1-207q0-79 21-92 9-5 26-7t32-2 25-8 11-26q0-14-7-26t-20-13q-26 0-78 2t-77 2q-24 0-71-2t-71-2q-13 0-20 12t-7 25q0 17 9 25t20 10 26 4 24 9q18 13 18 80l-1 31v454q0 2 1 14t0 21-1 21-2 24-4 20-6 18-9 10q-8 5-25 6t-29 2-23 7-10 26q0 14 6 26t20 13q26 0 78-2t77-2q23 0 71 2t70 2q14 0 21-13t7-26q0-17-9-25t-22-8-28-2-24-7q-19-12-19-90l1-178q0-12 0-18 7-2 22-2h390q14 0 21 2 1 6 1 18l0 178q0 78-19 90-10 6-33 7t-37 7-14 28q0 14 7 26t21 13q24 0 74-2t73-2q24 0 72 2t72 2q14 0 21-13t7-26q0-17-10-25t-22-8-29-2-24-7q-20-13-20-90l1-526q0-66 19-78 9-6 25-7t30-3 23-9 10-24q0-15-6-27t-20-13z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="text-height" unicode="" d="m973 64q19 0 24-10t-6-25l-71-90q-11-15-27-15t-27 15l-71 90q-11 15-6 25t23 10h45v572h-45q-18 0-23 10t6 25l71 90q11 15 27 15t27-15l71-90q11-15 6-25t-24-10h-44v-572h44z m-928 714l30-15q7-3 118-3 25 0 74 1t73 1q21 0 60 0t60 0h164q3 0 12 0t11 0 9 1 10 5 8 10l24 1q2 0 7-1t8 0q1-62 1-187 0-45-2-61-22-8-38-10-14 24-31 71-1 5-6 27t-8 41-4 20q-3 4-7 7t-8 3-8 1-10 1-9-1q-9 0-37 1t-42 0-35-1-40-4q-5-45-4-75 0-53 1-217t1-254q0-9-1-40t0-51 7-38q22-12 69-24t67-21q2-22 2-28 0-8-1-16l-19-1q-43-1-122 5t-115 5q-28 0-85-5t-84-5q-2 29-2 29v5q9 15 34 24t55 17 44 15q10 23 10 213 0 57-1 169t-2 170v65q0 1 0 8t1 14-1 15-2 13-3 8q-6 7-90 7-18 0-52-7t-44-15q-11-7-19-40t-18-62-24-30q-23 15-31 25v213z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="text-width" unicode="" d="m45 778l30-15q7-3 118-3 25 0 74 1t73 1q39 0 138 1t170 0 138-2q18-1 31 17l23 0q3 0 8 0t8 0q1-63 1-188 0-44-3-60-21-8-38-10-14 24-30 71-1 5-6 26t-8 41-4 21q-6 7-15 10-3 1-37 1-17 0-52 1t-57 1-53-2-53-4q-5-45-5-75l1-85v29q0-31 0-86t1-101 0-85q0-9-1-40t0-51 7-38q22-12 69-24t67-21q3-22 3-28 0-8-2-16l-19-1q-42-1-121 5t-116 5q-28 0-84-5t-85-5q-2 29-2 29v5q10 15 35 24t55 16 43 16q4 8 7 41t3 81 1 86-1 86 0 50q0 4-1 12t-2 12q0 4 1 25t0 41 0 42-1 38-4 18q-6 7-90 7-23 0-91-8t-77-14q-11-6-19-40t-18-62-24-30q-23 15-31 25v213z m686-715q7 0 23-11t33-23 33-28 20-17q14-11 14-27t-14-27q-2-2-20-17t-33-27-33-23-23-11q-7 0-11 5t-6 16-1 19 0 18 1 11h-571q0-1 1-11t1-18-2-19-5-16-12-5q-7 0-23 11t-32 23-34 27-20 17q-14 11-14 27t14 27q3 2 20 17t34 28 32 23 23 11q7 0 12-6t5-16 2-19-1-18-1-11h571q0 1-1 11t0 18 1 19 6 16 11 6z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="to-start" unicode="" d="m546 771q11 11 18 8t7-18v-822q0-14-7-18t-18 8l-396 396q-5 5-7 11v-379q0-14-11-25t-25-11h-71q-15 0-25 11t-11 25v786q0 14 11 25t25 11h71q15 0 25-11t11-25v-379q2 7 7 11z" horiz-adv-x="571.4" />
|
||||
<glyph glyph-name="to-end" unicode="" d="m25-71q-10-11-18-8t-7 18v822q0 14 7 18t18-8l396-396q5-4 8-11v379q0 14 10 25t25 11h72q14 0 25-11t10-25v-786q0-14-10-25t-25-11h-72q-14 0-25 11t-10 25v379q-3-6-8-11z" horiz-adv-x="571.4" />
|
||||
<glyph glyph-name="ccw" unicode="" d="m857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="cw" unicode="" d="m857 707v-250q0-14-10-25t-26-11h-250q-23 0-32 23-10 22 7 38l77 77q-82 77-194 77-58 0-111-23t-91-61-62-91-22-111 22-111 62-91 91-61 111-23q66 0 125 29t100 82q4 6 13 7 8 0 14-5l76-77q5-4 6-11t-5-13q-60-74-147-114t-182-41q-87 0-167 34t-136 92-92 137-34 166 34 166 92 137 136 92 167 34q82 0 158-31t137-88l72 72q16 18 39 8 22-9 22-33z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="arrows-cw" unicode="" d="m843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-37 90-57t105-20q74 0 139 37t104 99q6 10 29 66 5 13 17 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="file-code" unicode="" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-518 500q4 7 12 7t13-3l28-21q7-5 7-12t-3-14l-102-135 102-136q4-6 3-13t-7-12l-28-21q-6-4-13-4t-12 7l-126 168q-8 11 0 21z m447-168q8-10 0-21l-126-168q-4-6-11-7t-14 4l-28 21q-6 5-7 12t3 13l102 136-102 135q-4 7-3 14t7 12l28 21q6 4 14 3t11-7z m-346-257q-7 1-11 7t-3 14l77 464q1 7 7 11t14 3l35-5q7-2 11-8t3-13l-77-464q-1-7-7-11t-13-3z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="code" unicode="" d="m344 69l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13t-6-13z m330 596l-208-721q-2-7-9-11t-13-1l-34 9q-8 3-11 9t-2 14l208 720q3 8 9 11t13 2l35-10q7-2 11-9t1-13z m367-364l-260-260q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13t-5-13z" horiz-adv-x="1071.4" />
|
||||
<glyph glyph-name="chat" unicode="" d="m786 421q0-77-53-143t-143-104-197-38q-48 0-98 9-70-49-155-72-21-5-48-9h-2q-6 0-12 5t-6 12q-1 1-1 3t1 4 1 3l1 3t2 3 2 3 3 3 2 2q3 3 13 14t15 16 12 17 14 21 11 25q-69 40-108 98t-40 125q0 78 53 144t143 104 197 38 197-38 143-104 53-144z m214-142q0-67-40-126t-108-98q5-14 11-25t14-21 13-16 14-17 13-14q0 0 2-2t3-3 2-3 2-3l1-3t1-3 1-4-1-3q-2-8-7-13t-13-4q-27 4-48 9-85 23-155 72-50-9-98-9-151 0-263 74 32-3 49-3 90 0 172 25t148 72q69 52 107 119t37 141q0 43-13 85 72-39 114-99t42-128z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="comment-empty" unicode="" d="m500 636q-114 0-213-39t-157-105-59-142q0-62 40-119t113-98l48-28-15-54q-13-50-39-95 85 35 154 95l24 21 31-3q39-5 73-5 114 0 213 39t157 105 59 142-59 142-157 105-213 39z m500-286q0-97-67-179t-182-130-251-48q-39 0-81 4-110-97-257-135-27-7-63-12h-3q-8 0-15 6t-9 15v1q-2 2 0 7t1 5 2 5l4 5t4 5 4 5q4 5 17 19t20 22 17 22 18 28 15 33 15 42q-88 50-138 123t-51 157q0 97 67 179t182 130 251 48 251-48 182-130 67-179z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="trash-empty" unicode="" d="m286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q22 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
|
||||
<glyph glyph-name="mic" unicode="" d="m643 457v-71q0-124-82-215t-204-104v-74h143q15 0 25-11t11-25-11-25-25-11h-357q-15 0-25 11t-11 25 11 25 25 11h143v74q-121 13-204 104t-82 215v71q0 15 11 25t25 11 25-11 10-25v-71q0-104 74-177t176-73 177 73 73 177v71q0 15 11 25t25 11 25-11 11-25z m-143 214v-285q0-74-52-126t-127-53-126 53-52 126v285q0 74 52 127t126 52 127-52 52-127z" horiz-adv-x="642.9" />
|
||||
<glyph glyph-name="play" unicode="" d="m772 333l-741-412q-13-7-22-2t-9 20v822q0 14 9 20t22-2l741-412q13-7 13-17t-13-17z" horiz-adv-x="785.7" />
|
||||
<glyph glyph-name="stop" unicode="" d="m857 743v-786q0-14-10-25t-26-11h-785q-15 0-25 11t-11 25v786q0 14 11 25t25 11h785q15 0 26-11t10-25z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="pause" unicode="" d="m857 743v-786q0-14-10-25t-26-11h-285q-15 0-25 11t-11 25v786q0 14 11 25t25 11h285q15 0 26-11t10-25z m-500 0v-786q0-14-10-25t-26-11h-285q-15 0-25 11t-11 25v786q0 14 11 25t25 11h285q15 0 26-11t10-25z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="gauge" unicode="" d="m214 207q0 30-21 51t-50 21-51-21-21-51 21-50 51-21 50 21 21 50z m107 250q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m239-268l57 213q3 14-5 27t-21 16-27-3-17-22l-56-213q-33-3-60-25t-35-55q-11-43 11-81t66-50 81 11 50 66q9 33-4 65t-40 51z m369 18q0 30-21 51t-51 21-50-21-21-51 21-50 50-21 51 21 21 50z m-358 357q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m250-107q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m179-250q0-145-79-269-10-17-30-17h-782q-20 0-30 17-79 123-79 269 0 102 40 194t106 160 160 107 194 39 194-39 160-107 106-160 40-194z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="brush" unicode="" d="m901 850q39 0 69-26t29-65q0-35-25-84-185-351-260-420-54-51-121-51-71 0-121 52t-51 122q0 72 52 119l356 323q33 30 72 30z m-507-577q22-42 59-73t84-42l1-40q2-119-72-193t-195-75q-68 0-121 26t-86 71-48 102-16 123q4-3 23-17t35-25 32-20 26-9q23 0 31 20 14 37 32 63t39 42 49 27 57 14 70 6z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="slideshare" unicode="" d="m487 437q0-46-35-79t-85-34-85 34-36 79q0 47 36 80t85 33 85-33 35-80z m280 0q0-46-35-79t-85-34q-50 0-85 34t-36 79q0 47 36 80t85 33q50 0 85-33t35-80z m126-100v372q0 48-18 69t-62 20h-620q-47 0-63-19t-17-70v-376q24-13 50-22t45-16 45-10 40-6 39-2 32-1 32 1 25 1q38 1 53-15 3-3 5-5 15-14 34-28 4 51 66 48 3 0 21 0t24-1 25-1 30 1 30 2 34 5 35 7 37 11 38 15 40 20z m91 2q-68-83-208-140 47-159-13-260-36-63-102-82-58-18-101 8-48 28-46 92l-1 182v0q-4 1-13 3t-13 3l-1-188q2-64-46-92-44-26-102-8-66 20-102 83-59 101-12 259-140 57-208 140-14 21-2 36t33-1q2-1 7-4t6-4v387q0 40 26 69t64 28h701q37 0 64-28t26-69v-387l12 8q21 15 33 0t-2-35z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="tasks" unicode="" d="m571 64h358v72h-358v-72z m-214 286h572v71h-572v-71z m357 286h215v71h-215v-71z m286-465v-142q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v142q0 15 11 26t25 10h928q15 0 25-10t11-26z m0 286v-143q0-14-11-25t-25-10h-928q-15 0-25 10t-11 25v143q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 286v-143q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v143q0 14 11 25t25 11h928q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="cog" unicode="" d="m571 350q0 59-41 101t-101 42-101-42-42-101 42-101 101-42 101 42 41 101z m286 61v-124q0-7-4-13t-11-7l-104-16q-10-30-21-51 19-27 59-77 6-6 6-13t-5-13q-15-21-55-61t-53-39q-7 0-14 5l-77 60q-25-13-51-21-9-76-16-104-4-16-20-16h-124q-8 0-14 5t-6 12l-16 103q-27 9-50 21l-79-60q-6-5-14-5-8 0-14 6-70 64-92 94-4 5-4 13 0 6 5 12 8 12 28 37t30 40q-15 28-23 55l-102 15q-7 1-11 7t-5 13v124q0 7 5 13t10 7l104 16q8 25 22 51-23 32-60 77-6 7-6 14 0 5 5 12 15 20 55 60t53 40q7 0 15-5l77-60q24 13 50 21 9 76 17 104 3 15 20 15h124q7 0 13-4t7-12l15-103q28-9 50-21l80 60q5 5 13 5 7 0 14-5 72-67 92-95 4-5 4-13 0-6-4-12-9-12-29-38t-30-39q14-28 23-55l102-15q7-1 12-7t4-13z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="exchange" unicode="" d="m1000 189v-107q0-7-5-12t-13-6h-768v-107q0-7-5-12t-13-6q-6 0-13 6l-178 178q-5 5-5 13 0 8 5 13l179 178q5 5 12 5 8 0 13-5t5-13v-107h768q7 0 13-5t5-13z m0 304q0-8-5-13l-179-179q-5-5-12-5-8 0-13 6t-5 12v107h-768q-7 0-13 6t-5 12v107q0 8 5 13t13 5h768v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="star-empty" unicode="" d="m634 290l171 165-235 35-106 213-105-213-236-35 171-165-41-235 211 111 211-111z m295 199q0-12-15-27l-203-197 48-279q1-4 1-12 0-28-23-28-10 0-22 7l-251 132-250-132q-13-7-23-7-11 0-17 9t-6 19q0 4 1 12l48 279-203 197q-14 15-14 27 0 21 31 26l280 40 126 254q11 23 27 23t28-23l125-254 280-40q32-5 32-26z" horiz-adv-x="928.6" />
|
||||
<glyph glyph-name="star" unicode="" d="m929 489q0-12-15-27l-203-197 48-279q1-4 1-12 0-11-6-19t-17-9q-10 0-22 7l-251 132-250-132q-13-7-23-7-11 0-17 9t-6 19q0 4 1 12l48 279-203 197q-14 15-14 27 0 21 31 26l280 40 126 254q11 23 27 23t28-23l125-254 280-40q32-5 32-26z" horiz-adv-x="928.6" />
|
||||
<glyph glyph-name="clock" unicode="" d="m500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
|
||||
<glyph glyph-name="comment" unicode="" d="m1000 350q0-97-67-179t-182-130-251-48q-39 0-81 4-110-97-257-135-27-8-63-12-10-1-17 5t-10 16v1q-2 2 0 6t1 6 2 5l4 5t4 5 4 5q4 5 17 19t20 22 17 22 18 28 15 33 15 42q-88 50-138 123t-51 157q0 73 40 139t106 114 160 76 194 28q136 0 251-48t182-130 67-179z" horiz-adv-x="1000" />
|
||||
<glyph glyph-name="align-left" unicode="" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-714q-15 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-857q-15 0-25 11t-11 25v72q0 14 11 25t25 10h857q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-643q-15 0-25 10t-11 25v72q0 14 11 25t25 11h643q14 0 25-11t10-25z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="print" unicode="" d="M214-7h500v143h-500v-143z m0 357h500v214h-89q-22 0-38 16t-16 38v89h-357v-357z m643-36q0 15-10 25t-26 11-25-11-10-25 10-25 25-10 26 10 10 25z m72 0v-232q0-7-6-12t-12-6h-125v-89q0-22-16-38t-38-16h-536q-22 0-37 16t-16 38v89h-125q-7 0-13 6t-5 12v232q0 44 32 76t75 31h36v304q0 22 16 38t37 16h375q23 0 50-12t42-26l85-85q15-16 27-43t11-49v-143h35q45 0 76-31t32-76z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="doc" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="file-pdf" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-287 331q18-14 47-31 33 4 65 4 82 0 99-27 9-13 1-29 0-1-1-1l-1-2v0q-3-21-39-21-27 0-64 11t-73 29q-123-13-219-46-85-146-135-146-8 0-15 4l-14 7q0 0-3 2-6 6-4 20 5 23 32 51t73 54q8 5 13-3 1-1 1-2 29 47 60 110 38 76 58 146-13 46-17 89t4 71q6 22 23 22h12q13 0 20-8 10-12 5-38-1-3-2-4 0-2 0-5v-17q-1-68-8-107 31-91 82-133z m-321-229q29 13 76 88-29-22-49-47t-27-41z m222 513q-9-23-2-73 1 4 4 24 0 2 4 24 1 3 3 5-1 0-1 1-1 1-1 2 0 12-7 20 0-1 0-1v-2z m-70-368q76 30 159 45-1 0-7 5t-9 8q-43 37-71 98-15-48-46-110-17-31-26-46z m361 9q-13 13-78 13 42-16 69-16 8 0 10 1 0 0-1 2z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="file-word" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-656 500v-59h39l92-369h88l72 271q4 11 5 25 2 9 2 14h2l1-14q1-1 2-11t3-14l72-271h89l91 369h39v59h-167v-59h50l-55-245q-3-11-4-25l-1-12h-3q0 2 0 4t-1 4 0 4q-1 2-2 11t-3 14l-81 304h-63l-81-304q-1-5-2-13t-2-12l-2-12h-2l-2 12q-1 14-3 25l-56 245h50v59h-167z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="file-excel" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-547 131v-59h157v59h-42l58 90q3 4 5 9t5 8 2 2h1q0-2 3-6 1-2 2-4t3-4 4-5l60-90h-43v-59h163v59h-38l-107 152 108 158h38v59h-156v-59h41l-57-89q-2-4-6-9t-5-8l-1-1h-1q0 2-3 5-3 6-9 13l-59 89h42v59h-162v-59h38l106-152-109-158h-38z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="file-powerpoint" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-554 131v-59h183v59h-52v93h76q43 0 66 9 37 12 60 48t22 82q0 45-21 78t-56 49q-27 10-72 10h-206v-59h52v-310h-52z m197 156h-66v150h67q29 0 46-10 31-19 31-64 0-50-34-67-18-9-44-9z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="file-image" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-72 250v-178h-571v107l107 107 71-71 215 214z m-464 108q-45 0-76 31t-31 76 31 76 76 31 76-31 31-76-31-76-76-31z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="users" unicode="" d="M331 350q-90-3-148-71h-75q-45 0-77 22t-31 66q0 197 69 197 4 0 25-11t54-24 66-12q38 0 75 13-3-21-3-37 0-78 45-143z m598-356q0-66-41-105t-108-39h-488q-68 0-108 39t-41 105q0 30 2 58t8 61 14 61 24 54 35 45 48 30 62 11q6 0 24-12t41-26 59-27 76-12 75 12 60 27 41 26 24 12q34 0 62-11t47-30 35-45 24-54 15-61 8-61 2-58z m-572 713q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z m393-214q0-89-63-152t-151-62-152 62-63 152 63 151 152 63 151-63 63-151z m321-126q0-43-31-66t-77-22h-75q-57 68-147 71 45 65 45 143 0 16-3 37 37-13 74-13 33 0 67 12t54 24 24 11q69 0 69-197z m-71 340q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z" horiz-adv-x="1071.4" />
|
||||
|
||||
<glyph glyph-name="user" unicode="" d="M714 69q0-60-35-104t-84-44h-476q-49 0-84 44t-35 104q0 48 5 90t17 85 33 73 52 50 76 19q73-72 174-72t175 72q42 0 75-19t52-50 33-73 18-85 4-90z m-143 495q0-88-62-151t-152-63-151 63-63 151 63 152 151 63 152-63 62-152z" horiz-adv-x="714.3" />
|
||||
|
||||
<glyph glyph-name="mail" unicode="" d="M929 11v428q-18-20-39-36-149-115-238-189-28-24-46-37t-48-28-57-13h-2q-26 0-57 13t-48 28-46 37q-88 74-238 189-21 16-39 36v-428q0-7 6-13t12-5h822q7 0 12 5t6 13z m0 586v14t-1 7-1 7-3 5-5 4-8 2h-822q-7 0-12-6t-6-12q0-94 83-159 107-84 223-176 4-3 20-17t25-21 25-17 28-16 24-5h2q11 0 24 5t28 16 25 17 25 21 20 17q116 92 224 176 30 24 56 65t26 73z m71 21v-607q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63v607q0 37 26 63t63 26h822q37 0 63-26t26-63z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="videocam" unicode="" d="M1000 654v-608q0-23-22-32-7-3-14-3-15 0-25 10l-225 225v-92q0-67-47-114t-113-47h-393q-67 0-114 47t-47 114v392q0 67 47 114t114 47h393q66 0 113-47t47-114v-92l225 225q10 10 25 10 7 0 14-2 22-10 22-33z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="picture" unicode="" d="M357 529q0-45-31-76t-76-32-76 32-31 76 31 76 76 31 76-31 31-76z m572-215v-250h-786v107l178 179 90-89 285 285z m53 393h-893q-7 0-12-5t-6-13v-678q0-7 6-13t12-5h893q7 0 13 5t5 13v678q0 8-5 13t-13 5z m89-18v-678q0-37-26-63t-63-27h-893q-36 0-63 27t-26 63v678q0 37 26 63t63 27h893q37 0 63-27t26-63z" horiz-adv-x="1071.4" />
|
||||
|
||||
<glyph glyph-name="eye-off" unicode="" d="M310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-91l157 280q4-25 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-85t81-103q11-19 11-39z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="spinner" unicode="" d="M294 72q0-29-21-50t-51-21q-29 0-50 21t-21 50q0 30 21 51t50 21 51-21 21-51z m277-115q0-29-20-50t-51-21-50 21-21 50 21 51 50 21 51-21 20-51z m-392 393q0-30-21-50t-51-21-50 21-21 50 21 51 50 20 51-20 21-51z m670-278q0-29-21-50t-50-21q-30 0-51 21t-20 50 20 51 51 21 50-21 21-51z m-538 556q0-37-26-63t-63-26-63 26-26 63 26 63 63 26 63-26 26-63z m653-278q0-30-21-50t-50-21-51 21-21 50 21 51 51 20 50-20 21-51z m-357 393q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m296-115q0-52-37-88t-88-37q-52 0-88 37t-37 88q0 51 37 88t88 37q51 0 88-37t37-88z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="align-center" unicode="" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m-214 214v-71q0-15-11-25t-25-11h-500q-14 0-25 11t-11 25v71q0 15 11 25t25 11h500q15 0 25-11t11-25z m143 215v-72q0-14-11-25t-25-11h-786q-14 0-25 11t-11 25v72q0 14 11 25t25 10h786q14 0 25-10t11-25z m-215 214v-72q0-14-10-25t-25-10h-358q-14 0-25 10t-10 25v72q0 14 10 25t25 11h358q14 0 25-11t10-25z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="align-right" unicode="" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 214v-71q0-15-11-25t-25-11h-714q-14 0-25 11t-11 25v71q0 15 11 25t25 11h714q15 0 25-11t11-25z m0 215v-72q0-14-11-25t-25-11h-857q-14 0-25 11t-11 25v72q0 14 11 25t25 10h857q15 0 25-10t11-25z m0 214v-72q0-14-11-25t-25-10h-643q-14 0-25 10t-10 25v72q0 14 10 25t25 11h643q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="align-justify" unicode="" d="M1000 100v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 214v-71q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v71q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 215v-72q0-14-11-25t-25-11h-928q-15 0-25 11t-11 25v72q0 14 11 25t25 10h928q15 0 25-10t11-25z m0 214v-72q0-14-11-25t-25-10h-928q-15 0-25 10t-11 25v72q0 14 11 25t25 11h928q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="list" unicode="" d="M143 118v-107q0-7-5-13t-13-5h-107q-7 0-13 5t-5 13v107q0 7 5 12t13 6h107q7 0 13-6t5-12z m0 214v-107q0-7-5-13t-13-5h-107q-7 0-13 5t-5 13v107q0 7 5 13t13 5h107q7 0 13-5t5-13z m0 214v-107q0-7-5-12t-13-6h-107q-7 0-13 6t-5 12v107q0 8 5 13t13 5h107q7 0 13-5t5-13z m857-428v-107q0-7-5-13t-13-5h-750q-7 0-12 5t-6 13v107q0 7 6 12t12 6h750q7 0 13-6t5-12z m-857 643v-107q0-8-5-13t-13-5h-107q-7 0-13 5t-5 13v107q0 7 5 12t13 6h107q7 0 13-6t5-12z m857-429v-107q0-7-5-13t-13-5h-750q-7 0-12 5t-6 13v107q0 7 6 13t12 5h750q7 0 13-5t5-13z m0 214v-107q0-7-5-12t-13-6h-750q-7 0-12 6t-6 12v107q0 8 6 13t12 5h750q7 0 13-5t5-13z m0 215v-107q0-8-5-13t-13-5h-750q-7 0-12 5t-6 13v107q0 7 6 12t12 6h750q7 0 13-6t5-12z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="indent-left" unicode="" d="M214 546v-321q0-7-5-13t-13-5q-7 0-12 5l-161 161q-5 5-5 13t5 13l161 160q5 5 12 5 8 0 13-5t5-13z m786-428v-107q0-7-5-13t-13-5h-964q-7 0-13 5t-5 13v107q0 7 5 12t13 6h964q7 0 13-6t5-12z m0 214v-107q0-7-5-13t-13-5h-607q-7 0-13 5t-5 13v107q0 7 5 13t13 5h607q7 0 13-5t5-13z m0 214v-107q0-7-5-12t-13-6h-607q-7 0-13 6t-5 12v107q0 8 5 13t13 5h607q7 0 13-5t5-13z m0 215v-107q0-8-5-13t-13-5h-964q-7 0-13 5t-5 13v107q0 7 5 12t13 6h964q7 0 13-6t5-12z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="indent-right" unicode="" d="M196 386q0-8-5-13l-160-161q-5-5-13-5-7 0-13 5t-5 13v321q0 8 5 13t13 5q8 0 13-5l160-160q5-5 5-13z m804-268v-107q0-7-5-13t-13-5h-964q-7 0-13 5t-5 13v107q0 7 5 12t13 6h964q7 0 13-6t5-12z m0 214v-107q0-7-5-13t-13-5h-607q-7 0-13 5t-5 13v107q0 7 5 13t13 5h607q7 0 13-5t5-13z m0 214v-107q0-7-5-12t-13-6h-607q-7 0-13 6t-5 12v107q0 8 5 13t13 5h607q7 0 13-5t5-13z m0 215v-107q0-8-5-13t-13-5h-964q-7 0-13 5t-5 13v107q0 7 5 12t13 6h964q7 0 13-6t5-12z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="list-bullet" unicode="" d="M214 64q0-44-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m0 286q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m786-232v-107q0-7-5-13t-13-5h-678q-8 0-13 5t-5 13v107q0 7 5 12t13 6h678q7 0 13-6t5-12z m-786 518q0-45-31-76t-76-31-76 31-31 76 31 76 76 31 76-31 31-76z m786-232v-108q0-7-5-12t-13-5h-678q-8 0-13 5t-5 12v108q0 7 5 12t13 5h678q7 0 13-5t5-12z m0 285v-107q0-7-5-12t-13-6h-678q-8 0-13 6t-5 12v107q0 8 5 13t13 5h678q7 0 13-5t5-13z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="list-numbered" unicode="" d="M213-54q0-45-31-70t-75-26q-60 0-96 37l31 49q28-25 60-25 16 0 28 8t12 24q0 35-59 31l-14 31q4 6 18 24t24 31 20 21v1q-9 0-27-1t-27 0v-30h-59v85h186v-49l-53-65q28-6 45-27t17-49z m1 350v-89h-202q-4 20-4 30 0 29 14 52t31 38 37 27 31 24 14 25q0 14-9 22t-22 7q-25 0-45-32l-47 33q13 28 40 44t59 16q40 0 68-23t28-63q0-28-19-51t-42-36-42-28-20-30h71v34h59z m786-178v-107q0-7-5-13t-13-5h-678q-8 0-13 5t-5 13v107q0 8 5 13t13 5h678q7 0 13-6t5-12z m-786 502v-56h-187v56h60q0 22 0 67t1 68v7h-1q-5-10-28-30l-40 42 76 71h59v-225h60z m786-216v-108q0-7-5-12t-13-5h-678q-8 0-13 5t-5 12v108q0 7 5 12t13 5h678q7 0 13-5t5-12z m0 285v-107q0-7-5-12t-13-6h-678q-8 0-13 6t-5 12v107q0 8 5 13t13 5h678q7 0 13-5t5-13z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="underline" unicode="" d="M27 726q-21 1-25 2l-2 49q7 1 22 1 34 0 63-3 74-4 93-4 47 0 93 2 65 2 82 3 31 0 48 1l-1-8 1-36v-5q-33-5-69-5-33 0-44-14-7-7-7-73 0-7 0-18t0-15l1-127 8-157q3-69 28-112 20-33 54-52 49-26 98-26 59 0 107 16 31 10 55 28 27 20 37 36 20 31 29 63 12 41 12 128 0 44-2 72t-6 68-8 89l-2 33q-3 37-13 49-19 20-43 19l-56-1-8 2 1 48h47l114-6q43-2 110 6l10-1q3-22 3-29 0-4-2-17-25-7-47-8-41-6-44-9-8-8-8-23 0-4 0-15t1-17q5-11 13-221 3-109-9-170-8-42-23-68-21-36-62-69-42-31-102-49-61-19-142-19-93 0-159 26-66 26-99 68-34 42-47 109-9 45-9 132v186q0 105-9 119-14 20-82 22z m830-787v36q0 8-5 13t-13 5h-821q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h821q8 0 13 5t5 13z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="strike" unicode="" d="M982 350q8 0 13-5t5-13v-36q0-7-5-12t-13-5h-964q-8 0-13 5t-5 12v36q0 8 5 13t13 5h964z m-712 36q-16 19-29 44-27 55-27 105 0 101 75 173 74 71 219 71 28 0 94-11 36-7 98-27 6-21 12-66 8-68 8-102 0-10-3-25l-7-2-46 4-8 1q-28 83-58 114-49 51-117 51-64 0-101-33-38-32-38-81 0-41 37-78t156-72q38-12 96-37 33-16 53-29h-414z m283-143h229q4-22 4-51 0-62-23-119-13-31-40-58-20-19-61-45-44-27-85-37-45-12-113-12-64 0-109 13l-78 23q-32 8-40 15-5 5-5 12v8q0 60-1 87 0 17 0 38l1 20v25l57 1q8-19 17-40t12-31 7-15q20-32 45-52 24-20 59-32 33-12 73-12 36 0 78 15 43 14 68 48 26 34 26 72 0 47-45 87-19 16-76 40z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="superscript" unicode="" d="M501 86v-93h-139l-89 141-13 23q-4 5-6 12h-2q0-2-1-4t-2-4-2-4q-5-11-14-25l-86-139h-144v93h71l110 162-103 152h-76v94h154l77-127q1-2 13-24 4-5 6-11h2q1 5 6 11l14 24 78 127h143v-94h-69l-103-149 114-165h61z m355 379v-115h-287l-1 15q-3 16-3 26 0 36 15 65t36 48 47 37 47 30 36 30 15 36q0 21-17 35t-39 13q-29 0-54-21-8-6-20-22l-59 52q15 20 35 37 47 36 105 36 61 0 99-33t38-89q0-31-13-57t-35-43-45-33-46-28-37-28-17-36h130v45h70z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="subscript" unicode="" d="M501 86v-93h-139l-89 141-13 23q-4 5-6 12h-2q0-2-1-4t-2-4-2-4q-5-11-14-25l-86-139h-144v93h71l110 162-103 152h-76v94h154l77-127q1-2 13-24 4-5 6-11h2q1 5 6 11l14 24 78 127h143v-94h-69l-103-149 114-165h61z m356-121v-115h-287l-2 15q-2 25-2 26 0 35 15 65t36 48 47 37 47 30 36 30 15 36q0 21-17 35t-39 13q-28 0-54-21-8-6-20-22l-59 52q15 20 35 37 45 36 105 36 62 0 100-33t37-89q0-37-19-66t-47-48-55-35-49-35-23-41h130v45h70z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="font" unicode="" d="M405 538l-95-251q18 0 76-1t89-1q11 0 32 1-48 141-102 252z m-405-617l1 44q13 4 31 7t32 6 28 8 25 17 17 28l132 344 156 404h72q4-8 6-12l114-268q19-43 60-144t63-153q9-19 33-80t40-94q11-26 19-32 11-9 49-17t47-11q4-22 4-32 0-3-1-8t0-7q-35 0-106 5t-107 4q-42 0-120-4t-99-4q0 24 2 43l73 16q1 0 7 1t9 2 8 3 9 4 6 4 5 6 1 8q0 9-17 54t-40 99-24 56l-251 1q-14-32-43-109t-28-91q0-12 8-21t24-14 27-7 32-5 23-2q1-11 1-32 0-5-1-16-33 0-98 6t-97 6q-5 0-15-3t-12-2q-45-8-105-8z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="bold" unicode="" d="M310 1q41-18 78-18 210 0 210 187 0 64-23 101-15 24-34 41t-38 26-45 14-47 6-53 1q-40 0-56-6 0-29 0-88t-1-88q0-5 0-38t0-54 2-47 7-37z m-8 417q23-4 61-4 46 0 80 7t61 25 42 50 14 79q0 39-16 68t-45 46-60 24-69 8q-28 0-73-7 0-28 3-84t2-85q0-15 0-45t-1-44q0-26 1-38z m-302-497l1 53q9 2 48 9t59 15q4 7 7 15t4 19 4 18 1 21 0 19v36q0 548-12 572-2 5-12 8t-25 6-28 4-27 3-17 2l-2 46q55 1 190 6t208 6q13 0 38-1t38 0q39 0 76-7t72-24 60-39 41-59 16-76q0-29-9-54t-22-40-36-32-41-25-47-22q86-20 144-75t57-138q0-56-20-101t-52-72-77-48-91-27-98-8q-25 0-74 2t-74 1q-59 0-171-6t-129-7z" horiz-adv-x="785.7" />
|
||||
|
||||
<glyph glyph-name="italic" unicode="" d="M0-78l10 48q12 4 34 9t40 11 33 13q16 19 23 56 1 4 35 162t63 303 29 165v14q-13 8-30 11t-39 4-32 3l10 58q19-1 67-4t84-4 67-1q27 0 55 1t68 4 54 4q-2-22-10-50-17-6-57-16t-60-19q-5-10-8-23t-5-23-4-25-4-24q-15-82-49-234t-43-198q-1-5-7-32t-11-51-9-46-4-32l1-10q9-3 103-18-2-24-9-55-6 0-18-1t-18-1q-16 0-49 6t-48 6q-77 1-115 1-28 0-79-5t-68-7z" horiz-adv-x="571.4" />
|
||||
|
||||
<glyph glyph-name="header" unicode="" d="M939-79q-25 0-74 2t-75 2q-24 0-73-2t-74-2q-13 0-21 12t-7 25q0 18 9 26t22 9 29 4 25 9q18 11 18 78l0 218q0 12-1 17-7 3-28 3h-376q-22 0-29-3 0-5 0-17l-1-207q0-79 21-91 9-6 26-8t32-2 25-8 11-26q0-14-6-26t-21-13q-26 0-78 2t-77 2q-24 0-71-2t-71-2q-13 0-20 12t-7 25q0 17 9 25t20 10 26 4 24 9q18 13 18 80l-1 31v454q0 2 1 15t0 20-1 21-2 24-4 20-6 18-9 10q-8 5-25 7t-29 1-23 7-10 26q0 14 6 26t20 13q26 0 78-2t77-2q23 0 71 2t70 2q14 0 21-13t7-26q0-17-9-25t-22-8-27-2-24-7q-20-12-20-90l1-178q0-12 0-18 7-2 22-2h390q14 0 21 2 1 6 1 18l0 178q0 78-19 90-10 6-33 7t-37 7-14 28q0 14 7 26t21 13q24 0 74-2t73-2q24 0 72 2t72 2q14 0 21-13t7-26q0-17-10-25t-22-8-29-2-24-7q-20-13-20-90l1-526q0-66 19-78 9-6 25-8t30-2 23-9 10-25q0-14-6-26t-20-13z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="text-height" unicode="" d="M973 64q19 0 24-10t-6-25l-71-90q-11-15-27-15t-27 15l-71 90q-11 15-6 25t24 10h44v572h-44q-19 0-24 10t6 25l71 90q11 15 27 15t27-15l71-90q11-15 6-25t-24-10h-44v-572h44z m-928 714l30-15q7-3 118-3 25 0 74 1t73 1q21 0 60 0t60 0h164q3 0 12 0t11 0 9 1 10 5 8 10l24 1q2 0 7-1t8 0q1-62 1-187 0-45-2-61-22-8-38-10-14 24-31 71-1 5-6 27t-8 41-4 20q-3 4-7 7t-8 3-8 1-10 1-9-1q-9 0-37 1t-41 0-36-1-40-3q-5-46-4-76 0-53 1-217t1-254q0-9-1-40t0-51 7-38q22-12 69-24t67-21q2-22 2-28 0-8-1-16l-19-1q-43-1-122 5t-115 5q-28 0-85-5t-84-5q-2 29-2 29v5q9 15 34 24t55 17 44 15q10 23 10 213 0 57-1 170t-2 169v65q0 1 0 9t1 14-1 14-2 13-2 8q-7 7-91 7-18 0-52-7t-44-15q-11-7-19-40t-18-62-24-30q-23 15-31 25v214z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="text-width" unicode="" d="M45 778l30-15q7-3 118-3 25 0 74 1t73 1q40 0 138 1t170 0 138-2q18-1 31 17l23 1q3 0 8-1t8 0q1-62 1-187 0-45-3-61-21-8-38-10-13 24-30 71-1 5-6 27t-8 41-4 20q-6 7-15 10-3 1-37 1-17 0-52 1t-57 1-53-2-53-3q-5-46-5-76l1-85v29q0-31 0-86t1-101 0-85q0-9-1-40t0-51 7-38q22-12 69-24t67-21q3-22 3-28 0-8-2-16l-19-1q-42-1-121 5t-116 5q-28 0-84-5t-85-5q-2 29-2 29v5q10 15 35 24t55 17 43 15q4 9 7 41t3 81 1 87-1 85 0 50q0 4-1 12t-2 12q0 4 1 25t0 41 0 42-1 38-4 18q-6 7-90 7-23 0-91-8t-77-14q-11-6-19-39t-18-63-24-30q-23 15-31 25v214z m686-715q7 0 24-11t32-23 33-28 20-17q14-11 14-27t-14-27q-2-2-20-17t-33-27-32-23-24-11q-7 0-11 5t-6 16-1 19 0 18 1 11h-571q0-1 1-11t1-18-2-19-5-16-12-5q-7 0-23 11t-32 23-34 27-20 17q-14 11-14 27t14 27q3 2 20 17t34 28 32 23 23 11q7 0 12-6t5-16 2-19-1-18-1-11h571q0 1-1 11t0 18 1 19 6 16 11 6z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="to-start" unicode="" d="M546 771q11 11 18 8t7-18v-822q0-14-7-18t-18 8l-396 396q-5 5-7 11v-379q0-14-11-25t-25-11h-71q-15 0-25 11t-11 25v786q0 14 11 25t25 11h71q15 0 25-11t11-25v-378q2 5 7 10z" horiz-adv-x="571.4" />
|
||||
|
||||
<glyph glyph-name="to-end" unicode="" d="M25-71q-10-11-18-8t-7 18v822q0 14 7 18t18-8l396-396q5-5 8-10v378q0 14 10 25t25 11h72q14 0 25-11t10-25v-786q0-14-10-25t-25-11h-72q-14 0-25 11t-10 25v379q-3-6-8-11z" horiz-adv-x="571.4" />
|
||||
|
||||
<glyph glyph-name="ccw" unicode="" d="M857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="cw" unicode="" d="M857 707v-250q0-14-10-25t-26-11h-250q-23 0-32 23-10 22 7 38l77 77q-82 77-194 77-58 0-111-23t-91-61-61-91-23-111 23-111 61-91 91-61 111-23q66 0 125 29t100 82q4 6 13 7 8 0 14-5l76-77q5-4 6-11t-5-13q-60-74-147-114t-182-41q-87 0-167 34t-136 92-92 137-34 166 34 166 92 137 136 92 167 34q82 0 158-31t137-88l72 72q17 18 39 8 22-9 22-33z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="arrows-cw" unicode="" d="M843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-36 90-57t105-20q74 0 139 37t104 99q6 10 30 66 4 13 16 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="file-code" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-518 500q4 7 12 7t13-3l28-21q7-5 7-12t-3-13l-102-136 102-136q4-6 3-13t-7-12l-28-21q-6-4-13-4t-12 7l-126 168q-8 11 0 22z m447-167q8-11 0-22l-126-168q-4-6-11-7t-14 4l-28 21q-6 5-7 12t3 13l102 136-102 136q-4 6-3 13t7 12l28 21q6 4 14 3t11-7z m-346-258q-7 1-11 8t-3 13l77 464q1 7 7 11t14 3l35-5q7-2 11-8t3-13l-77-464q-1-7-7-11t-13-3z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="code" unicode="" d="M344 69l-28-28q-5-5-12-5t-13 5l-260 261q-6 5-6 12t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13t-6-13z m330 596l-208-721q-2-7-9-11t-13-1l-34 9q-8 3-11 9t-2 14l209 720q2 8 8 11t13 2l35-10q7-2 11-9t1-13z m367-363l-260-261q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13t-5-12z" horiz-adv-x="1071.4" />
|
||||
|
||||
<glyph glyph-name="chat" unicode="" d="M786 421q0-77-53-143t-143-104-197-38q-48 0-98 9-70-49-155-72-21-5-48-9h-2q-6 0-12 5t-6 12q-1 1-1 3t1 4 1 3l1 3t2 3 2 3 3 3 2 2q3 3 13 14t15 16 12 17 14 21 11 25q-69 40-108 98t-40 125q0 78 53 144t143 104 197 38 197-38 143-104 53-144z m214-142q0-67-40-126t-108-98q5-14 11-25t14-21 13-16 14-17 13-14q0 0 2-2t3-3 2-3 2-3l1-3t1-3 1-4-1-3q-2-8-7-13t-12-4q-28 4-48 9-86 23-156 72-50-9-98-9-151 0-263 74 32-3 49-3 90 0 172 25t148 72q69 52 107 119t37 141q0 43-13 85 72-39 114-99t42-128z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="comment-empty" unicode="" d="M500 636q-114 0-213-39t-157-105-59-142q0-62 40-119t113-98l48-28-15-53q-13-51-39-97 85 36 154 96l24 21 32-3q38-5 72-5 114 0 213 39t157 105 59 142-59 142-157 105-213 39z m500-286q0-97-67-179t-182-130-251-48q-39 0-81 4-110-97-257-135-27-8-63-12h-3q-8 0-15 6t-9 15v1q-2 2 0 6t1 6 2 5l4 5t4 5 4 5q4 5 17 19t20 22 17 22 18 28 15 33 15 42q-88 50-138 123t-51 157q0 97 67 179t182 130 251 48 251-48 182-130 67-179z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="trash-empty" unicode="" d="M286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q23 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
|
||||
|
||||
<glyph glyph-name="mic" unicode="" d="M643 457v-71q0-124-82-215t-204-104v-74h143q15 0 25-11t11-25-11-25-25-11h-357q-15 0-25 11t-11 25 11 25 25 11h143v74q-121 13-204 104t-82 215v71q0 15 11 25t25 11 25-11 10-25v-71q0-103 74-177t176-73 177 73 73 177v71q0 15 11 25t25 11 25-11 11-25z m-143 214v-285q0-74-52-126t-127-53-126 53-52 126v285q0 74 52 127t126 52 127-52 52-127z" horiz-adv-x="642.9" />
|
||||
|
||||
<glyph glyph-name="play" unicode="" d="M772 333l-741-412q-13-7-22-2t-9 20v822q0 14 9 20t22-2l741-412q13-7 13-17t-13-17z" horiz-adv-x="785.7" />
|
||||
|
||||
<glyph glyph-name="stop" unicode="" d="M857 743v-786q0-14-10-25t-26-11h-785q-15 0-25 11t-11 25v786q0 14 11 25t25 11h785q15 0 26-11t10-25z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="pause" unicode="" d="M857 743v-786q0-14-10-25t-26-11h-285q-15 0-25 11t-11 25v786q0 14 11 25t25 11h285q15 0 26-11t10-25z m-500 0v-786q0-14-10-25t-26-11h-285q-15 0-25 11t-11 25v786q0 14 11 25t25 11h285q15 0 26-11t10-25z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="gauge" unicode="" d="M214 207q0 30-21 51t-50 21-51-21-21-51 21-50 51-21 50 21 21 50z m107 250q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m239-268l57 213q3 14-5 27t-21 16-27-3-17-22l-56-213q-33-3-60-25t-35-55q-11-43 11-81t66-50 81 11 50 66q9 33-4 65t-40 51z m369 18q0 30-21 51t-51 21-50-21-21-51 21-50 50-21 51 21 21 50z m-358 357q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m250-107q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m179-250q0-145-79-269-10-17-30-17h-782q-20 0-30 17-79 123-79 269 0 102 40 194t106 160 160 107 194 39 194-39 160-107 106-160 40-194z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="brush" unicode="" d="M901 850q39 0 69-26t29-65q0-35-25-84-185-351-260-420-54-51-121-51-71 0-121 52t-51 123q0 71 52 118l356 323q33 30 72 30z m-507-577q22-42 59-73t84-42l1-40q2-118-72-193t-195-75q-68 0-121 26t-85 71-49 102-16 123q4-3 23-17t35-25 32-20 26-9q23 0 31 20 14 37 32 63t39 42 49 27 57 14 70 6z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="slideshare" unicode="" d="M487 437q0-46-35-79t-85-34-85 34-36 79q0 47 36 80t85 33 85-33 35-80z m280 0q0-46-35-79t-85-34q-50 0-85 34t-36 79q0 47 36 80t85 33q50 0 85-33t35-80z m126-100v372q0 48-18 69t-62 20h-620q-47 0-63-19t-17-70v-376q24-13 50-22t45-16 45-10 40-6 39-2 32-1 32 2 25 1q38 0 53-15 3-4 5-5 15-14 34-29 4 51 66 49 3 0 21-1t24-1 25-1 30 1 30 2 34 5 35 7 37 11 38 15 40 20z m91 2q-68-83-208-140 47-159-13-260-36-63-102-82-58-18-101 8-48 28-46 92l-1 182v0q-4 1-13 3t-13 3l-1-188q2-64-46-92-44-26-102-8-66 20-102 83-58 101-12 259-140 57-208 140-14 21-2 36t33-1q3-1 7-4t6-4v387q0 40 26 69t64 28h701q37 0 64-28t26-69v-387l12 8q21 15 33 1t-2-36z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="tasks" unicode="" d="M571 64h358v72h-358v-72z m-214 286h572v71h-572v-71z m357 286h215v71h-215v-71z m286-465v-142q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v142q0 15 11 26t25 10h928q15 0 25-10t11-26z m0 286v-143q0-14-11-25t-25-10h-928q-15 0-25 10t-11 25v143q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 286v-143q0-14-11-25t-25-11h-928q-15 0-25 11t-11 25v143q0 14 11 25t25 11h928q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="cog" unicode="" d="M571 350q0 59-41 101t-101 42-101-42-42-101 42-101 101-42 101 42 41 101z m286 61v-124q0-7-4-13t-11-7l-104-16q-10-30-21-51 19-27 59-77 6-6 6-13t-5-13q-15-21-55-61t-53-39q-7 0-14 5l-77 60q-25-13-51-21-9-76-16-104-4-16-20-16h-124q-8 0-14 5t-6 12l-16 103q-27 9-50 21l-79-60q-6-5-14-5-8 0-14 6-70 64-92 94-4 5-4 13 0 6 5 12 8 12 28 37t30 40q-15 28-23 55l-102 15q-7 1-11 7t-5 13v124q0 7 5 13t10 7l104 16q8 25 22 51-23 32-60 77-6 7-6 14 0 5 5 12 15 20 55 60t53 40q7 0 15-5l77-60q24 13 50 21 9 76 17 104 3 16 20 16h124q7 0 13-5t7-12l15-103q28-9 51-20l79 59q5 5 13 5 7 0 14-5 72-67 92-95 4-5 4-12 0-7-4-13-9-12-29-37t-30-40q15-28 23-54l102-16q7-1 12-7t4-13z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="exchange" unicode="" d="M1000 189v-107q0-7-5-12t-13-6h-768v-107q0-7-5-12t-13-6q-6 0-13 6l-178 178q-5 6-5 13 0 8 5 13l179 178q5 5 12 5 8 0 13-5t5-13v-107h768q7 0 13-5t5-13z m0 304q0-8-5-13l-179-178q-5-6-12-6-8 0-13 6t-5 12v107h-768q-7 0-13 6t-5 12v107q0 8 5 13t13 5h768v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="star-empty" unicode="" d="M635 290l170 166-235 34-106 213-105-213-236-34 171-166-41-235 211 111 211-111z m294 199q0-12-15-27l-202-197 48-279q0-4 0-12 0-28-23-28-10 0-22 7l-251 132-250-132q-12-7-23-7-11 0-17 9t-6 19q0 4 1 12l48 279-203 197q-14 15-14 27 0 21 31 26l280 40 126 254q11 23 27 23t28-23l125-254 280-40q32-5 32-26z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="star" unicode="" d="M929 489q0-12-15-27l-202-197 48-279q0-4 0-12 0-11-6-19t-17-9q-10 0-22 7l-251 132-250-132q-12-7-23-7-11 0-17 9t-6 19q0 4 1 12l48 279-203 197q-14 15-14 27 0 21 31 26l280 40 126 254q11 23 27 23t28-23l125-254 280-40q32-5 32-26z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="clock" unicode="" d="M500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="comment" unicode="" d="M1000 350q0-97-67-179t-182-130-251-48q-39 0-81 4-110-97-257-135-27-8-63-12-10-1-17 5t-10 16v1q-2 2 0 6t1 6 2 5l4 5t4 5 4 5q4 5 17 19t20 22 17 22 18 28 15 33 15 42q-88 50-138 123t-51 157q0 73 40 139t106 114 160 76 194 28q136 0 251-48t182-130 67-179z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="pencil" unicode="" d="M203-7l50 51-131 131-51-51v-60h72v-71h60z m291 518q0 12-12 12-5 0-9-4l-303-302q-4-4-4-10 0-12 13-12 5 0 9 4l303 302q3 4 3 10z m-30 107l232-232-464-465h-232v233z m381-54q0-29-20-50l-93-93-232 233 93 92q20 21 50 21 29 0 51-21l131-131q20-22 20-51z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="link" unicode="" d="M813 171q0 23-16 38l-116 116q-16 16-38 16-24 0-40-18 1-1 10-10t12-12 9-11 7-14 2-15q0-23-16-38t-38-16q-8 0-15 2t-14 7-11 9-12 12-10 10q-19-17-19-40 0-23 16-38l115-116q15-15 38-15 22 0 38 15l82 81q16 16 16 37z m-393 394q0 22-15 38l-115 115q-16 16-38 16-22 0-38-15l-82-82q-16-15-16-37 0-22 16-38l116-116q15-15 38-15 23 0 40 17-2 2-11 11t-12 12-8 10-7 14-2 16q0 22 15 38t38 15q9 0 16-2t14-7 11-8 12-12 10-11q18 17 18 41z m500-394q0-66-48-113l-82-81q-46-47-113-47-68 0-114 48l-115 115q-46 47-46 114 0 68 49 116l-49 49q-48-49-116-49-67 0-114 47l-116 116q-47 47-47 114t47 113l82 82q47 46 114 46 67 0 114-47l115-116q46-46 46-113 0-69-49-117l49-49q48 49 116 49 67 0 114-47l116-116q47-47 47-114z" horiz-adv-x="928.6" />
|
||||
|
||||
<glyph glyph-name="table" unicode="" d="M286 82v107q0 8-5 13t-13 5h-179q-7 0-12-5t-6-13v-107q0-8 6-13t12-5h179q8 0 13 5t5 13z m0 214v108q0 7-5 12t-13 5h-179q-7 0-12-5t-6-12v-108q0-7 6-12t12-5h179q8 0 13 5t5 12z m285-214v107q0 8-5 13t-12 5h-179q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h179q7 0 12 5t5 13z m-285 429v107q0 8-5 13t-13 5h-179q-7 0-12-5t-6-13v-107q0-8 6-13t12-5h179q8 0 13 5t5 13z m285-215v108q0 7-5 12t-12 5h-179q-8 0-13-5t-5-12v-108q0-7 5-12t13-5h179q7 0 12 5t5 12z m286-214v107q0 8-5 13t-13 5h-178q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h178q8 0 13 5t5 13z m-286 429v107q0 8-5 13t-12 5h-179q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h179q7 0 12 5t5 13z m286-215v108q0 7-5 12t-13 5h-178q-8 0-13-5t-5-12v-108q0-7 5-12t13-5h178q8 0 13 5t5 12z m0 215v107q0 8-5 13t-13 5h-178q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h178q8 0 13 5t5 13z m72 178v-607q0-37-27-63t-63-26h-750q-36 0-63 26t-26 63v607q0 37 26 63t63 27h750q37 0 63-27t27-63z" horiz-adv-x="928.6" />
|
||||
</font>
|
||||
</defs>
|
||||
</svg>
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 30 KiB |
Binary file not shown.
Binary file not shown.
|
@ -186,7 +186,7 @@ function Ace2Editor()
|
|||
}
|
||||
for (var i = 0, ii = remoteFiles.length; i < ii; i++) {
|
||||
var file = remoteFiles[i];
|
||||
buffer.push('<link rel="stylesheet" type="text/css" href="' + file + '"\/>');
|
||||
buffer.push('<link rel="stylesheet" type="text/css" href="' + encodeURI(file) + '"\/>');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -230,7 +230,6 @@ function Ace2Editor()
|
|||
// disableCustomScriptsAndStyles can be used to disable loading of custom scripts
|
||||
if(!clientVars.disableCustomScriptsAndStyles){
|
||||
$$INCLUDE_CSS("../static/css/pad.css");
|
||||
$$INCLUDE_CSS("../static/custom/pad.css");
|
||||
}
|
||||
|
||||
var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){
|
||||
|
@ -240,6 +239,7 @@ function Ace2Editor()
|
|||
return '../static/plugins/' + path;
|
||||
});
|
||||
includedCSS = includedCSS.concat(additionalCSS);
|
||||
$$INCLUDE_CSS("../static/skins/" + clientVars.skinName + "/pad.css");
|
||||
|
||||
pushStyleTagsFor(iframeHTML, includedCSS);
|
||||
|
||||
|
@ -314,7 +314,6 @@ window.onload = function () {\n\
|
|||
var $$INCLUDE_CSS = function(filename) {includedCSS.push(filename)};
|
||||
$$INCLUDE_CSS("../static/css/iframe_editor.css");
|
||||
$$INCLUDE_CSS("../static/css/pad.css");
|
||||
$$INCLUDE_CSS("../static/custom/pad.css");
|
||||
|
||||
|
||||
var additionalCSS = _(hooks.callAll("aceEditorCSS")).map(function(path){
|
||||
|
@ -324,12 +323,13 @@ window.onload = function () {\n\
|
|||
return '../static/plugins/' + path }
|
||||
);
|
||||
includedCSS = includedCSS.concat(additionalCSS);
|
||||
$$INCLUDE_CSS("../static/skins/" + clientVars.skinName + "/pad.css");
|
||||
|
||||
pushStyleTagsFor(outerHTML, includedCSS);
|
||||
|
||||
// bizarrely, in FF2, a file with no "external" dependencies won't finish loading properly
|
||||
// (throbs busy while typing)
|
||||
outerHTML.push('<style type="text/css" title="dynamicsyntax"></style>', '<link rel="stylesheet" type="text/css" href="data:text/css,"/>', scriptTag(outerScript), '</head><body id="outerdocbody" class="outerdocbody"><div id="sidediv" class="sidediv"><!-- --></div><div id="linemetricsdiv">x</div></body></html>');
|
||||
outerHTML.push('<style type="text/css" title="dynamicsyntax"></style>', '<link rel="stylesheet" type="text/css" href="data:text/css,"/>', scriptTag(outerScript), '</head><body id="outerdocbody" class="outerdocbody ', hooks.clientPluginNames().join(' '),'"><div id="sidediv" class="sidediv"><!-- --></div><div id="linemetricsdiv">x</div></body></html>');
|
||||
|
||||
var outerFrame = document.createElement("IFRAME");
|
||||
outerFrame.name = "ace_outer";
|
||||
|
|
|
@ -975,9 +975,8 @@ function Ace2Inner(){
|
|||
showsuserselections: setClassPresenceNamed(root, "userSelections"),
|
||||
showslinenumbers : function(value){
|
||||
hasLineNumbers = !! value;
|
||||
// disable line numbers on mobile devices
|
||||
if (browser.mobile) hasLineNumbers = false;
|
||||
setClassPresence(sideDiv, "sidedivhidden", !hasLineNumbers);
|
||||
setClassPresence(sideDiv.parentNode, "sidediv-hidden", !hasLineNumbers);
|
||||
fixView();
|
||||
},
|
||||
grayedout: setClassPresenceNamed(outerWin.document.body, "grayedout"),
|
||||
|
@ -5404,7 +5403,7 @@ function Ace2Inner(){
|
|||
// didn't do this special case, we would miss out on any top margin
|
||||
// included on the first line. The default stylesheet doesn't add
|
||||
// extra margins/padding, but plugins might.
|
||||
h = b.nextSibling.offsetTop - window.getComputedStyle(doc.body).getPropertyValue("padding-top");
|
||||
h = b.nextSibling.offsetTop - parseInt(window.getComputedStyle(doc.body).getPropertyValue("padding-top").split('px')[0]);
|
||||
} else {
|
||||
h = b.nextSibling.offsetTop - b.offsetTop;
|
||||
}
|
||||
|
|
|
@ -314,7 +314,7 @@ function handshake()
|
|||
// If the Monospacefont value is set to true then change it to monospace.
|
||||
if (settings.useMonospaceFontGlobal == true)
|
||||
{
|
||||
pad.changeViewOption('useMonospaceFont', true);
|
||||
pad.changeViewOption('padFontFamily', 'monospace');
|
||||
}
|
||||
// if the globalUserName value is set we need to tell the server and the client about the new authorname
|
||||
if (settings.globalUserName !== false)
|
||||
|
@ -560,19 +560,7 @@ var pad = {
|
|||
if(padcookie.getPref("rtlIsTrue") == true){
|
||||
pad.changeViewOption('rtlIsTrue', true);
|
||||
}
|
||||
|
||||
|
||||
var fonts = ['useMonospaceFont', 'useMontserratFont', 'useOpenDyslexicFont', 'useComicSansFont', 'useCourierNewFont',
|
||||
'useGeorgiaFont', 'useImpactFont', 'useLucidaFont', 'useLucidaSansFont', 'usePalatinoFont', 'useRobotoMonoFont',
|
||||
'useTahomaFont', 'useTimesNewRomanFont', 'useTrebuchetFont', 'useVerdanaFont', 'useSymbolFont', 'useWebdingsFont',
|
||||
'useWingDingsFont', 'useSansSerifFont', 'useSerifFont'];
|
||||
|
||||
|
||||
$.each(fonts, function(i, font){
|
||||
if(padcookie.getPref(font) == true){
|
||||
pad.changeViewOption(font, true);
|
||||
}
|
||||
})
|
||||
pad.changeViewOption('padFontFamily', padcookie.getPref("padFontFamily"));
|
||||
|
||||
hooks.aCallAll("postAceInit", {ace: padeditor.ace, pad: pad});
|
||||
}
|
||||
|
|
|
@ -29,14 +29,6 @@ var padeditor = (function()
|
|||
var pad = undefined;
|
||||
var settings = undefined;
|
||||
|
||||
// Array of available fonts
|
||||
|
||||
var fonts = ['useMonospaceFont', 'useMontserratFont', 'useOpenDyslexicFont', 'useComicSansFont', 'useCourierNewFont',
|
||||
'useGeorgiaFont', 'useImpactFont', 'useLucidaFont', 'useLucidaSansFont', 'usePalatinoFont', 'useRobotoMonoFont',
|
||||
'useTahomaFont', 'useTimesNewRomanFont', 'useTrebuchetFont', 'useVerdanaFont', 'useSymbolFont', 'useWebdingsFont',
|
||||
'useWingDingsFont', 'useSansSerifFont', 'useSerifFont'];
|
||||
|
||||
|
||||
var self = {
|
||||
ace: null,
|
||||
// this is accessed directly from other files
|
||||
|
@ -97,12 +89,7 @@ var padeditor = (function()
|
|||
// font family change
|
||||
$("#viewfontmenu").change(function()
|
||||
{
|
||||
$.each(fonts, function(i, font){
|
||||
var sfont = font.replace("use","");
|
||||
sfont = sfont.replace("Font","");
|
||||
sfont = sfont.toLowerCase();
|
||||
pad.changeViewOption(font, $("#viewfontmenu").val() == sfont);
|
||||
});
|
||||
pad.changeViewOption('padFontFamily', $("#viewfontmenu").val());
|
||||
});
|
||||
|
||||
// Language
|
||||
|
@ -154,45 +141,29 @@ var padeditor = (function()
|
|||
self.ace.setProperty("showsauthorcolors", !settings.noColors);
|
||||
}
|
||||
|
||||
var normalFont = true;
|
||||
// Go through each font and see if the option is set..
|
||||
$.each(fonts, function(i, font){
|
||||
var isEnabled = getOption(font, false);
|
||||
if(isEnabled){
|
||||
font = font.replace("use","");
|
||||
font = font.replace("Font","");
|
||||
font = font.toLowerCase();
|
||||
if(font === "monospace") self.ace.setProperty("textface", "monospace");
|
||||
if(font === "montserrat") self.ace.setProperty("textface", "Montserrat");
|
||||
if(font === "opendyslexic") self.ace.setProperty("textface", "OpenDyslexic");
|
||||
if(font === "comicsans") self.ace.setProperty("textface", "'Comic Sans MS','Comic Sans',cursive");
|
||||
if(font === "georgia") self.ace.setProperty("textface", "Georgia,'Bitstream Charter',serif");
|
||||
if(font === "impact") self.ace.setProperty("textface", "Impact,Haettenschweiler,'Arial Black',sans-serif");
|
||||
if(font === "lucida") self.ace.setProperty("textface", "Lucida,'Lucida Serif','Lucida Bright',serif");
|
||||
if(font === "lucidasans") self.ace.setProperty("textface", "'Lucida Sans','Lucida Grande','Lucida Sans Unicode','Luxi Sans',sans-serif");
|
||||
if(font === "palatino") self.ace.setProperty("textface", "Palatino,'Palatino Linotype','URW Palladio L',Georgia,serif");
|
||||
if(font === "robotomono") self.ace.setProperty("textface", "RobotoMono");
|
||||
if(font === "tahoma") self.ace.setProperty("textface", "Tahoma,sans-serif");
|
||||
if(font === "timesnewroman") self.ace.setProperty("textface", "'Times New Roman',Times,serif");
|
||||
if(font === "trebuchet") self.ace.setProperty("textface", "'Trebuchet MS',sans-serif");
|
||||
if(font === "verdana") self.ace.setProperty("textface", "Verdana,'DejaVu Sans',sans-serif");
|
||||
if(font === "symbol") self.ace.setProperty("textface", "Symbol");
|
||||
if(font === "webdings") self.ace.setProperty("textface", "Webdings");
|
||||
if(font === "wingdings") self.ace.setProperty("textface", "Wingdings");
|
||||
if(font === "sansserif") self.ace.setProperty("textface", "sans-serif");
|
||||
if(font === "serif") self.ace.setProperty("textface", "serif");
|
||||
|
||||
// $("#viewfontmenu").val(font);
|
||||
normalFont = false;
|
||||
}
|
||||
});
|
||||
|
||||
// No font has been previously selected so use the Normal font
|
||||
if(normalFont){
|
||||
self.ace.setProperty("textface", "'Helvetica Neue',Arial, sans-serif");
|
||||
// $("#viewfontmenu").val("normal");
|
||||
var fontFamily = newOptions['padFontFamily'];
|
||||
switch (fontFamily) {
|
||||
case "monospace": self.ace.setProperty("textface", "monospace"); break;
|
||||
case "montserrat": self.ace.setProperty("textface", "Montserrat"); break;
|
||||
case "opendyslexic": self.ace.setProperty("textface", "OpenDyslexic"); break;
|
||||
case "comicsans": self.ace.setProperty("textface", "'Comic Sans MS','Comic Sans',cursive"); break;
|
||||
case "georgia": self.ace.setProperty("textface", "Georgia,'Bitstream Charter',serif"); break;
|
||||
case "impact": self.ace.setProperty("textface", "Impact,Haettenschweiler,'Arial Black',sans-serif"); break;
|
||||
case "lucida": self.ace.setProperty("textface", "Lucida,'Lucida Serif','Lucida Bright',serif"); break;
|
||||
case "lucidasans": self.ace.setProperty("textface", "'Lucida Sans','Lucida Grande','Lucida Sans Unicode','Luxi Sans',sans-serif"); break;
|
||||
case "palatino": self.ace.setProperty("textface", "Palatino,'Palatino Linotype','URW Palladio L',Georgia,serif"); break;
|
||||
case "robotomono": self.ace.setProperty("textface", "RobotoMono"); break;
|
||||
case "tahoma": self.ace.setProperty("textface", "Tahoma,sans-serif"); break;
|
||||
case "timesnewroman": self.ace.setProperty("textface", "'Times New Roman',Times,serif"); break;
|
||||
case "trebuchet": self.ace.setProperty("textface", "'Trebuchet MS',sans-serif"); break;
|
||||
case "verdana": self.ace.setProperty("textface", "Verdana,'DejaVu Sans',sans-serif"); break;
|
||||
case "symbol": self.ace.setProperty("textface", "Symbol"); break;
|
||||
case "webdings": self.ace.setProperty("textface", "Webdings"); break;
|
||||
case "wingdings": self.ace.setProperty("textface", "Wingdings"); break;
|
||||
case "sansserif": self.ace.setProperty("textface", "sans-serif"); break;
|
||||
case "serif": self.ace.setProperty("textface", "serif"); break;
|
||||
default: self.ace.setProperty("textface", ""); break;
|
||||
}
|
||||
|
||||
},
|
||||
dispose: function()
|
||||
{
|
||||
|
|
|
@ -125,3 +125,29 @@ exports.callAllStr = function(hook_name, args, sep, pre, post) {
|
|||
}
|
||||
return newCallhooks.join(sep || "");
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns an array containing the names of the installed client-side plugins
|
||||
*
|
||||
* If no client-side plugins are installed, returns an empty array.
|
||||
* Duplicate names are always discarded.
|
||||
*
|
||||
* A client-side plugin is a plugin that implements at least one client_hook
|
||||
*
|
||||
* EXAMPLE:
|
||||
* No plugins: []
|
||||
* Some plugins: [ 'ep_adminpads', 'ep_add_buttons', 'ep_activepads' ]
|
||||
*/
|
||||
exports.clientPluginNames = function() {
|
||||
if (!(exports.plugins)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
var client_plugin_names = _.uniq(
|
||||
exports.plugins.parts
|
||||
.filter(function(part) { return part.hasOwnProperty('client_hooks'); })
|
||||
.map(function(part) { return part['plugin']; })
|
||||
);
|
||||
|
||||
return client_plugin_names;
|
||||
}
|
||||
|
|
|
@ -166,25 +166,27 @@ function handleClientVars(message)
|
|||
// font family change
|
||||
$("#viewfontmenu").change(function(){
|
||||
var font = $("#viewfontmenu").val();
|
||||
if(font === "monospace") setFont("Courier new");
|
||||
if(font === "opendyslexic") setFont("OpenDyslexic");
|
||||
if(font === "comicsans") setFont("Comic Sans MS");
|
||||
if(font === "georgia") setFont("Georgia");
|
||||
if(font === "impact") setFont("Impact");
|
||||
if(font === "lucida") setFont("Lucida");
|
||||
if(font === "lucidasans") setFont("Lucida Sans Unicode");
|
||||
if(font === "palatino") setFont("Palatino Linotype");
|
||||
if(font === "tahoma") setFont("Tahoma");
|
||||
if(font === "timesnewroman") setFont("Times New Roman");
|
||||
if(font === "trebuchet") setFont("Trebuchet MS");
|
||||
if(font === "verdana") setFont("Verdana");
|
||||
if(font === "symbol") setFont("Symbol");
|
||||
if(font === "webdings") setFont("Webdings");
|
||||
if(font === "wingdings") setFont("Wingdings");
|
||||
if(font === "sansserif") setFont("MS Sans Serif");
|
||||
if(font === "serif") setFont("MS Serif");
|
||||
switch (font) {
|
||||
case "monospace": setFont("Courier new");break;
|
||||
case "opendyslexic": setFont("OpenDyslexic");break;
|
||||
case "comicsans": setFont("Comic Sans MS");break;
|
||||
case "georgia": setFont("Georgia");break;
|
||||
case "impact": setFont("Impact");break;
|
||||
case "lucida": setFont("Lucida");break;
|
||||
case "lucidasans": setFont("Lucida Sans Unicode");break;
|
||||
case "palatino": setFont("Palatino Linotype");break;
|
||||
case "tahoma": setFont("Tahoma");break;
|
||||
case "timesnewroman": setFont("Times New Roman");break;
|
||||
case "trebuchet": setFont("Trebuchet MS");break;
|
||||
case "verdana": setFont("Verdana");break;
|
||||
case "symbol": setFont("Symbol");break;
|
||||
case "webdings": setFont("Webdings");break;
|
||||
case "wingdings": setFont("Wingdings");break;
|
||||
case "sansserif": setFont("MS Sans Serif");break;
|
||||
case "serif": setFont("MS Serif");break;
|
||||
default: setFont("");break;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function setFont(font){
|
||||
|
|
BIN
src/static/skins/colibris/images/fond.jpg
Normal file
BIN
src/static/skins/colibris/images/fond.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 182 KiB |
BIN
src/static/skins/colibris/images/screenshot.png
Normal file
BIN
src/static/skins/colibris/images/screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 95 KiB |
82
src/static/skins/colibris/index.css
Normal file
82
src/static/skins/colibris/index.css
Normal file
|
@ -0,0 +1,82 @@
|
|||
#button,
|
||||
body,
|
||||
form {
|
||||
border: none
|
||||
}
|
||||
|
||||
body {
|
||||
background: url(images/fond.jpg) center center no-repeat fixed #fff;
|
||||
font-family: Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif !important;
|
||||
font-size: 16px;
|
||||
line-height: 1.42857143;
|
||||
color: #333;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
#wrapper {
|
||||
border-top: none;
|
||||
margin-top: 0;
|
||||
padding: 0;
|
||||
background: 0 0;
|
||||
box-shadow: none
|
||||
}
|
||||
|
||||
#inner {
|
||||
background: transparent;
|
||||
padding-top: 0;
|
||||
width: 350px;
|
||||
max-width: 350px;
|
||||
text-align: center;
|
||||
color:#FFF;
|
||||
}
|
||||
|
||||
#label {
|
||||
text-shadow: none;
|
||||
color: #FFF;
|
||||
font-weight: normal;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#button {
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
text-shadow: none;
|
||||
font-size: 23px;
|
||||
line-height: 1.8;
|
||||
color: #64d29b;
|
||||
background: #586a69;
|
||||
border-radius: 3px;
|
||||
box-shadow: none;
|
||||
height: 53px;
|
||||
border: none;
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
button[type=submit] {
|
||||
border-top-right-radius: 3px;
|
||||
border-bottom-right-radius: 3px;
|
||||
left: 305px;
|
||||
color: #64d29b;
|
||||
background: #586a69;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#button:hover,
|
||||
button[type=submit]:hover {
|
||||
cursor: pointer;
|
||||
background: #64d29b;
|
||||
border: 2px solid #586a69;
|
||||
color: #586a69;
|
||||
}
|
||||
|
||||
#padname {
|
||||
height: 38px;
|
||||
max-width: 350px;
|
||||
padding: 0 12px;
|
||||
position: relative;
|
||||
}
|
127
src/static/skins/colibris/pad.css
Normal file
127
src/static/skins/colibris/pad.css
Normal file
|
@ -0,0 +1,127 @@
|
|||
@import url("src/layout.css");
|
||||
@import url("src/pad-editor.css");
|
||||
|
||||
@import url("src/components/buttons.css");
|
||||
@import url("src/components/popup.css");
|
||||
|
||||
@import url("src/components/chat.css");
|
||||
@import url("src/components/sidediv.css");
|
||||
@import url("src/components/gritter.css");
|
||||
@import url("src/components/table-of-content.css");
|
||||
@import url("src/components/toolbar.css");
|
||||
@import url("src/components/users.css");
|
||||
@import url("src/components/form.css");
|
||||
@import url("src/components/import-export.css");
|
||||
|
||||
@import url("src/plugins/brightcolorpicker.css");
|
||||
@import url("src/plugins/comments_page.css");
|
||||
@import url("src/plugins/font_color.css");
|
||||
@import url("src/plugins/set_title_on_pad.css");
|
||||
@import url("src/plugins/tables2.css");
|
||||
@import url("src/plugins/embedded_hyperlinks.css");
|
||||
@import url("src/plugins/author_hover.css");
|
||||
|
||||
/* NEUTRAL COLOR */
|
||||
body,
|
||||
#innerdocbody
|
||||
#users,
|
||||
#chattext,
|
||||
#chatinput,
|
||||
#chatlabel,
|
||||
#toc,
|
||||
#tocItems a,
|
||||
.toolbar ul li a:hover .buttonicon,
|
||||
.toolbar ul li a,
|
||||
.toolbar ul li select,
|
||||
#mycolorpickercancel,
|
||||
.btn-default,
|
||||
.color\:black,
|
||||
[data-color=black],
|
||||
#chattext.authorColors p, #chattext.authorColors span,
|
||||
#chattext .time,
|
||||
#tbl_context_menu ul .yuimenuitemlabel,
|
||||
.yui-skin-sam .yui-split-button button em:not(.color-picker-button),
|
||||
#yui-picker-panel .button-group .yui-button:first-child button,
|
||||
#newComment .sidebar-comment input[type=reset], #newComment .sidebar-comment input[type=reset]:hover,
|
||||
#newComment .sidebar-comment input[type=submit]:hover,
|
||||
.suggestion, .comment-reply-input, .reply-suggestion p:not(.reply-comment-suggest-from-p), .comment-text,
|
||||
.sidebar-comment textarea, .reply-comment-suggest label, .comment-suggest label, .comment-reply-input
|
||||
#comments, #newComments, .reply-comment-suggest-from-p,
|
||||
.comment-changeFrom-value,
|
||||
.comment-changeTo-value,
|
||||
.reply-suggestion .reply-comment-suggest-from,
|
||||
.suggestion .comment-suggest-from,
|
||||
.hyperlink-dialog>.hyperlink-url,
|
||||
.timeslider #padcontent span ,
|
||||
.exporttype, .timeslider #export > p
|
||||
{ color: #2E3338 !important; }
|
||||
|
||||
/* MENUS ICONS */
|
||||
#edit_title:before,
|
||||
#tbl-menu:before
|
||||
{ color: #767676 !important; }
|
||||
/* MENU BUTTONS */
|
||||
.timeslider #editbar .buttontext
|
||||
{ background-color: #767676 !important; }
|
||||
|
||||
/* PRIMARY BUTTONS */
|
||||
#mycolorpickersave,
|
||||
.btn-primary,
|
||||
#tbl_btn_close,
|
||||
#save_title button,
|
||||
#yui-picker-panel .button-group .yui-button:last-child button,
|
||||
#newComment.sidebar-comment input[type=submit],
|
||||
.comment-changeTo-approve input[type=submit],
|
||||
.hyperlink-dialog>.hyperlink-save,
|
||||
#importsubmitinput, #forcereconnect
|
||||
{
|
||||
background-color: #64d29b;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* PRIMARY COLOR */
|
||||
h1,
|
||||
#titlelabel,
|
||||
.yui-skin-sam .yui-panel .hd,
|
||||
p[data-l10n-id="ep_comments_page.comment"],
|
||||
.comment-reply-input-label span,
|
||||
.stepper, #importmessageabiword, #importmessageabiword > a
|
||||
{ color: #64d29b; }
|
||||
#ui-slider-handle, #playpause_button_icon {
|
||||
background-color: #64d29b;
|
||||
}
|
||||
.stepper {
|
||||
border-color: #64d29b;
|
||||
}
|
||||
|
||||
/* BACKGROUND COLOR */
|
||||
#editorcontainer, #padmain {
|
||||
background-color: #f9f9f9 !important;
|
||||
}
|
||||
|
||||
|
||||
/* NEUTRAL FONT */
|
||||
body,
|
||||
#innerdocbody,
|
||||
#chatinput,
|
||||
.toolbar ul li select,
|
||||
button, input, select, textarea,
|
||||
td[name=tData],
|
||||
#comments, #newComments,
|
||||
#sidediv,
|
||||
#comments .sidebar-comment,
|
||||
#timeslider #timer, .exporttype
|
||||
{ font-family: Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; }
|
||||
|
||||
/* PRIMARY FONT */
|
||||
h1,
|
||||
#titlelabel,
|
||||
#chatlabel,
|
||||
.btn,
|
||||
.yui-skin-sam .yui-panel .hd,
|
||||
.reply-suggestion p:not(.reply-comment-suggest-from-p),
|
||||
p[data-l10n-id="ep_comments_page.comment"],
|
||||
#newComment.sidebar-comment input[type=submit],
|
||||
.comment-changeTo-approve input[type=submit],
|
||||
.hyperlink-dialog>.hyperlink-save
|
||||
{ font-family: Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif !important; }
|
4
src/static/skins/colibris/pad.js
Normal file
4
src/static/skins/colibris/pad.js
Normal file
|
@ -0,0 +1,4 @@
|
|||
function customStart()
|
||||
{
|
||||
$('#pad_title').show();
|
||||
}
|
21
src/static/skins/colibris/src/components/buttons.css
Normal file
21
src/static/skins/colibris/src/components/buttons.css
Normal file
|
@ -0,0 +1,21 @@
|
|||
.btn, #mycolorpickercancel, #mycolorpickersave, #save_title button, #yui-picker-panel .button-group .yui-button button, .hyperlink-dialog>.hyperlink-save, .timeslider #editbar .buttontext,
|
||||
#importsubmitinput, #forcereconnect
|
||||
{
|
||||
margin-right: 10px;
|
||||
padding: 5px 20px;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
line-height: 1.5;
|
||||
width: auto;
|
||||
border: none !important;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
position: relative;
|
||||
background: none;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.btn:hover, #mycolorpickercancel:hover, #mycolorpickersave:hover, #save_title button:hover, .hyperlink-dialog>.hyperlink-save:hover, #importsubmitinput:hover, #forcereconnect:hover {
|
||||
cursor: pointer;
|
||||
}
|
100
src/static/skins/colibris/src/components/chat.css
Normal file
100
src/static/skins/colibris/src/components/chat.css
Normal file
|
@ -0,0 +1,100 @@
|
|||
#chatbox {
|
||||
background: none;
|
||||
padding: 0;
|
||||
background-color: white;
|
||||
border: none;
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
width: 400px;
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
#titlebar {
|
||||
bottom: 0;
|
||||
line-height: 39px;
|
||||
height: 44px;
|
||||
padding: 0 7px;
|
||||
z-index: 20000;
|
||||
border-bottom: 1px solid #d2d2d2;
|
||||
}
|
||||
|
||||
#titlelabel, #chatlabel {
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#titlelabel { font-size: 16px; }
|
||||
#chatlabel { margin-right: 15px; }
|
||||
|
||||
#chattext {
|
||||
top: 45px;
|
||||
font-size: 13px;
|
||||
padding: 10px;
|
||||
bottom: 45px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
#chattext.authorColors p, #chattext.authorColors span {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
#chattext p b {
|
||||
color: #4c4c4c;
|
||||
}
|
||||
|
||||
#chattext::-webkit-scrollbar-track {
|
||||
background-color: #f6f6f6;
|
||||
border: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
#chattext::-webkit-scrollbar {
|
||||
width: 7px;
|
||||
}
|
||||
|
||||
#chattext::-webkit-scrollbar-thumb {
|
||||
border-radius: 10px;
|
||||
background-color: #C5C5C5;
|
||||
}
|
||||
|
||||
#chatinputbox {
|
||||
padding: 0 5px 5px 10px;
|
||||
}
|
||||
|
||||
#chatinput {
|
||||
width: calc(100% - 20px);
|
||||
float: right;
|
||||
}
|
||||
|
||||
#chatbox.stickyChat {
|
||||
width: 193px !important;
|
||||
background-color: #f9f9f9 !important;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
#chatbox.stickyChat #chattext {
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
#chatbox.stickyChat #chatinputbox {
|
||||
padding: 5px 5px 3px 5px;
|
||||
}
|
||||
|
||||
#chaticon {
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
border: none;
|
||||
padding: 10px 20px;
|
||||
right: 30px;
|
||||
}
|
||||
|
||||
@media (max-width: 720px) {
|
||||
#chaticon {
|
||||
right: 0;
|
||||
bottom: 44px;
|
||||
}
|
||||
|
||||
#chatbox {
|
||||
width: 100%;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#titlesticky { display: none; }
|
||||
}
|
8
src/static/skins/colibris/src/components/form.css
Normal file
8
src/static/skins/colibris/src/components/form.css
Normal file
|
@ -0,0 +1,8 @@
|
|||
#input_title, #chatinput, .hyperlink-dialog>.hyperlink-url {
|
||||
border: 1px solid #d2d2d2;
|
||||
height: 18px;
|
||||
border-radius: 3px;
|
||||
padding: 8px 10px;
|
||||
background: none !important;
|
||||
box-shadow: none !important;
|
||||
}
|
28
src/static/skins/colibris/src/components/gritter.css
Normal file
28
src/static/skins/colibris/src/components/gritter.css
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* Popups at the bottom of the page to indicate when the pad expires, and others stuff */
|
||||
|
||||
.gritter-title {
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
#gritter-notice-wrapper {
|
||||
background-color: #fff;
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
border-radius: 3px;
|
||||
padding: 15px 20px 5px 30px;
|
||||
bottom: 50px !important;
|
||||
right: 30px !important;
|
||||
}
|
||||
|
||||
@media (max-width: 1100px) {
|
||||
#gritter-notice-wrapper {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.gritter-item {
|
||||
font-family: Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif !important;
|
||||
color: #4e545b;
|
||||
font-size: 12px;
|
||||
line-height: 20px;
|
||||
padding: 0;
|
||||
}
|
33
src/static/skins/colibris/src/components/import-export.css
Normal file
33
src/static/skins/colibris/src/components/import-export.css
Normal file
|
@ -0,0 +1,33 @@
|
|||
#exportColumn {
|
||||
margin-top: 0;
|
||||
padding-left: 20px;
|
||||
width: calc(50% - 20px);
|
||||
}
|
||||
|
||||
#importmessageabiword {
|
||||
font-style: italic;
|
||||
font-size: 13px;
|
||||
}
|
||||
#importmessageabiword > a {
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.exportlink {
|
||||
font-size: 14px;
|
||||
margin: 0;
|
||||
margin-bottom: 7px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.exporttype {
|
||||
margin-left: 5px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#importmessagefail {
|
||||
font-size: 13px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
#importsubmitinput[disabled] { opacity: .6; }
|
30
src/static/skins/colibris/src/components/popup.css
Normal file
30
src/static/skins/colibris/src/components/popup.css
Normal file
|
@ -0,0 +1,30 @@
|
|||
#users,
|
||||
#mycolorpicker,
|
||||
.popup,
|
||||
.hyperlink-dialog {
|
||||
border-radius: 3px;
|
||||
padding: 20px 20px;
|
||||
background: none;
|
||||
background-color: white;
|
||||
border: none;
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
}
|
||||
|
||||
#users input[type=text],
|
||||
.popup input[type=text] {
|
||||
border: none !important;
|
||||
border-bottom: 1px solid #d7d8da !important;
|
||||
}
|
||||
|
||||
.popup h1 {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.popup h2 {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.popup p {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
30
src/static/skins/colibris/src/components/sidediv.css
Normal file
30
src/static/skins/colibris/src/components/sidediv.css
Normal file
|
@ -0,0 +1,30 @@
|
|||
#sidediv {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#sidedivinner>div:before {
|
||||
font-size: 13px;
|
||||
padding-right: 18px !important;
|
||||
color: #6a6a6b;
|
||||
text-transform: uppercase;
|
||||
font-size: 11px !important;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#sidedivinner>div,
|
||||
#sidedivinner.authorColors>div,
|
||||
#sidedivinner.authorColors>div.primary-none {
|
||||
padding-right: 5px !important;
|
||||
border-right: 5px solid transparent;
|
||||
}
|
||||
|
||||
#sidedivinner>div {
|
||||
line-height: 24px;
|
||||
font-size: 10px !important;
|
||||
color: #a0a0a0;
|
||||
}
|
||||
|
||||
#sidedivinner.authorColors>div, #sidedivinner.authorColors>div.primary-none, #sidedivinner>div {
|
||||
padding-right: 8px !important;
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#toc {
|
||||
background: none !important;
|
||||
background-color: rgb(249, 249, 249) !important;
|
||||
padding: 20px !important;
|
||||
width: 146px !important;
|
||||
padding-left: 15px !important;
|
||||
}
|
||||
|
||||
#tocItems {
|
||||
line-height: 40px !important;
|
||||
}
|
145
src/static/skins/colibris/src/components/toolbar.css
Normal file
145
src/static/skins/colibris/src/components/toolbar.css
Normal file
|
@ -0,0 +1,145 @@
|
|||
.toolbar {
|
||||
height: 39px !important;
|
||||
padding-top: 0;
|
||||
margin: 0;
|
||||
background-color: white !important;
|
||||
background: none;
|
||||
border: 1px solid #d2d2d2
|
||||
}
|
||||
|
||||
.toolbar .buttonicon {
|
||||
background-color: transparent;
|
||||
font-size: 14px;
|
||||
color: #767676;
|
||||
}
|
||||
|
||||
.toolbar ul li.separator {
|
||||
padding: 0;
|
||||
visibility: visible;
|
||||
width: 1px;
|
||||
margin: 0 10px;
|
||||
margin-right: 6px;
|
||||
height: 39px;
|
||||
background-color: rgba(78, 85, 92, 0.22);
|
||||
}
|
||||
|
||||
.toolbar.condensed ul li {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.toolbar.condensed ul li.separator {
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
.toolbar ul li a {
|
||||
background-color: transparent;
|
||||
background: none;
|
||||
border: none;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.toolbar ul li a:hover,
|
||||
.toolbar ul li a.selected,
|
||||
.toolbar ul li a:focus {
|
||||
background: none !important;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.toolbar ul li a:hover {
|
||||
background:#f7f7f7!important
|
||||
}
|
||||
|
||||
.toolbar ul li a.selected,
|
||||
.toolbar ul li a:focus {
|
||||
background: #eaeaea!important;
|
||||
}
|
||||
|
||||
.toolbar ul li select {
|
||||
border: none;
|
||||
border-bottom: 1px solid #d7d8da;
|
||||
border-radius: 0;
|
||||
width: 90px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.toolbar ul {
|
||||
height: 39px;
|
||||
}
|
||||
|
||||
.toolbar ul.menu_left {
|
||||
left: 8px;
|
||||
}
|
||||
|
||||
.toolbar ul.menu_right {
|
||||
right: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.toolbar ul li[data-key=showusers] a {
|
||||
margin: 0;
|
||||
height: 59px;
|
||||
line-height: 25px;
|
||||
width: 45px;
|
||||
margin-left: -10px;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
.toolbar ul li.separator {
|
||||
margin: 0 2px;
|
||||
background: none;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.toolbar ul li[data-key=showusers] a {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 720px) {
|
||||
.toolbar ul {
|
||||
height: 39px;
|
||||
background: none;
|
||||
background-color: transparent;
|
||||
border: none !important;
|
||||
padding: 0 !important;
|
||||
overflow-x: visible;
|
||||
}
|
||||
.toolbar ul.menu_left {
|
||||
padding-top: 2px !important;
|
||||
}
|
||||
.toolbar ul.menu_right {
|
||||
left: 0;
|
||||
padding-left: 8px !important;
|
||||
padding-top: 8px !important;
|
||||
height: 35px !important;
|
||||
border-top: 1px solid #d2d2d2 !important;
|
||||
background-color: white;
|
||||
}
|
||||
.toolbar ul li a {
|
||||
padding: 4px 5px !important;
|
||||
}
|
||||
|
||||
.toolbar ul li[data-key=showusers] {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
.toolbar ul li[data-key=showusers] a {
|
||||
padding-top: 9px !important;
|
||||
}
|
||||
.toolbar ul li a:hover { background-color: transparent; }
|
||||
|
||||
#connectivity, #embed, #import_export, #settings { bottom: 42px; }
|
||||
|
||||
li.superscript,
|
||||
li.subscript,
|
||||
li[data-key="undo"],
|
||||
li[data-key="redo"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.toolbar ul li.separator { margin: 0; }
|
||||
}
|
||||
|
||||
|
83
src/static/skins/colibris/src/components/users.css
Normal file
83
src/static/skins/colibris/src/components/users.css
Normal file
|
@ -0,0 +1,83 @@
|
|||
table#otheruserstable {
|
||||
margin-top: 10px !important;
|
||||
}
|
||||
|
||||
#otheruserstable .swatch {
|
||||
border: none !important;
|
||||
border-radius: 50%;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
margin: 0;
|
||||
margin-left: 1px;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
#myusernameform {
|
||||
margin-left: 35px;
|
||||
}
|
||||
|
||||
#myusernameedit {
|
||||
width: 110px;
|
||||
}
|
||||
|
||||
#myswatchbox {
|
||||
background: none;
|
||||
float: left;
|
||||
position: relative;
|
||||
left: 0;
|
||||
top: 0;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
#myswatch {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
#nootherusers {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#mycolorpicker {
|
||||
width: auto;
|
||||
height: auto;
|
||||
left: -280px;
|
||||
}
|
||||
|
||||
#colorpicker {
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
#mycolorpickercancel {
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
#mycolorpickersave {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#mycolorpickerpreview {
|
||||
float: right;
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: relative;
|
||||
border-radius: 50%;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
@media (max-width: 720px) {
|
||||
#users {
|
||||
bottom: 42px;
|
||||
top: initial !important;
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
#mycolorpicker {
|
||||
width: auto;
|
||||
height: auto;
|
||||
right: 0;
|
||||
bottom: 42px;
|
||||
left: initial;
|
||||
top: initial !important;
|
||||
}
|
||||
}
|
133
src/static/skins/colibris/src/layout.css
Normal file
133
src/static/skins/colibris/src/layout.css
Normal file
|
@ -0,0 +1,133 @@
|
|||
#connectivity,
|
||||
#embed,
|
||||
#import_export,
|
||||
#settings,
|
||||
#users {
|
||||
top: 38px;
|
||||
right: 30px;
|
||||
}
|
||||
|
||||
#editorcontainer {
|
||||
top: 41px !important;
|
||||
padding-top: 0 !important;
|
||||
}
|
||||
|
||||
#outerdocbody, .timeslider #editorcontainerbox {
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
#outerdocbody {
|
||||
overflow-y: auto;
|
||||
position: relative;
|
||||
background-color: transparent;
|
||||
padding-left: 40px; /* space for side div */
|
||||
}
|
||||
|
||||
#outerdocbody.ep_author_neat {
|
||||
padding-left: 120px; /* more space for sidediv */
|
||||
}
|
||||
@media (max-width:600px) {
|
||||
#outerdocbody.ep_author_neat { padding-left: 0; }
|
||||
#options-linenoscheck { display:none; }
|
||||
#options-linenoscheck ~ label { display:none; }
|
||||
}
|
||||
|
||||
#outerdocbody.sidediv-hidden {
|
||||
padding-left: 0; /* sidediv hidden */
|
||||
}
|
||||
|
||||
#outerdocbody iframe {
|
||||
display: block;
|
||||
position: relative;
|
||||
left: 0 !important;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
#outerdocbody iframe, .timeslider #editorcontainerbox {
|
||||
padding: 55px;
|
||||
box-shadow: 0 0 0 0.5px rgba(209, 209, 209, 0.32), 0 0 7pt 0pt rgba(204, 204, 204, 0.52);
|
||||
border: 0;
|
||||
border-radius: 5px;
|
||||
background-color: white;
|
||||
width: calc(100% - 110px) !important; /* 100% - padding */
|
||||
}
|
||||
|
||||
#sidediv {
|
||||
position: absolute;
|
||||
right: calc(100% - 35px);
|
||||
left: initial;
|
||||
top: 74px !important;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#outerdocbody.ep_author_neat #sidediv {
|
||||
right: calc(100% - 113px);
|
||||
}
|
||||
|
||||
/* Fixs comments_page & author_hover does not take in account the document padding */
|
||||
.comment-modal { margin-top: 75px !important; margin-left: 45px; }
|
||||
.authortooltip { margin-top: 65px !important; margin-left: 60px; }
|
||||
.caretindicator { margin-top: 61px!important; margin-left: 52px; }
|
||||
|
||||
#outerdocbody.ep_author_neat .authortooltip{ margin-left: 145px; }
|
||||
#outerdocbody.ep_author_neat .caretindicator{ margin-left: 52px; margin-top: 65px!important;}
|
||||
@media (max-width:1000px) {
|
||||
#outerdocbody.ep_author_neat .authortooltip{ margin-left: 115px; }
|
||||
.caretindicator{ margin-left: 13px; }
|
||||
#outerdocbody.ep_author_neat .caretindicator{ margin-left: 17px; }
|
||||
}
|
||||
|
||||
@media (min-width: 1381px) {
|
||||
#outerdocbody.ep_comments_page { padding-right: 150px; } }
|
||||
#outerdocbody.ep_comments_page #comments { left: calc(100% - 150px) }
|
||||
@media (max-width: 1380px) {
|
||||
#outerdocbody.ep_comments_page #comments { left: calc(100% - 220px) }
|
||||
#outerdocbody.ep_comments_page { padding-right: 220px; }
|
||||
}
|
||||
@media (max-width: 1278px) {
|
||||
#outerdocbody.ep_comments_page #comments { display: none; }
|
||||
#outerdocbody.ep_comments_page { padding-right: 0px; }
|
||||
}
|
||||
|
||||
@media (max-width:1000px) {
|
||||
#outerdocbody {
|
||||
max-width: none;
|
||||
padding-top: 0;
|
||||
}
|
||||
#outerdocbody iframe, .timeslider #editorcontainerbox {
|
||||
padding: 20px !important;
|
||||
border-radius: 0;
|
||||
width: calc(100% - 40px) !important; /* 100% - padding */
|
||||
}
|
||||
#sidediv {
|
||||
top: 20px !important; /* = #outerdocbody iframe padding-top */
|
||||
}
|
||||
|
||||
.comment-modal, .authortooltip { margin-top: 20px !important; }
|
||||
.caretindicator { margin-top: 0px !important; }
|
||||
#outerdocbody.ep_author_neat .caretindicator { margin-top: 10px !important; }
|
||||
|
||||
#outerdocbody.ep_author_neat #sidedivinner>div:before { padding-right: 10px !important; }
|
||||
#outerdocbody.ep_author_neat #sidedivinner.authorColors>div,
|
||||
#outerdocbody.ep_author_neat #sidedivinner.authorColors>div.primary-none,
|
||||
#outerdocbody.ep_author_neat #sidedivinner>div { padding-right: 6px!important; }
|
||||
#outerdocbody.ep_author_neat #sidediv { padding-right: 0 !important; }
|
||||
}
|
||||
|
||||
@media (max-width:600px) {
|
||||
html { overflow: scroll; }
|
||||
#outerdocbody {
|
||||
width: 100%;
|
||||
}
|
||||
#outerdocbody iframe, .timeslider #editorcontainerbox {
|
||||
padding: 15px !important;
|
||||
width: calc(100% - 30px) !important; /* 100% - padding */
|
||||
}
|
||||
#sidediv {
|
||||
display: none;
|
||||
top: 15px !important; /* = #outerdocbody iframe padding-top */
|
||||
}
|
||||
}
|
||||
|
43
src/static/skins/colibris/src/pad-editor.css
Normal file
43
src/static/skins/colibris/src/pad-editor.css
Normal file
|
@ -0,0 +1,43 @@
|
|||
#innerdocbody, #padcontent {
|
||||
font-size: 15px;
|
||||
line-height: 25px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#innerdocbody span, #padcontent span {
|
||||
padding: 4px 0 !important;
|
||||
}
|
||||
|
||||
#innerdocbody h1 span, #padcontent h1 span {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
option {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2.5em !important;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.15em;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #3f51b5;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
line-height: 120%;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
10
src/static/skins/colibris/src/plugins/author_hover.css
Normal file
10
src/static/skins/colibris/src/plugins/author_hover.css
Normal file
|
@ -0,0 +1,10 @@
|
|||
.authortooltip {
|
||||
opacity: 1!important;
|
||||
border-radius: 2px;
|
||||
padding: 4px 10px 3px!important;
|
||||
text-transform: uppercase;
|
||||
font-size: 13px!important;
|
||||
font-weight: 700;
|
||||
color: #000;
|
||||
background-color: rgba(255, 255, 255, 0.85) !important;
|
||||
}
|
20
src/static/skins/colibris/src/plugins/brightcolorpicker.css
Normal file
20
src/static/skins/colibris/src/plugins/brightcolorpicker.css
Normal file
|
@ -0,0 +1,20 @@
|
|||
#colorpicker {
|
||||
left: -200px !important;
|
||||
top: 0px !important;
|
||||
}
|
||||
|
||||
#colorpicker a.brightColorPicker-cancelButton {
|
||||
background: none;
|
||||
padding: 0;
|
||||
padding-top: 10px;
|
||||
font-family: Arial, sans-serif;
|
||||
font-weight: bold;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.brightColorPicker-colorPanel {
|
||||
background-color: white !important;
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08) !important;
|
||||
border-radius: 3px !important;
|
||||
padding: 15px !important;
|
||||
}
|
290
src/static/skins/colibris/src/plugins/comments_page.css
Normal file
290
src/static/skins/colibris/src/plugins/comments_page.css
Normal file
|
@ -0,0 +1,290 @@
|
|||
.comment.selected {
|
||||
color: #a28239;
|
||||
}
|
||||
|
||||
#newComment {
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
border: none;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
p[data-l10n-id="ep_comments_page.comment"] {
|
||||
font-weight: 900;
|
||||
font-size: 16px;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#newComment.sidebar-comment textarea:not(.comment-suggest-from) {
|
||||
border: 1px solid #d2d2d2;
|
||||
border-radius: 3px;
|
||||
padding: 8px 10px;
|
||||
height: 80px;
|
||||
padding: 8px;
|
||||
font-size: 14px;
|
||||
width: calc(100% - 15px);
|
||||
}
|
||||
|
||||
#newComment.sidebar-comment .comment-suggest-from {
|
||||
height: auto !important;
|
||||
font-size: 14px;
|
||||
padding: 8px;
|
||||
width: calc(100% - 15px) !important;
|
||||
background-color: #f9f9f9;
|
||||
margin-top: 8px;
|
||||
border: 1px solid #f3eeee;
|
||||
border-left: 4px solid #a7a7a7;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.comment-suggest {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.reply-comment-suggest input,
|
||||
.comment-suggest input {
|
||||
vertical-align: -2px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.reply-comment-suggest label,
|
||||
.comment-suggest label {
|
||||
font-style: italic;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.sidebar-comment input,
|
||||
.comment-buttons input {
|
||||
border-radius: 4px;
|
||||
text-transform: uppercase;
|
||||
font-weight: 900;
|
||||
font-size: 13px;
|
||||
line-height: 1.5;
|
||||
width: auto;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#newComment.sidebar-comment input[type=submit] {
|
||||
color: white;
|
||||
margin-right: 10px;
|
||||
padding: 0 10px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#newComment.sidebar-comment input[type=reset] {
|
||||
background-color: white;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.comment-content:focus {
|
||||
border: 2px solid rgba(33, 150, 243, 0.51);
|
||||
}
|
||||
|
||||
.comment-changeTo-approve input[type=submit] { width: 100%; font-size: 12px;}
|
||||
|
||||
.reply-comment-suggest-from-p,
|
||||
.comment-changeFrom-value,
|
||||
.comment-changeTo-value,
|
||||
.reply-suggestion .reply-comment-suggest-from,
|
||||
.suggestion .comment-suggest-from {
|
||||
border: none;
|
||||
font-weight: normal;
|
||||
font-style: italic;
|
||||
padding-left: 0;
|
||||
width: 100% !important;
|
||||
padding: 0;
|
||||
padding-top: 8px;
|
||||
/* width: inherit !important; */
|
||||
/*color: rgba(41, 125, 191, 0.85);*/
|
||||
}
|
||||
|
||||
textarea.comment-suggest-to {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.suggestion {
|
||||
font-weight: bold;
|
||||
font-size: 11px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
#comments {
|
||||
top: 82px;
|
||||
}
|
||||
|
||||
#comments .sidebar-comment {
|
||||
background-color: transparent;
|
||||
font-size: 13px;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
#comments .sidebar-comment:hover,
|
||||
#comments .sidebar-comment.mouseover,
|
||||
.comment-modal {
|
||||
margin-right: -30px;
|
||||
}
|
||||
}
|
||||
|
||||
#comments .sidebar-comment:hover,
|
||||
#comments .sidebar-comment.mouseover,
|
||||
.comment-modal {
|
||||
background-color: #fff;
|
||||
padding: 0;
|
||||
padding-top: 10px;
|
||||
margin-top: -8px;
|
||||
width: 250px;
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
}
|
||||
|
||||
#comments .sidebar-comment:hover time,
|
||||
#comments .sidebar-comment.mouseover time,
|
||||
.comment-modal-comment>time {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
#comments .sidebar-comment:hover>section,
|
||||
#comments .sidebar-comment.mouseover>section,
|
||||
.comment-modal-comment>section {
|
||||
padding: 0 15px;
|
||||
padding-bottom: 10px;
|
||||
margin-top: 5px;
|
||||
display: block;
|
||||
line-height: 20px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.comment-delete-container {
|
||||
float: right;
|
||||
margin: 0;
|
||||
height: 15px;
|
||||
font-size: 15px;
|
||||
background-color: transparent;
|
||||
padding: 6px 15px 4px 8px;
|
||||
color: #7b7777;
|
||||
}
|
||||
|
||||
.comment-reply {
|
||||
border-top: 1px solid #d2d2d2;
|
||||
background-color: #f9f9f9;
|
||||
margin: 0;
|
||||
padding: 10px 15px 3px;
|
||||
}
|
||||
|
||||
.comment-reply-input-label span {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.comment-reply-input {
|
||||
border: 1px solid #d2d2d2 !important;
|
||||
width: calc(100% - 20px) !important;
|
||||
padding: 8px 10px;
|
||||
text-transform: none !important;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 10px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.reply-suggestion p:not(.reply-comment-suggest-from-p) {
|
||||
text-transform: uppercase;
|
||||
font-size: 11px;
|
||||
font-weight: 400;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.comment-changeTo-approve input {
|
||||
height: 25px;
|
||||
margin: 0;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.reply-suggestion {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.reply-comment-suggest-from-p {
|
||||
padding: 0
|
||||
}
|
||||
|
||||
.comment-text {
|
||||
font-weight: normal;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.sidebar-comment-reply:nth-child(even) {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.sidebar-comment-reply {
|
||||
padding: 0;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.comment-author-name {
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.comment-changeFrom-label,
|
||||
.comment-changeTo-label {
|
||||
text-transform: uppercase;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.comment-reply note {
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.reply-comment-suggest {
|
||||
display: none !important
|
||||
}
|
||||
|
||||
.comment-changeTo-form {
|
||||
margin-bottom: 5px;
|
||||
padding: 0 15px;
|
||||
}
|
||||
|
||||
.sidebar-comment>.comment-author-name,
|
||||
.comment-modal-comment>.comment-author-name {
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
#comments .sidebar-comment:hover >.comment-author-name,
|
||||
#comments .sidebar-comment.mouseover >.comment-author-name {
|
||||
margin-top: 2px;
|
||||
display: inline-block;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
||||
.sidebar-comment>time,
|
||||
.comment-modal-comment>time {
|
||||
position: absolute;
|
||||
top: 11px;
|
||||
font-size: 11px;
|
||||
right: 36px;
|
||||
color: #555555;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.comment-changeTo-approve {
|
||||
margin-bottom: 14px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.comment-reply note:first-child {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.comment-modal {
|
||||
padding: 0;
|
||||
border: none;
|
||||
width: 350px !important;
|
||||
margin-top: 0;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.comment-modal-comment>.comment-author-name {
|
||||
padding-left: 14px;
|
||||
}
|
||||
|
||||
|
0
src/static/skins/colibris/src/plugins/cursortrace.css
Normal file
0
src/static/skins/colibris/src/plugins/cursortrace.css
Normal file
|
@ -0,0 +1,6 @@
|
|||
.hyperlink-dialog>.hyperlink-save{
|
||||
height: 34px;
|
||||
margin-top: 1px;
|
||||
margin-right: 0;
|
||||
margin-left: 2px;
|
||||
}
|
32
src/static/skins/colibris/src/plugins/font_color.css
Normal file
32
src/static/skins/colibris/src/plugins/font_color.css
Normal file
|
@ -0,0 +1,32 @@
|
|||
li.acl-write.font-color-icon.ep_font_color {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#font-color {
|
||||
display: list-item !important;
|
||||
}
|
||||
|
||||
.color\:red,
|
||||
[data-color=red] {
|
||||
color: #F44336;
|
||||
}
|
||||
|
||||
.color\:green,
|
||||
[data-color=green] {
|
||||
color: #66d29c;
|
||||
}
|
||||
|
||||
.color\:blue,
|
||||
[data-color=blue] {
|
||||
color: #2196f3;
|
||||
}
|
||||
|
||||
.color\:yellow,
|
||||
[data-color=yellow] {
|
||||
color: #e0d776;
|
||||
}
|
||||
|
||||
.color\:orange,
|
||||
[data-color=orange] {
|
||||
color: #d2a564;
|
||||
}
|
34
src/static/skins/colibris/src/plugins/set_title_on_pad.css
Normal file
34
src/static/skins/colibris/src/plugins/set_title_on_pad.css
Normal file
|
@ -0,0 +1,34 @@
|
|||
#pad_title {
|
||||
margin-bottom: 15px !important;
|
||||
margin-top: 5px !important;
|
||||
display: none; /* display only when page is loaded via javascript */
|
||||
}
|
||||
|
||||
@media (max-width:720px) {
|
||||
#pad_title { display: none !important; }
|
||||
}
|
||||
|
||||
#edit_title {
|
||||
color: white;
|
||||
}
|
||||
#edit_title:before {
|
||||
font-family: fontawesome-etherpad;
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
font-size: 14px;
|
||||
content: "\E839";
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
#input_title {
|
||||
background-color: #f9f9f9 !important;
|
||||
height: auto !important;
|
||||
margin-top: 3px;
|
||||
width: calc(100% - 110px) !important;
|
||||
padding: 8px 10px !important;
|
||||
}
|
||||
|
||||
#save_title button {
|
||||
height: 30px !important;
|
||||
padding: 5px 20px !important;
|
||||
}
|
239
src/static/skins/colibris/src/plugins/tables2.css
Normal file
239
src/static/skins/colibris/src/plugins/tables2.css
Normal file
|
@ -0,0 +1,239 @@
|
|||
/* MENU ICON*/
|
||||
#editbar #tbl_menu_list {
|
||||
width: auto !important;
|
||||
}
|
||||
#tbl-menu {
|
||||
background: none !important;
|
||||
width: 18px !important;
|
||||
padding-left: 2px !important;
|
||||
}
|
||||
#tbl-menu:before {
|
||||
content: "\F0CE";
|
||||
}
|
||||
|
||||
#tbl_menu_list > a {
|
||||
font-size: 16px;
|
||||
margin-top: 8px;
|
||||
padding-left: 0;
|
||||
padding-right: 2px;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
/* DROP DOWN MENU */
|
||||
#tbl_context_menu {
|
||||
margin-left: -24px;
|
||||
border: none;
|
||||
margin-top: 9px;
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
border-radius: 3px;
|
||||
background-color: white;
|
||||
font-size: 100%;
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
#tbl_context_menu > .bd {
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#tbl_context_menu > .bd > ul {
|
||||
padding: 6px 0;
|
||||
}
|
||||
|
||||
/* TABLE SIZE PICKER */
|
||||
#tbl_insert {
|
||||
background-color: white;
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
#tbl_insert .bd {
|
||||
border: none;
|
||||
text-align: center;
|
||||
background-color: transparent;
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
#tbl_insert .yuimenuitemlabel { text-align: center; }
|
||||
|
||||
#tbl_insert .ft {
|
||||
margin: 0;
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
padding: 6px;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
#matrix_table tr td {
|
||||
border: 1px solid #d7d7d7;
|
||||
height: 1px;
|
||||
padding: 7px;
|
||||
width: 11px;
|
||||
background-color: #fbfbfb;
|
||||
border-radius: 1px;
|
||||
}
|
||||
#matrix_table tr td.selected {
|
||||
border: 1px solid #789dce;
|
||||
background-color: #b3d4ff;
|
||||
}
|
||||
|
||||
/* TABLE SETTINGS POPUP */
|
||||
.yui-skin-sam .yui-panel-container {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 0 0 1px rgba(99, 114, 130, 0.16), 0 8px 16px rgba(27, 39, 51, 0.08);
|
||||
border-radius: 5px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.yui-skin-sam .yui-panel-container .yui-panel {
|
||||
border: none !important;
|
||||
background: none;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.yui-skin-sam .yui-panel-container .yui-panel .hd {
|
||||
cursor: move;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: 0;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
line-height: 40px;
|
||||
text-transform: uppercase;
|
||||
padding: 0 15px;
|
||||
padding-top: 5px;
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid #d2d2d2;
|
||||
}
|
||||
|
||||
.yui-skin-sam .yui-panel-container .yui-panel .container-close {
|
||||
top: 15px;
|
||||
border: none;
|
||||
background: none;
|
||||
color: white;
|
||||
text-indent: 0;
|
||||
}
|
||||
.yui-skin-sam .yui-panel-container .yui-panel .container-close::before {
|
||||
content: "x";
|
||||
color: #6f757a;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.yui-skin-sam .yui-panel-container .yui-panel .bd {
|
||||
background: none;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
padding: 15px;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.yui-panel .underlay, .yui-skin-sam .yui-panel-container.shadow .underlay {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#div_tbl_btn_close {
|
||||
float: right;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin-top: 10px;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
#tbl_btn_close {
|
||||
border: none;
|
||||
color: #ffffff;
|
||||
height: 30px;
|
||||
width: 100%;
|
||||
border-radius: 3px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
#tbl_btn_close:hover { cursor: pointer; }
|
||||
|
||||
.yui-skin-sam .yui-button {
|
||||
background: none;
|
||||
background-color: white;
|
||||
border: none;
|
||||
height: 24px;
|
||||
margin-bottom: -4px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.yui-skin-sam .yui-button .first-child { margin: 0; border: none; }
|
||||
|
||||
.yui-skin-sam .yui-split-button button {
|
||||
padding: 0;
|
||||
background: none !important;
|
||||
}
|
||||
|
||||
.yui-skin-sam .yui-split-button button em:not(.color-picker-button) {
|
||||
font-style: normal !important;
|
||||
border-bottom: 1px solid #b5b7b7;
|
||||
padding: 0 5px;
|
||||
margin: 0 5px;
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
|
||||
button#yui-gen13-button {
|
||||
margin-left: -5px;
|
||||
}
|
||||
|
||||
button .color-picker-button {
|
||||
border: 1px solid #c1c2c2;
|
||||
border-radius: 50%;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
#even-row-bg-color, #single-row-bg-color {
|
||||
margin-right: 5px;
|
||||
}
|
||||
#single-col-bg-color, #odd-row-bg-color {
|
||||
margin-left: 7px;
|
||||
}
|
||||
|
||||
#yui-tbl-prop-panel .text-input[type=text] {
|
||||
border: 1px solid #d2d2d2;
|
||||
float: right;
|
||||
height: 10px;
|
||||
border-radius: 3px;
|
||||
padding: 8px 10px;
|
||||
}
|
||||
|
||||
#text_input_message {
|
||||
background-color: #64d29b;
|
||||
padding: 0 5px;
|
||||
color: white;
|
||||
font-size: 12px;
|
||||
border-radius: 5px;
|
||||
font-weight: bold;
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* TABLES INSIDE THE PAD */
|
||||
td[name=tData] {
|
||||
/*border: 1px solid grey !important;*/
|
||||
}
|
||||
|
||||
#yui-picker-panel_c
|
||||
{
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
div#yui-picker-panel_h {
|
||||
line-height: 1.8em;
|
||||
font-size: 13px;
|
||||
padding: 9px 15px 5px;
|
||||
}
|
||||
|
||||
#yui-picker-panel .ft {
|
||||
position: relative;
|
||||
border: none;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-top: 20px;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue