Resolve merge conflicts
This commit is contained in:
@@ -1,449 +0,0 @@
|
||||
/* alphanum.js (C) Brian Huisman
|
||||
* Based on the Alphanum Algorithm by David Koelle
|
||||
* The Alphanum Algorithm is discussed at http://www.DaveKoelle.com
|
||||
*
|
||||
* Distributed under same license as original
|
||||
*
|
||||
* Released under the MIT License - https://opensource.org/licenses/MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
/* ********************************************************************
|
||||
* Alphanum sort() function version - case insensitive
|
||||
* - Slower, but easier to modify for arrays of objects which contain
|
||||
* string properties
|
||||
*
|
||||
*/
|
||||
/* exported alphanumCase */
|
||||
|
||||
|
||||
function alphanumCase(a, b) {
|
||||
function chunkify(t) {
|
||||
var tz = new Array();
|
||||
var x = 0, y = -1, n = 0, i, j;
|
||||
|
||||
while (i = (j = t.charAt(x++)).charCodeAt(0)) {
|
||||
var m = (i === 46 || (i >= 48 && i <= 57));
|
||||
// Compare has to be with != otherwise fails
|
||||
if (m != n) {
|
||||
tz[++y] = "";
|
||||
n = m;
|
||||
}
|
||||
tz[y] += j;
|
||||
}
|
||||
return tz;
|
||||
}
|
||||
|
||||
var aa = chunkify(a.filename.toLowerCase());
|
||||
var bb = chunkify(b.filename.toLowerCase());
|
||||
|
||||
for (var x = 0; aa[x] && bb[x]; x++) {
|
||||
if (aa[x] !== bb[x]) {
|
||||
var c = Number(aa[x]), d = Number(bb[x]);
|
||||
// Compare has to be with == otherwise fails
|
||||
if (c == aa[x] && d == bb[x]) {
|
||||
return c - d;
|
||||
} else {
|
||||
return (aa[x] > bb[x]) ? 1 : -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return aa.length - bb.length;
|
||||
}
|
||||
// ===========================================================================
|
||||
|
||||
|
||||
/**
|
||||
* archive.js
|
||||
*
|
||||
* Provides base functionality for unarchiving.
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
*
|
||||
* Copyright(c) 2011 Google Inc.
|
||||
*/
|
||||
|
||||
/* global bitjs, Uint8Array */
|
||||
|
||||
var bitjs = bitjs || {};
|
||||
bitjs.archive = bitjs.archive || {};
|
||||
|
||||
(function() {
|
||||
|
||||
// ===========================================================================
|
||||
// Stolen from Closure because it's the best way to do Java-like inheritance.
|
||||
bitjs.base = function(me, optMethodName, varArgs) {
|
||||
var caller = arguments.callee.caller;
|
||||
if (caller.superClass_) {
|
||||
// This is a constructor. Call the superclass constructor.
|
||||
return caller.superClass_.constructor.apply(
|
||||
me, Array.prototype.slice.call(arguments, 1));
|
||||
}
|
||||
|
||||
var args = Array.prototype.slice.call(arguments, 2);
|
||||
var foundCaller = false;
|
||||
for (var ctor = me.constructor; ctor; ctor = ctor.superClass_ && ctor.superClass_.constructor) {
|
||||
if (ctor.prototype[optMethodName] === caller) {
|
||||
foundCaller = true;
|
||||
} else if (foundCaller) {
|
||||
return ctor.prototype[optMethodName].apply(me, args);
|
||||
}
|
||||
}
|
||||
|
||||
// If we did not find the caller in the prototype chain,
|
||||
// then one of two things happened:
|
||||
// 1) The caller is an instance method.
|
||||
// 2) This method was not called by the right caller.
|
||||
if (me[optMethodName] === caller) {
|
||||
return me.constructor.prototype[optMethodName].apply(me, args);
|
||||
} else {
|
||||
throw Error(
|
||||
"goog.base called from a method of one name " +
|
||||
"to a method of a different name");
|
||||
}
|
||||
};
|
||||
bitjs.inherits = function(childCtor, parentCtor) {
|
||||
/** @constructor */
|
||||
function TempCtor() {}
|
||||
TempCtor.prototype = parentCtor.prototype;
|
||||
childCtor.superClass_ = parentCtor.prototype;
|
||||
childCtor.prototype = new TempCtor();
|
||||
childCtor.prototype.constructor = childCtor;
|
||||
};
|
||||
// ===========================================================================
|
||||
|
||||
/**
|
||||
* An unarchive event.
|
||||
*
|
||||
* @param {string} type The event type.
|
||||
* @constructor
|
||||
*/
|
||||
bitjs.archive.UnarchiveEvent = function(type) {
|
||||
/**
|
||||
* The event type.
|
||||
*
|
||||
* @type {string}
|
||||
*/
|
||||
this.type = type;
|
||||
};
|
||||
|
||||
/**
|
||||
* The UnarchiveEvent types.
|
||||
*/
|
||||
bitjs.archive.UnarchiveEvent.Type = {
|
||||
START: "start",
|
||||
PROGRESS: "progress",
|
||||
EXTRACT: "extract",
|
||||
FINISH: "finish",
|
||||
INFO: "info",
|
||||
ERROR: "error"
|
||||
};
|
||||
|
||||
/**
|
||||
* Useful for passing info up to the client (for debugging).
|
||||
*
|
||||
* @param {string} msg The info message.
|
||||
*/
|
||||
bitjs.archive.UnarchiveInfoEvent = function(msg) {
|
||||
bitjs.base(this, bitjs.archive.UnarchiveEvent.Type.INFO);
|
||||
|
||||
/**
|
||||
* The information message.
|
||||
*
|
||||
* @type {string}
|
||||
*/
|
||||
this.msg = msg;
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.UnarchiveInfoEvent, bitjs.archive.UnarchiveEvent);
|
||||
|
||||
/**
|
||||
* An unrecoverable error has occured.
|
||||
*
|
||||
* @param {string} msg The error message.
|
||||
*/
|
||||
bitjs.archive.UnarchiveErrorEvent = function(msg) {
|
||||
bitjs.base(this, bitjs.archive.UnarchiveEvent.Type.ERROR);
|
||||
|
||||
/**
|
||||
* The information message.
|
||||
*
|
||||
* @type {string}
|
||||
*/
|
||||
this.msg = msg;
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.UnarchiveErrorEvent, bitjs.archive.UnarchiveEvent);
|
||||
|
||||
/**
|
||||
* Start event.
|
||||
*
|
||||
* @param {string} msg The info message.
|
||||
*/
|
||||
bitjs.archive.UnarchiveStartEvent = function() {
|
||||
bitjs.base(this, bitjs.archive.UnarchiveEvent.Type.START);
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.UnarchiveStartEvent, bitjs.archive.UnarchiveEvent);
|
||||
|
||||
/**
|
||||
* Finish event.
|
||||
*
|
||||
* @param {string} msg The info message.
|
||||
*/
|
||||
bitjs.archive.UnarchiveFinishEvent = function() {
|
||||
bitjs.base(this, bitjs.archive.UnarchiveEvent.Type.FINISH);
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.UnarchiveFinishEvent, bitjs.archive.UnarchiveEvent);
|
||||
|
||||
/**
|
||||
* Progress event.
|
||||
*/
|
||||
bitjs.archive.UnarchiveProgressEvent = function(
|
||||
currentFilename,
|
||||
currentFileNumber,
|
||||
currentBytesUnarchivedInFile,
|
||||
currentBytesUnarchived,
|
||||
totalUncompressedBytesInArchive,
|
||||
totalFilesInArchive) {
|
||||
bitjs.base(this, bitjs.archive.UnarchiveEvent.Type.PROGRESS);
|
||||
|
||||
this.currentFilename = currentFilename;
|
||||
this.currentFileNumber = currentFileNumber;
|
||||
this.currentBytesUnarchivedInFile = currentBytesUnarchivedInFile;
|
||||
this.totalFilesInArchive = totalFilesInArchive;
|
||||
this.currentBytesUnarchived = currentBytesUnarchived;
|
||||
this.totalUncompressedBytesInArchive = totalUncompressedBytesInArchive;
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.UnarchiveProgressEvent, bitjs.archive.UnarchiveEvent);
|
||||
|
||||
/**
|
||||
* All extracted files returned by an Unarchiver will implement
|
||||
* the following interface:
|
||||
*
|
||||
* interface UnarchivedFile {
|
||||
* string filename
|
||||
* TypedArray fileData
|
||||
* }
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Extract event.
|
||||
*/
|
||||
bitjs.archive.UnarchiveExtractEvent = function(unarchivedFile) {
|
||||
bitjs.base(this, bitjs.archive.UnarchiveEvent.Type.EXTRACT);
|
||||
|
||||
/**
|
||||
* @type {UnarchivedFile}
|
||||
*/
|
||||
this.unarchivedFile = unarchivedFile;
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.UnarchiveExtractEvent, bitjs.archive.UnarchiveEvent);
|
||||
|
||||
|
||||
/**
|
||||
* Base class for all Unarchivers.
|
||||
*
|
||||
* @param {ArrayBuffer} arrayBuffer The Array Buffer.
|
||||
* @param {string} optPathToBitJS Optional string for where the BitJS files are located.
|
||||
* @constructor
|
||||
*/
|
||||
bitjs.archive.Unarchiver = function(arrayBuffer, optPathToBitJS) {
|
||||
/**
|
||||
* The ArrayBuffer object.
|
||||
* @type {ArrayBuffer}
|
||||
* @protected
|
||||
*/
|
||||
this.ab = arrayBuffer;
|
||||
|
||||
/**
|
||||
* The path to the BitJS files.
|
||||
* @type {string}
|
||||
* @private
|
||||
*/
|
||||
this.pathToBitJS_ = optPathToBitJS || "/";
|
||||
|
||||
/**
|
||||
* A map from event type to an array of listeners.
|
||||
* @type {Map.<string, Array>}
|
||||
*/
|
||||
this.listeners_ = {};
|
||||
for (var type in bitjs.archive.UnarchiveEvent.Type) {
|
||||
this.listeners_[bitjs.archive.UnarchiveEvent.Type[type]] = [];
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Private web worker initialized during start().
|
||||
* @type {Worker}
|
||||
* @private
|
||||
*/
|
||||
bitjs.archive.Unarchiver.prototype.worker_ = null;
|
||||
|
||||
/**
|
||||
* This method must be overridden by the subclass to return the script filename.
|
||||
* @return {string} The script filename.
|
||||
* @protected.
|
||||
*/
|
||||
bitjs.archive.Unarchiver.prototype.getScriptFileName = function() {
|
||||
throw "Subclasses of AbstractUnarchiver must overload getScriptFileName()";
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds an event listener for UnarchiveEvents.
|
||||
*
|
||||
* @param {string} Event type.
|
||||
* @param {function} An event handler function.
|
||||
*/
|
||||
bitjs.archive.Unarchiver.prototype.addEventListener = function(type, listener) {
|
||||
if (type in this.listeners_) {
|
||||
if (this.listeners_[type].indexOf(listener) === -1) {
|
||||
this.listeners_[type].push(listener);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes an event listener.
|
||||
*
|
||||
* @param {string} Event type.
|
||||
* @param {EventListener|function} An event listener or handler function.
|
||||
*/
|
||||
bitjs.archive.Unarchiver.prototype.removeEventListener = function(type, listener) {
|
||||
if (type in this.listeners_) {
|
||||
var index = this.listeners_[type].indexOf(listener);
|
||||
if (index !== -1) {
|
||||
this.listeners_[type].splice(index, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Receive an event and pass it to the listener functions.
|
||||
*
|
||||
* @param {bitjs.archive.UnarchiveEvent} e
|
||||
* @private
|
||||
*/
|
||||
bitjs.archive.Unarchiver.prototype.handleWorkerEvent_ = function(e) {
|
||||
if ((e instanceof bitjs.archive.UnarchiveEvent || e.type) &&
|
||||
this.listeners_[e.type] instanceof Array) {
|
||||
this.listeners_[e.type].forEach(function (listener) {
|
||||
listener(e);
|
||||
});
|
||||
if (e.type === bitjs.archive.UnarchiveEvent.Type.FINISH) {
|
||||
this.worker_.terminate();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Starts the unarchive in a separate Web Worker thread and returns immediately.
|
||||
*/
|
||||
bitjs.archive.Unarchiver.prototype.start = function() {
|
||||
var me = this;
|
||||
var scriptFileName = this.pathToBitJS_ + this.getScriptFileName();
|
||||
if (scriptFileName) {
|
||||
this.worker_ = new Worker(scriptFileName);
|
||||
|
||||
this.worker_.onerror = function(e) {
|
||||
throw e;
|
||||
};
|
||||
|
||||
this.worker_.onmessage = function(e) {
|
||||
if (typeof e.data !== "string") {
|
||||
// Assume that it is an UnarchiveEvent. Some browsers preserve the 'type'
|
||||
// so that instanceof UnarchiveEvent returns true, but others do not.
|
||||
me.handleWorkerEvent_(e.data);
|
||||
}
|
||||
};
|
||||
|
||||
this.worker_.postMessage({file: this.ab});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Terminates the Web Worker for this Unarchiver and returns immediately.
|
||||
*/
|
||||
bitjs.archive.Unarchiver.prototype.stop = function() {
|
||||
if (this.worker_) {
|
||||
this.worker_.terminate();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Unzipper
|
||||
* @extends {bitjs.archive.Unarchiver}
|
||||
* @constructor
|
||||
*/
|
||||
bitjs.archive.Unzipper = function(arrayBuffer, optPathToBitJS) {
|
||||
bitjs.base(this, arrayBuffer, optPathToBitJS);
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.Unzipper, bitjs.archive.Unarchiver);
|
||||
bitjs.archive.Unzipper.prototype.getScriptFileName = function() {
|
||||
return "unzip.js";
|
||||
};
|
||||
|
||||
/**
|
||||
* Unrarrer
|
||||
* @extends {bitjs.archive.Unarchiver}
|
||||
* @constructor
|
||||
*/
|
||||
bitjs.archive.Unrarrer = function(arrayBuffer, optPathToBitJS) {
|
||||
bitjs.base(this, arrayBuffer, optPathToBitJS);
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.Unrarrer, bitjs.archive.Unarchiver);
|
||||
bitjs.archive.Unrarrer.prototype.getScriptFileName = function() {
|
||||
return "unrar.js";
|
||||
};
|
||||
|
||||
/**
|
||||
* Untarrer
|
||||
* @extends {bitjs.archive.Unarchiver}
|
||||
* @constructor
|
||||
*/
|
||||
bitjs.archive.Untarrer = function(arrayBuffer, optPathToBitJS) {
|
||||
bitjs.base(this, arrayBuffer, optPathToBitJS);
|
||||
};
|
||||
bitjs.inherits(bitjs.archive.Untarrer, bitjs.archive.Unarchiver);
|
||||
bitjs.archive.Untarrer.prototype.getScriptFileName = function() {
|
||||
return "untar.js";
|
||||
};
|
||||
|
||||
/**
|
||||
* Factory method that creates an unarchiver based on the byte signature found
|
||||
* in the arrayBuffer.
|
||||
* @param {ArrayBuffer} ab
|
||||
* @param {string=} optPathToBitJS Path to the unarchiver script files.
|
||||
* @return {bitjs.archive.Unarchiver}
|
||||
*/
|
||||
bitjs.archive.GetUnarchiver = function(ab, optPathToBitJS) {
|
||||
var unarchiver = null;
|
||||
var pathToBitJS = optPathToBitJS || "";
|
||||
var h = new Uint8Array(ab, 0, 10);
|
||||
|
||||
if (h[0] === 0x52 && h[1] === 0x61 && h[2] === 0x72 && h[3] === 0x21) { // Rar!
|
||||
unarchiver = new bitjs.archive.Unrarrer(ab, pathToBitJS);
|
||||
} else if (h[0] === 80 && h[1] === 75) { // PK (Zip)
|
||||
unarchiver = new bitjs.archive.Unzipper(ab, pathToBitJS);
|
||||
} else { // Try with tar
|
||||
unarchiver = new bitjs.archive.Untarrer(ab, pathToBitJS);
|
||||
}
|
||||
return unarchiver;
|
||||
};
|
||||
|
||||
})();
|
||||
@@ -1,872 +0,0 @@
|
||||
/**
|
||||
* rarvm.js
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
*
|
||||
* Copyright(c) 2017 Google Inc.
|
||||
*/
|
||||
|
||||
/**
|
||||
* CRC Implementation.
|
||||
*/
|
||||
/* global Uint8Array, Uint32Array, bitjs, DataView, mem */
|
||||
/* exported MAXWINMASK, UnpackFilter */
|
||||
|
||||
function emptyArr(n, v) {
|
||||
var arr = [];
|
||||
for (var i = 0; i < n; i += 1) {
|
||||
arr[i] = v;
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
var CRCTab = emptyArr(256, 0);
|
||||
|
||||
function initCRC() {
|
||||
for (var i = 0; i < 256; ++i) {
|
||||
var c = i;
|
||||
for (var j = 0; j < 8; ++j) {
|
||||
// Read http://stackoverflow.com/questions/6798111/bitwise-operations-on-32-bit-unsigned-ints
|
||||
// for the bitwise operator issue (JS interprets operands as 32-bit signed
|
||||
// integers and we need to deal with unsigned ones here).
|
||||
c = ((c & 1) ? ((c >>> 1) ^ 0xEDB88320) : (c >>> 1)) >>> 0;
|
||||
}
|
||||
CRCTab[i] = c;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number} startCRC
|
||||
* @param {Uint8Array} arr
|
||||
* @return {number}
|
||||
*/
|
||||
function CRC(startCRC, arr) {
|
||||
if (CRCTab[1] === 0) {
|
||||
initCRC();
|
||||
}
|
||||
|
||||
/*
|
||||
#if defined(LITTLE_ENDIAN) && defined(PRESENT_INT32) && defined(ALLOW_NOT_ALIGNED_INT)
|
||||
while (Size>0 && ((long)Data & 7))
|
||||
{
|
||||
StartCRC=CRCTab[(byte)(StartCRC^Data[0])]^(StartCRC>>8);
|
||||
Size--;
|
||||
Data++;
|
||||
}
|
||||
while (Size>=8)
|
||||
{
|
||||
StartCRC^=*(uint32 *)Data;
|
||||
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
|
||||
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
|
||||
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
|
||||
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
|
||||
StartCRC^=*(uint32 *)(Data+4);
|
||||
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
|
||||
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
|
||||
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
|
||||
StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
|
||||
Data+=8;
|
||||
Size-=8;
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
for (var i = 0; i < arr.length; ++i) {
|
||||
var byte = ((startCRC ^ arr[i]) >>> 0) & 0xff;
|
||||
startCRC = (CRCTab[byte] ^ (startCRC >>> 8)) >>> 0;
|
||||
}
|
||||
|
||||
return startCRC;
|
||||
}
|
||||
|
||||
// ============================================================================================== //
|
||||
|
||||
|
||||
/**
|
||||
* RarVM Implementation.
|
||||
*/
|
||||
var VM_MEMSIZE = 0x40000;
|
||||
var VM_MEMMASK = (VM_MEMSIZE - 1);
|
||||
var VM_GLOBALMEMADDR = 0x3C000;
|
||||
var VM_GLOBALMEMSIZE = 0x2000;
|
||||
var VM_FIXEDGLOBALSIZE = 64;
|
||||
var MAXWINSIZE = 0x400000;
|
||||
var MAXWINMASK = (MAXWINSIZE - 1);
|
||||
|
||||
/**
|
||||
*/
|
||||
var VmCommands = {
|
||||
VM_MOV: 0,
|
||||
VM_CMP: 1,
|
||||
VM_ADD: 2,
|
||||
VM_SUB: 3,
|
||||
VM_JZ: 4,
|
||||
VM_JNZ: 5,
|
||||
VM_INC: 6,
|
||||
VM_DEC: 7,
|
||||
VM_JMP: 8,
|
||||
VM_XOR: 9,
|
||||
VM_AND: 10,
|
||||
VM_OR: 11,
|
||||
VM_TEST: 12,
|
||||
VM_JS: 13,
|
||||
VM_JNS: 14,
|
||||
VM_JB: 15,
|
||||
VM_JBE: 16,
|
||||
VM_JA: 17,
|
||||
VM_JAE: 18,
|
||||
VM_PUSH: 19,
|
||||
VM_POP: 20,
|
||||
VM_CALL: 21,
|
||||
VM_RET: 22,
|
||||
VM_NOT: 23,
|
||||
VM_SHL: 24,
|
||||
VM_SHR: 25,
|
||||
VM_SAR: 26,
|
||||
VM_NEG: 27,
|
||||
VM_PUSHA: 28,
|
||||
VM_POPA: 29,
|
||||
VM_PUSHF: 30,
|
||||
VM_POPF: 31,
|
||||
VM_MOVZX: 32,
|
||||
VM_MOVSX: 33,
|
||||
VM_XCHG: 34,
|
||||
VM_MUL: 35,
|
||||
VM_DIV: 36,
|
||||
VM_ADC: 37,
|
||||
VM_SBB: 38,
|
||||
VM_PRINT: 39,
|
||||
|
||||
/*
|
||||
#ifdef VM_OPTIMIZE
|
||||
VM_MOVB, VM_MOVD, VM_CMPB, VM_CMPD,
|
||||
|
||||
VM_ADDB, VM_ADDD, VM_SUBB, VM_SUBD, VM_INCB, VM_INCD, VM_DECB, VM_DECD,
|
||||
VM_NEGB, VM_NEGD,
|
||||
#endif
|
||||
*/
|
||||
|
||||
// TODO: This enum value would be much larger if VM_OPTIMIZE.
|
||||
VM_STANDARD: 40,
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
var VmStandardFilters = {
|
||||
VMSF_NONE: 0,
|
||||
VMSF_E8: 1,
|
||||
VMSF_E8E9: 2,
|
||||
VMSF_ITANIUM: 3,
|
||||
VMSF_RGB: 4,
|
||||
VMSF_AUDIO: 5,
|
||||
VMSF_DELTA: 6,
|
||||
VMSF_UPCASE: 7,
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
var VmFlags = {
|
||||
VM_FC: 1,
|
||||
VM_FZ: 2,
|
||||
VM_FS: 0x80000000,
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
var VmOpType = {
|
||||
VM_OPREG: 0,
|
||||
VM_OPINT: 1,
|
||||
VM_OPREGMEM: 2,
|
||||
VM_OPNONE: 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* Finds the key that maps to a given value in an object. This function is useful in debugging
|
||||
* variables that use the above enums.
|
||||
* @param {Object} obj
|
||||
* @param {number} val
|
||||
* @return {string} The key/enum value as a string.
|
||||
*/
|
||||
function findKeyForValue(obj, val) {
|
||||
for (var key in obj) {
|
||||
if (obj[key] === val) {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getDebugString(obj, val) {
|
||||
var s = "Unknown.";
|
||||
if (obj === VmCommands) {
|
||||
s = "VmCommands.";
|
||||
} else if (obj === VmStandardFilters) {
|
||||
s = "VmStandardFilters.";
|
||||
} else if (obj === VmFlags) {
|
||||
s = "VmOpType.";
|
||||
} else if (obj === VmOpType) {
|
||||
s = "VmOpType.";
|
||||
}
|
||||
|
||||
return s + findKeyForValue(obj, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* @struct
|
||||
* @constructor
|
||||
*/
|
||||
var VmPreparedOperand = function() {
|
||||
/** @type {VmOpType} */
|
||||
this.Type;
|
||||
|
||||
/** @type {number} */
|
||||
this.Data = 0;
|
||||
|
||||
/** @type {number} */
|
||||
this.Base = 0;
|
||||
|
||||
// TODO: In C++ this is a uint*
|
||||
/** @type {Array<number>} */
|
||||
this.Addr = null;
|
||||
};
|
||||
|
||||
/** @return {string} */
|
||||
VmPreparedOperand.prototype.toString = function() {
|
||||
if (this.Type === null) {
|
||||
return "Error: Type was null in VmPreparedOperand";
|
||||
}
|
||||
return "{ " +
|
||||
"Type: " + getDebugString(VmOpType, this.Type) +
|
||||
", Data: " + this.Data +
|
||||
", Base: " + this.Base +
|
||||
" }";
|
||||
};
|
||||
|
||||
/**
|
||||
* @struct
|
||||
* @constructor
|
||||
*/
|
||||
var VmPreparedCommand = function() {
|
||||
/** @type {VmCommands} */
|
||||
this.OpCode;
|
||||
|
||||
/** @type {boolean} */
|
||||
this.ByteMode = false;
|
||||
|
||||
/** @type {VmPreparedOperand} */
|
||||
this.Op1 = new VmPreparedOperand();
|
||||
|
||||
/** @type {VmPreparedOperand} */
|
||||
this.Op2 = new VmPreparedOperand();
|
||||
};
|
||||
|
||||
/** @return {string} */
|
||||
VmPreparedCommand.prototype.toString = function(indent) {
|
||||
if (this.OpCode === null) {
|
||||
return "Error: OpCode was null in VmPreparedCommand";
|
||||
}
|
||||
indent = indent || "";
|
||||
return indent + "{\n" +
|
||||
indent + " OpCode: " + getDebugString(VmCommands, this.OpCode) + ",\n" +
|
||||
indent + " ByteMode: " + this.ByteMode + ",\n" +
|
||||
indent + " Op1: " + this.Op1.toString() + ",\n" +
|
||||
indent + " Op2: " + this.Op2.toString() + ",\n" +
|
||||
indent + "}";
|
||||
};
|
||||
|
||||
/**
|
||||
* @struct
|
||||
* @constructor
|
||||
*/
|
||||
var VmPreparedProgram = function() {
|
||||
/** @type {Array<VmPreparedCommand>} */
|
||||
this.Cmd = [];
|
||||
|
||||
/** @type {Array<VmPreparedCommand>} */
|
||||
this.AltCmd = null;
|
||||
|
||||
/** @type {Uint8Array} */
|
||||
this.GlobalData = new Uint8Array();
|
||||
|
||||
/** @type {Uint8Array} */
|
||||
this.StaticData = new Uint8Array(); // static data contained in DB operators
|
||||
|
||||
/** @type {Uint32Array} */
|
||||
this.InitR = new Uint32Array(7);
|
||||
|
||||
/**
|
||||
* A pointer to bytes that have been filtered by a program.
|
||||
* @type {Uint8Array}
|
||||
*/
|
||||
this.FilteredData = null;
|
||||
};
|
||||
|
||||
/** @return {string} */
|
||||
VmPreparedProgram.prototype.toString = function() {
|
||||
var s = "{\n Cmd: [\n";
|
||||
for (var i = 0; i < this.Cmd.length; ++i) {
|
||||
s += this.Cmd[i].toString(" ") + ",\n";
|
||||
}
|
||||
s += "],\n";
|
||||
// TODO: Dump GlobalData, StaticData, InitR?
|
||||
s += " }\n";
|
||||
return s;
|
||||
};
|
||||
|
||||
/**
|
||||
* @struct
|
||||
* @constructor
|
||||
*/
|
||||
var UnpackFilter = function() {
|
||||
/** @type {number} */
|
||||
this.BlockStart = 0;
|
||||
|
||||
/** @type {number} */
|
||||
this.BlockLength = 0;
|
||||
|
||||
/** @type {number} */
|
||||
this.ExecCount = 0;
|
||||
|
||||
/** @type {boolean} */
|
||||
this.NextWindow = false;
|
||||
|
||||
// position of parent filter in Filters array used as prototype for filter
|
||||
// in PrgStack array. Not defined for filters in Filters array.
|
||||
/** @type {number} */
|
||||
this.ParentFilter = null;
|
||||
|
||||
/** @type {VmPreparedProgram} */
|
||||
this.Prg = new VmPreparedProgram();
|
||||
};
|
||||
|
||||
var VMCF_OP0 = 0;
|
||||
var VMCF_OP1 = 1;
|
||||
var VMCF_OP2 = 2;
|
||||
var VMCF_OPMASK = 3;
|
||||
var VMCF_BYTEMODE = 4;
|
||||
var VMCF_JUMP = 8;
|
||||
var VMCF_PROC = 16;
|
||||
var VMCF_USEFLAGS = 32;
|
||||
var VMCF_CHFLAGS = 64;
|
||||
|
||||
var VmCmdFlags = [
|
||||
/* VM_MOV */
|
||||
VMCF_OP2 | VMCF_BYTEMODE,
|
||||
/* VM_CMP */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_ADD */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_SUB */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_JZ */
|
||||
VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS,
|
||||
/* VM_JNZ */
|
||||
VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS,
|
||||
/* VM_INC */
|
||||
VMCF_OP1 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_DEC */
|
||||
VMCF_OP1 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_JMP */
|
||||
VMCF_OP1 | VMCF_JUMP,
|
||||
/* VM_XOR */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_AND */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_OR */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_TEST */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_JS */
|
||||
VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS,
|
||||
/* VM_JNS */
|
||||
VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS,
|
||||
/* VM_JB */
|
||||
VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS,
|
||||
/* VM_JBE */
|
||||
VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS,
|
||||
/* VM_JA */
|
||||
VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS,
|
||||
/* VM_JAE */
|
||||
VMCF_OP1 | VMCF_JUMP | VMCF_USEFLAGS,
|
||||
/* VM_PUSH */
|
||||
VMCF_OP1,
|
||||
/* VM_POP */
|
||||
VMCF_OP1,
|
||||
/* VM_CALL */
|
||||
VMCF_OP1 | VMCF_PROC,
|
||||
/* VM_RET */
|
||||
VMCF_OP0 | VMCF_PROC,
|
||||
/* VM_NOT */
|
||||
VMCF_OP1 | VMCF_BYTEMODE,
|
||||
/* VM_SHL */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_SHR */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_SAR */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_NEG */
|
||||
VMCF_OP1 | VMCF_BYTEMODE | VMCF_CHFLAGS,
|
||||
/* VM_PUSHA */
|
||||
VMCF_OP0,
|
||||
/* VM_POPA */
|
||||
VMCF_OP0,
|
||||
/* VM_PUSHF */
|
||||
VMCF_OP0 | VMCF_USEFLAGS,
|
||||
/* VM_POPF */
|
||||
VMCF_OP0 | VMCF_CHFLAGS,
|
||||
/* VM_MOVZX */
|
||||
VMCF_OP2,
|
||||
/* VM_MOVSX */
|
||||
VMCF_OP2,
|
||||
/* VM_XCHG */
|
||||
VMCF_OP2 | VMCF_BYTEMODE,
|
||||
/* VM_MUL */
|
||||
VMCF_OP2 | VMCF_BYTEMODE,
|
||||
/* VM_DIV */
|
||||
VMCF_OP2 | VMCF_BYTEMODE,
|
||||
/* VM_ADC */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_USEFLAGS | VMCF_CHFLAGS,
|
||||
/* VM_SBB */
|
||||
VMCF_OP2 | VMCF_BYTEMODE | VMCF_USEFLAGS | VMCF_CHFLAGS,
|
||||
/* VM_PRINT */
|
||||
VMCF_OP0,
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* @param {number} length
|
||||
* @param {number} crc
|
||||
* @param {VmStandardFilters} type
|
||||
* @struct
|
||||
* @constructor
|
||||
*/
|
||||
var StandardFilterSignature = function(length, crc, type) {
|
||||
/** @type {number} */
|
||||
this.Length = length;
|
||||
|
||||
/** @type {number} */
|
||||
this.CRC = crc;
|
||||
|
||||
/** @type {VmStandardFilters} */
|
||||
this.Type = type;
|
||||
};
|
||||
|
||||
/**
|
||||
* @type {Array<StandardFilterSignature>}
|
||||
*/
|
||||
var StdList = [
|
||||
new StandardFilterSignature(53, 0xad576887, VmStandardFilters.VMSF_E8),
|
||||
new StandardFilterSignature(57, 0x3cd7e57e, VmStandardFilters.VMSF_E8E9),
|
||||
new StandardFilterSignature(120, 0x3769893f, VmStandardFilters.VMSF_ITANIUM),
|
||||
new StandardFilterSignature(29, 0x0e06077d, VmStandardFilters.VMSF_DELTA),
|
||||
new StandardFilterSignature(149, 0x1c2c5dc8, VmStandardFilters.VMSF_RGB),
|
||||
new StandardFilterSignature(216, 0xbc85e701, VmStandardFilters.VMSF_AUDIO),
|
||||
new StandardFilterSignature(40, 0x46b9c560, VmStandardFilters.VMSF_UPCASE),
|
||||
];
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
var RarVM = function() {
|
||||
/** @private {Uint8Array} */
|
||||
this.mem_ = null;
|
||||
|
||||
/** @private {Uint32Array<number>} */
|
||||
this.R_ = new Uint32Array(8);
|
||||
|
||||
/** @private {number} */
|
||||
this.flags_ = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Initializes the memory of the VM.
|
||||
*/
|
||||
RarVM.prototype.init = function() {
|
||||
if (!this.mem_) {
|
||||
this.mem_ = new Uint8Array(VM_MEMSIZE);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Uint8Array} code
|
||||
* @return {VmStandardFilters}
|
||||
*/
|
||||
RarVM.prototype.isStandardFilter = function(code) {
|
||||
var codeCRC = (CRC(0xffffffff, code, code.length) ^ 0xffffffff) >>> 0;
|
||||
for (var i = 0; i < StdList.length; ++i) {
|
||||
if (StdList[i].CRC === codeCRC && StdList[i].Length === code.length) {
|
||||
return StdList[i].Type;
|
||||
}
|
||||
}
|
||||
|
||||
return VmStandardFilters.VMSF_NONE;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {VmPreparedOperand} op
|
||||
* @param {boolean} byteMode
|
||||
* @param {bitjs.io.BitStream} bstream A rtl bit stream.
|
||||
*/
|
||||
RarVM.prototype.decodeArg = function(op, byteMode, bstream) {
|
||||
var data = bstream.peekBits(16);
|
||||
if (data & 0x8000) {
|
||||
op.Type = VmOpType.VM_OPREG; // Operand is register (R[0]..R[7])
|
||||
bstream.readBits(1); // 1 flag bit and...
|
||||
op.Data = bstream.readBits(3); // ... 3 register number bits
|
||||
op.Addr = [this.R_[op.Data]]; // TODO &R[Op.Data] // Register address
|
||||
} else {
|
||||
if ((data & 0xc000) === 0) {
|
||||
op.Type = VmOpType.VM_OPINT; // Operand is integer
|
||||
bstream.readBits(2); // 2 flag bits
|
||||
if (byteMode) {
|
||||
op.Data = bstream.readBits(8); // Byte integer.
|
||||
} else {
|
||||
op.Data = RarVM.readData(bstream); // 32 bit integer.
|
||||
}
|
||||
} else {
|
||||
// Operand is data addressed by register data, base address or both.
|
||||
op.Type = VmOpType.VM_OPREGMEM;
|
||||
if ((data & 0x2000) === 0) {
|
||||
bstream.readBits(3); // 3 flag bits
|
||||
// Base address is zero, just use the address from register.
|
||||
op.Data = bstream.readBits(3); // (Data>>10)&7
|
||||
op.Addr = [this.R_[op.Data]]; // TODO &R[op.Data]
|
||||
op.Base = 0;
|
||||
} else {
|
||||
bstream.readBits(4); // 4 flag bits
|
||||
if ((data & 0x1000) === 0) {
|
||||
// Use both register and base address.
|
||||
op.Data = bstream.readBits(3);
|
||||
op.Addr = [this.R_[op.Data]]; // TODO &R[op.Data]
|
||||
} else {
|
||||
// Use base address only. Access memory by fixed address.
|
||||
op.Data = 0;
|
||||
}
|
||||
op.Base = RarVM.readData(bstream); // Read base address.
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {VmPreparedProgram} prg
|
||||
*/
|
||||
RarVM.prototype.execute = function(prg) {
|
||||
this.R_.set(prg.InitR);
|
||||
|
||||
var globalSize = Math.min(prg.GlobalData.length, VM_GLOBALMEMSIZE);
|
||||
if (globalSize) {
|
||||
this.mem_.set(prg.GlobalData.subarray(0, globalSize), VM_GLOBALMEMADDR);
|
||||
}
|
||||
|
||||
var staticSize = Math.min(prg.StaticData.length, VM_GLOBALMEMSIZE - globalSize);
|
||||
if (staticSize) {
|
||||
this.mem_.set(prg.StaticData.subarray(0, staticSize), VM_GLOBALMEMADDR + globalSize);
|
||||
}
|
||||
|
||||
this.R_[7] = VM_MEMSIZE;
|
||||
this.flags_ = 0;
|
||||
|
||||
var preparedCodes = prg.AltCmd ? prg.AltCmd : prg.Cmd;
|
||||
if (prg.Cmd.length > 0 && !this.executeCode(preparedCodes)) {
|
||||
// Invalid VM program. Let's replace it with 'return' command.
|
||||
preparedCodes.OpCode = VmCommands.VM_RET;
|
||||
}
|
||||
|
||||
var dataView = new DataView(this.mem_.buffer, VM_GLOBALMEMADDR);
|
||||
var newBlockPos = dataView.getUint32(0x20, true /* little endian */ ) & VM_MEMMASK;
|
||||
var newBlockSize = dataView.getUint32(0x1c, true /* little endian */ ) & VM_MEMMASK;
|
||||
if (newBlockPos + newBlockSize >= VM_MEMSIZE) {
|
||||
newBlockPos = newBlockSize = 0;
|
||||
}
|
||||
prg.FilteredData = this.mem_.subarray(newBlockPos, newBlockPos + newBlockSize);
|
||||
|
||||
prg.GlobalData = new Uint8Array(0);
|
||||
|
||||
var dataSize = Math.min(dataView.getUint32(0x30),
|
||||
(VM_GLOBALMEMSIZE - VM_FIXEDGLOBALSIZE));
|
||||
if (dataSize !== 0) {
|
||||
var len = dataSize + VM_FIXEDGLOBALSIZE;
|
||||
prg.GlobalData = new Uint8Array(len);
|
||||
prg.GlobalData.set(mem.subarray(VM_GLOBALMEMADDR, VM_GLOBALMEMADDR + len));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Array<VmPreparedCommand>} preparedCodes
|
||||
* @return {boolean}
|
||||
*/
|
||||
RarVM.prototype.executeCode = function(preparedCodes) {
|
||||
var codeIndex = 0;
|
||||
var cmd = preparedCodes[codeIndex];
|
||||
// TODO: Why is this an infinite loop instead of just returning
|
||||
// when a VM_RET is hit?
|
||||
while (1) {
|
||||
switch (cmd.OpCode) {
|
||||
case VmCommands.VM_RET:
|
||||
if (this.R_[7] >= VM_MEMSIZE) {
|
||||
return true;
|
||||
}
|
||||
//SET_IP(GET_VALUE(false,(uint *)&Mem[R[7] & VM_MEMMASK]));
|
||||
this.R_[7] += 4;
|
||||
continue;
|
||||
|
||||
case VmCommands.VM_STANDARD:
|
||||
this.executeStandardFilter(cmd.Op1.Data);
|
||||
break;
|
||||
|
||||
default:
|
||||
console.error("RarVM OpCode not supported: " + getDebugString(VmCommands, cmd.OpCode));
|
||||
break;
|
||||
} // switch (cmd.OpCode)
|
||||
codeIndex++;
|
||||
cmd = preparedCodes[codeIndex];
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {number} filterType
|
||||
*/
|
||||
RarVM.prototype.executeStandardFilter = function(filterType) {
|
||||
switch (filterType) {
|
||||
case VmStandardFilters.VMSF_DELTA:
|
||||
var dataSize = this.R_[4];
|
||||
var channels = this.R_[0];
|
||||
var srcPos = 0;
|
||||
var border = dataSize * 2;
|
||||
|
||||
//SET_VALUE(false,&Mem[VM_GLOBALMEMADDR+0x20],DataSize);
|
||||
var dataView = new DataView(this.mem_.buffer, VM_GLOBALMEMADDR);
|
||||
dataView.setUint32(0x20, dataSize, true /* little endian */ );
|
||||
|
||||
if (dataSize >= VM_GLOBALMEMADDR / 2) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Bytes from same channels are grouped to continual data blocks,
|
||||
// so we need to place them back to their interleaving positions.
|
||||
for (var curChannel = 0; curChannel < channels; ++curChannel) {
|
||||
var prevByte = 0;
|
||||
for (var destPos = dataSize + curChannel; destPos < border; destPos += channels) {
|
||||
prevByte = (prevByte - this.mem_[srcPos++]) & 0xff;
|
||||
this.mem_[destPos] = prevByte;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
console.error("RarVM Standard Filter not supported: " + getDebugString(VmStandardFilters, filterType));
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Uint8Array} code
|
||||
* @param {VmPreparedProgram} prg
|
||||
*/
|
||||
RarVM.prototype.prepare = function(code, prg) {
|
||||
var codeSize = code.length;
|
||||
var i;
|
||||
var curCmd;
|
||||
|
||||
//InitBitInput();
|
||||
//memcpy(InBuf,Code,Min(CodeSize,BitInput::MAX_SIZE));
|
||||
var bstream = new bitjs.io.BitStream(code.buffer, true /* rtl */ );
|
||||
|
||||
// Calculate the single byte XOR checksum to check validity of VM code.
|
||||
var xorSum = 0;
|
||||
for (i = 1; i < codeSize; ++i) {
|
||||
xorSum ^= code[i];
|
||||
}
|
||||
|
||||
bstream.readBits(8);
|
||||
|
||||
prg.Cmd = []; // TODO: Is this right? I don't see it being done in rarvm.cpp.
|
||||
|
||||
// VM code is valid if equal.
|
||||
if (xorSum === code[0]) {
|
||||
var filterType = this.isStandardFilter(code);
|
||||
if (filterType !== VmStandardFilters.VMSF_NONE) {
|
||||
// VM code is found among standard filters.
|
||||
curCmd = new VmPreparedCommand();
|
||||
prg.Cmd.push(curCmd);
|
||||
|
||||
curCmd.OpCode = VmCommands.VM_STANDARD;
|
||||
curCmd.Op1.Data = filterType;
|
||||
// TODO: Addr=&CurCmd->Op1.Data
|
||||
curCmd.Op1.Addr = [curCmd.Op1.Data];
|
||||
curCmd.Op2.Addr = [null]; // &CurCmd->Op2.Data;
|
||||
curCmd.Op1.Type = VmOpType.VM_OPNONE;
|
||||
curCmd.Op2.Type = VmOpType.VM_OPNONE;
|
||||
codeSize = 0;
|
||||
}
|
||||
|
||||
var dataFlag = bstream.readBits(1);
|
||||
|
||||
// Read static data contained in DB operators. This data cannot be
|
||||
// changed, it is a part of VM code, not a filter parameter.
|
||||
|
||||
if (dataFlag & 0x8000) {
|
||||
var dataSize = RarVM.readData(bstream) + 1;
|
||||
// TODO: This accesses the byte pointer of the bstream directly. Is that ok?
|
||||
for (i = 0; i < bstream.bytePtr < codeSize && i < dataSize; ++i) {
|
||||
// Append a byte to the program's static data.
|
||||
var newStaticData = new Uint8Array(prg.StaticData.length + 1);
|
||||
newStaticData.set(prg.StaticData);
|
||||
newStaticData[newStaticData.length - 1] = bstream.readBits(8);
|
||||
prg.StaticData = newStaticData;
|
||||
}
|
||||
}
|
||||
|
||||
while (bstream.bytePtr < codeSize) {
|
||||
curCmd = new VmPreparedCommand();
|
||||
prg.Cmd.push(curCmd); // Prg->Cmd.Add(1)
|
||||
var flag = bstream.peekBits(1);
|
||||
if (!flag) { // (Data&0x8000)==0
|
||||
curCmd.OpCode = bstream.readBits(4);
|
||||
} else {
|
||||
curCmd.OpCode = (bstream.readBits(6) - 24);
|
||||
}
|
||||
|
||||
if (VmCmdFlags[curCmd.OpCode] & VMCF_BYTEMODE) {
|
||||
curCmd.ByteMode = (bstream.readBits(1) !== 0);
|
||||
} else {
|
||||
curCmd.ByteMode = 0;
|
||||
}
|
||||
curCmd.Op1.Type = VmOpType.VM_OPNONE;
|
||||
curCmd.Op2.Type = VmOpType.VM_OPNONE;
|
||||
var opNum = (VmCmdFlags[curCmd.OpCode] & VMCF_OPMASK);
|
||||
curCmd.Op1.Addr = null;
|
||||
curCmd.Op2.Addr = null;
|
||||
if (opNum > 0) {
|
||||
this.decodeArg(curCmd.Op1, curCmd.ByteMode, bstream); // reading the first operand
|
||||
if (opNum === 2) {
|
||||
this.decodeArg(curCmd.Op2, curCmd.ByteMode, bstream); // reading the second operand
|
||||
} else {
|
||||
if (curCmd.Op1.Type === VmOpType.VM_OPINT && (VmCmdFlags[curCmd.OpCode] & (VMCF_JUMP | VMCF_PROC))) {
|
||||
// Calculating jump distance.
|
||||
var distance = curCmd.Op1.Data;
|
||||
if (distance >= 256) {
|
||||
distance -= 256;
|
||||
} else {
|
||||
if (distance >= 136) {
|
||||
distance -= 264;
|
||||
} else {
|
||||
if (distance >= 16) {
|
||||
distance -= 8;
|
||||
} else {
|
||||
if (distance >= 8) {
|
||||
distance -= 16;
|
||||
}
|
||||
}
|
||||
}
|
||||
distance += prg.Cmd.length;
|
||||
}
|
||||
curCmd.Op1.Data = distance;
|
||||
}
|
||||
}
|
||||
} // if (OpNum>0)
|
||||
} // while ((uint)InAddr<CodeSize)
|
||||
} // if (XorSum==Code[0])
|
||||
|
||||
curCmd = new VmPreparedCommand();
|
||||
prg.Cmd.push(curCmd);
|
||||
curCmd.OpCode = VmCommands.VM_RET;
|
||||
// TODO: Addr=&CurCmd->Op1.Data
|
||||
curCmd.Op1.Addr = [curCmd.Op1.Data];
|
||||
curCmd.Op2.Addr = [curCmd.Op2.Data];
|
||||
curCmd.Op1.Type = VmOpType.VM_OPNONE;
|
||||
curCmd.Op2.Type = VmOpType.VM_OPNONE;
|
||||
|
||||
// If operand 'Addr' field has not been set by DecodeArg calls above,
|
||||
// let's set it to point to operand 'Data' field. It is necessary for
|
||||
// VM_OPINT type operands (usual integers) or maybe if something was
|
||||
// not set properly for other operands. 'Addr' field is required
|
||||
// for quicker addressing of operand data.
|
||||
for (i = 0; i < prg.Cmd.length; ++i) {
|
||||
var cmd = prg.Cmd[i];
|
||||
if (cmd.Op1.Addr === null) {
|
||||
cmd.Op1.Addr = [cmd.Op1.Data];
|
||||
}
|
||||
if (cmd.Op2.Addr === null) {
|
||||
cmd.Op2.Addr = [cmd.Op2.Data];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
#ifdef VM_OPTIMIZE
|
||||
if (CodeSize!=0)
|
||||
Optimize(Prg);
|
||||
#endif
|
||||
*/
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Uint8Array} arr The byte array to set a value in.
|
||||
* @param {number} value The unsigned 32-bit value to set.
|
||||
* @param {number} offset Offset into arr to start setting the value, defaults to 0.
|
||||
*/
|
||||
RarVM.prototype.setLowEndianValue = function(arr, value, offset) {
|
||||
var i = offset || 0;
|
||||
arr[i] = value & 0xff;
|
||||
arr[i + 1] = (value >>> 8) & 0xff;
|
||||
arr[i + 2] = (value >>> 16) & 0xff;
|
||||
arr[i + 3] = (value >>> 24) & 0xff;
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets a number of bytes of the VM memory at the given position from a
|
||||
* source buffer of bytes.
|
||||
* @param {number} pos The position in the VM memory to start writing to.
|
||||
* @param {Uint8Array} buffer The source buffer of bytes.
|
||||
* @param {number} dataSize The number of bytes to set.
|
||||
*/
|
||||
RarVM.prototype.setMemory = function(pos, buffer, dataSize) {
|
||||
if (pos < VM_MEMSIZE) {
|
||||
var numBytes = Math.min(dataSize, VM_MEMSIZE - pos);
|
||||
for (var i = 0; i < numBytes; ++i) {
|
||||
this.mem_[pos + i] = buffer[i];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Static function that reads in the next set of bits for the VM
|
||||
* (might return 4, 8, 16 or 32 bits).
|
||||
* @param {bitjs.io.BitStream} bstream A RTL bit stream.
|
||||
* @return {number} The value of the bits read.
|
||||
*/
|
||||
RarVM.readData = function(bstream) {
|
||||
// Read in the first 2 bits.
|
||||
var flags = bstream.readBits(2);
|
||||
switch (flags) { // Data&0xc000
|
||||
// Return the next 4 bits.
|
||||
case 0:
|
||||
return bstream.readBits(4); // (Data>>10)&0xf
|
||||
|
||||
case 1: // 0x4000
|
||||
// 0x3c00 => 0011 1100 0000 0000
|
||||
if (bstream.peekBits(4) === 0) { // (Data&0x3c00)==0
|
||||
// Skip the 4 zero bits.
|
||||
bstream.readBits(4);
|
||||
// Read in the next 8 and pad with 1s to 32 bits.
|
||||
return (0xffffff00 | bstream.readBits(8)) >>> 0; // ((Data>>2)&0xff)
|
||||
}
|
||||
|
||||
// Else, read in the next 8.
|
||||
return bstream.readBits(8);
|
||||
|
||||
// Read in the next 16.
|
||||
case 2: // 0x8000
|
||||
var val = bstream.getBits();
|
||||
bstream.readBits(16);
|
||||
return val; //bstream.readBits(16);
|
||||
|
||||
// case 3
|
||||
default:
|
||||
return (bstream.readBits(16) << 16) | bstream.readBits(16);
|
||||
}
|
||||
};
|
||||
|
||||
// ============================================================================================== //
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,179 +0,0 @@
|
||||
/**
|
||||
* untar.js
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
*
|
||||
* Copyright(c) 2011 Google Inc.
|
||||
*
|
||||
* Reference Documentation:
|
||||
*
|
||||
* TAR format: http://www.gnu.org/software/automake/manual/tar/Standard.html
|
||||
*/
|
||||
|
||||
/* global bitjs, importScripts, Uint8Array */
|
||||
|
||||
// This file expects to be invoked as a Worker (see onmessage below).
|
||||
importScripts("../io/bytestream.js");
|
||||
importScripts("archive.js");
|
||||
|
||||
// Progress variables.
|
||||
var currentFilename = "";
|
||||
var currentFileNumber = 0;
|
||||
var currentBytesUnarchivedInFile = 0;
|
||||
var currentBytesUnarchived = 0;
|
||||
var totalUncompressedBytesInArchive = 0;
|
||||
var totalFilesInArchive = 0;
|
||||
var allLocalFiles = [];
|
||||
|
||||
// Helper functions.
|
||||
var info = function(str) {
|
||||
postMessage(new bitjs.archive.UnarchiveInfoEvent(str));
|
||||
};
|
||||
var err = function(str) {
|
||||
postMessage(new bitjs.archive.UnarchiveErrorEvent(str));
|
||||
};
|
||||
|
||||
// Removes all characters from the first zero-byte in the string onwards.
|
||||
var readCleanString = function(bstr, numBytes) {
|
||||
var str = bstr.readString(numBytes);
|
||||
var zIndex = str.indexOf(String.fromCharCode(0));
|
||||
return zIndex != -1 ? str.substr(0, zIndex) : str;
|
||||
};
|
||||
|
||||
var postProgress = function() {
|
||||
postMessage(new bitjs.archive.UnarchiveProgressEvent(
|
||||
currentFilename,
|
||||
currentFileNumber,
|
||||
currentBytesUnarchivedInFile,
|
||||
currentBytesUnarchived,
|
||||
totalUncompressedBytesInArchive,
|
||||
totalFilesInArchive
|
||||
));
|
||||
};
|
||||
|
||||
// takes a ByteStream and parses out the local file information
|
||||
var TarLocalFile = function(bstream) {
|
||||
this.isValid = false;
|
||||
|
||||
var bytesRead = 0;
|
||||
|
||||
// Read in the header block
|
||||
this.name = readCleanString(bstream, 100);
|
||||
this.mode = readCleanString(bstream, 8);
|
||||
this.uid = readCleanString(bstream, 8);
|
||||
this.gid = readCleanString(bstream, 8);
|
||||
this.size = parseInt(readCleanString(bstream, 12), 8);
|
||||
this.mtime = readCleanString(bstream, 12);
|
||||
this.chksum = readCleanString(bstream, 8);
|
||||
this.typeflag = readCleanString(bstream, 1);
|
||||
this.linkname = readCleanString(bstream, 100);
|
||||
this.maybeMagic = readCleanString(bstream, 6);
|
||||
|
||||
if (this.maybeMagic === "ustar") {
|
||||
this.version = readCleanString(bstream, 2);
|
||||
this.uname = readCleanString(bstream, 32);
|
||||
this.gname = readCleanString(bstream, 32);
|
||||
this.devmajor = readCleanString(bstream, 8);
|
||||
this.devminor = readCleanString(bstream, 8);
|
||||
this.prefix = readCleanString(bstream, 155);
|
||||
|
||||
if (this.prefix.length) {
|
||||
this.name = this.prefix + this.name;
|
||||
}
|
||||
bstream.readBytes(12); // 512 - 500
|
||||
} else {
|
||||
bstream.readBytes(255); // 512 - 257
|
||||
}
|
||||
|
||||
bytesRead += 512;
|
||||
|
||||
// Done header, now rest of blocks are the file contents.
|
||||
this.filename = this.name;
|
||||
this.fileData = null;
|
||||
|
||||
info("Untarring file '" + this.filename + "'");
|
||||
info(" size = " + this.size);
|
||||
info(" typeflag = " + this.typeflag);
|
||||
|
||||
// A regular file.
|
||||
if (this.typeflag == 0) {
|
||||
info(" This is a regular file.");
|
||||
var sizeInBytes = parseInt(this.size);
|
||||
this.fileData = new Uint8Array(bstream.readBytes(sizeInBytes));
|
||||
bytesRead += sizeInBytes;
|
||||
if (this.name.length > 0 && this.size > 0 && this.fileData && this.fileData.buffer) {
|
||||
this.isValid = true;
|
||||
}
|
||||
|
||||
// Round up to 512-byte blocks.
|
||||
var remaining = 512 - (bytesRead % 512);
|
||||
if (remaining > 0 && remaining < 512) {
|
||||
bstream.readBytes(remaining);
|
||||
}
|
||||
} else if (this.typeflag == 5) {
|
||||
info(" This is a directory.");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
var untar = function(arrayBuffer) {
|
||||
postMessage(new bitjs.archive.UnarchiveStartEvent());
|
||||
currentFilename = "";
|
||||
currentFileNumber = 0;
|
||||
currentBytesUnarchivedInFile = 0;
|
||||
currentBytesUnarchived = 0;
|
||||
totalUncompressedBytesInArchive = 0;
|
||||
totalFilesInArchive = 0;
|
||||
allLocalFiles = [];
|
||||
|
||||
var bstream = new bitjs.io.ByteStream(arrayBuffer);
|
||||
postProgress();
|
||||
/*
|
||||
// go through whole file, read header of each block and memorize, filepointer
|
||||
*/
|
||||
while (bstream.peekNumber(4) !== 0) {
|
||||
var localFile = new TarLocalFile(bstream);
|
||||
allLocalFiles.push(localFile);
|
||||
postProgress();
|
||||
}
|
||||
// got all local files, now sort them
|
||||
allLocalFiles.sort(alphanumCase);
|
||||
|
||||
allLocalFiles.forEach(function(oneLocalFile) {
|
||||
// While we don't encounter an empty block, keep making TarLocalFiles.
|
||||
if (oneLocalFile && oneLocalFile.isValid) {
|
||||
// If we make it to this point and haven't thrown an error, we have successfully
|
||||
// read in the data for a local file, so we can update the actual bytestream.
|
||||
totalUncompressedBytesInArchive += oneLocalFile.size;
|
||||
|
||||
// update progress
|
||||
currentFilename = oneLocalFile.filename;
|
||||
currentFileNumber = totalFilesInArchive++;
|
||||
currentBytesUnarchivedInFile = oneLocalFile.size;
|
||||
currentBytesUnarchived += oneLocalFile.size;
|
||||
postMessage(new bitjs.archive.UnarchiveExtractEvent(oneLocalFile));
|
||||
postProgress();
|
||||
}
|
||||
});
|
||||
totalFilesInArchive = allLocalFiles.length;
|
||||
|
||||
postProgress();
|
||||
postMessage(new bitjs.archive.UnarchiveFinishEvent());
|
||||
};
|
||||
|
||||
// event.data.file has the first ArrayBuffer.
|
||||
// event.data.bytes has all subsequent ArrayBuffers.
|
||||
onmessage = function(event) {
|
||||
try {
|
||||
untar(event.data.file, true);
|
||||
} catch (e) {
|
||||
if (typeof e === "string" && e.startsWith("Error! Overflowed")) {
|
||||
// Overrun the buffer.
|
||||
// unarchiveState = UnarchiveState.WAITING;
|
||||
} else {
|
||||
err("Found an error while untarring");
|
||||
err(e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1,660 +0,0 @@
|
||||
/**
|
||||
* unzip.js
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
*
|
||||
* Copyright(c) 2011 Google Inc.
|
||||
* Copyright(c) 2011 antimatter15
|
||||
*
|
||||
* Reference Documentation:
|
||||
*
|
||||
* ZIP format: http://www.pkware.com/documents/casestudies/APPNOTE.TXT
|
||||
* DEFLATE format: http://tools.ietf.org/html/rfc1951
|
||||
*/
|
||||
/* global bitjs, importScripts, Uint8Array*/
|
||||
|
||||
// This file expects to be invoked as a Worker (see onmessage below).
|
||||
importScripts("../io/bitstream.js");
|
||||
importScripts("../io/bytebuffer.js");
|
||||
importScripts("../io/bytestream.js");
|
||||
importScripts("archive.js");
|
||||
|
||||
// Progress variables.
|
||||
var currentFilename = "";
|
||||
var currentFileNumber = 0;
|
||||
var currentBytesUnarchivedInFile = 0;
|
||||
var currentBytesUnarchived = 0;
|
||||
var totalUncompressedBytesInArchive = 0;
|
||||
var totalFilesInArchive = 0;
|
||||
|
||||
// Helper functions.
|
||||
var info = function(str) {
|
||||
postMessage(new bitjs.archive.UnarchiveInfoEvent(str));
|
||||
};
|
||||
var err = function(str) {
|
||||
postMessage(new bitjs.archive.UnarchiveErrorEvent(str));
|
||||
};
|
||||
var postProgress = function() {
|
||||
postMessage(new bitjs.archive.UnarchiveProgressEvent(
|
||||
currentFilename,
|
||||
currentFileNumber,
|
||||
currentBytesUnarchivedInFile,
|
||||
currentBytesUnarchived,
|
||||
totalUncompressedBytesInArchive,
|
||||
totalFilesInArchive));
|
||||
};
|
||||
|
||||
var zLocalFileHeaderSignature = 0x04034b50;
|
||||
var zArchiveExtraDataSignature = 0x08064b50;
|
||||
var zCentralFileHeaderSignature = 0x02014b50;
|
||||
var zDigitalSignatureSignature = 0x05054b50;
|
||||
|
||||
// takes a ByteStream and parses out the local file information
|
||||
var ZipLocalFile = function(bstream) {
|
||||
if (typeof bstream !== typeof {} || !bstream.readNumber || typeof bstream.readNumber !== typeof function() {}) {
|
||||
return null;
|
||||
}
|
||||
|
||||
bstream.readNumber(4); // swallow signature
|
||||
this.version = bstream.readNumber(2);
|
||||
this.generalPurpose = bstream.readNumber(2);
|
||||
this.compressionMethod = bstream.readNumber(2);
|
||||
this.lastModFileTime = bstream.readNumber(2);
|
||||
this.lastModFileDate = bstream.readNumber(2);
|
||||
this.crc32 = bstream.readNumber(4);
|
||||
this.compressedSize = bstream.readNumber(4);
|
||||
this.uncompressedSize = bstream.readNumber(4);
|
||||
this.fileNameLength = bstream.readNumber(2);
|
||||
this.extraFieldLength = bstream.readNumber(2);
|
||||
|
||||
this.filename = null;
|
||||
if (this.fileNameLength > 0) {
|
||||
this.filename = bstream.readString(this.fileNameLength);
|
||||
}
|
||||
|
||||
this.extraField = null;
|
||||
if (this.extraFieldLength > 0) {
|
||||
this.extraField = bstream.readString(this.extraFieldLength);
|
||||
info(" extra field=" + this.extraField);
|
||||
}
|
||||
|
||||
// read in the compressed data
|
||||
this.fileData = null;
|
||||
if (this.compressedSize > 0) {
|
||||
this.fileData = new Uint8Array(bstream.bytes.buffer, bstream.ptr, this.compressedSize);
|
||||
bstream.ptr += this.compressedSize;
|
||||
}
|
||||
|
||||
// TODO: deal with data descriptor if present (we currently assume no data descriptor!)
|
||||
// "This descriptor exists only if bit 3 of the general purpose bit flag is set"
|
||||
// But how do you figure out how big the file data is if you don't know the compressedSize
|
||||
// from the header?!?
|
||||
if ((this.generalPurpose & bitjs.BIT[3]) !== 0) {
|
||||
this.crc32 = bstream.readNumber(4);
|
||||
this.compressedSize = bstream.readNumber(4);
|
||||
this.uncompressedSize = bstream.readNumber(4);
|
||||
}
|
||||
|
||||
// Now that we have all the bytes for this file, we can print out some information.
|
||||
info("Zip Local File Header:");
|
||||
info(" version=" + this.version);
|
||||
info(" general purpose=" + this.generalPurpose);
|
||||
info(" compression method=" + this.compressionMethod);
|
||||
info(" last mod file time=" + this.lastModFileTime);
|
||||
info(" last mod file date=" + this.lastModFileDate);
|
||||
info(" crc32=" + this.crc32);
|
||||
info(" compressed size=" + this.compressedSize);
|
||||
info(" uncompressed size=" + this.uncompressedSize);
|
||||
info(" file name length=" + this.fileNameLength);
|
||||
info(" extra field length=" + this.extraFieldLength);
|
||||
info(" filename = '" + this.filename + "'");
|
||||
|
||||
};
|
||||
|
||||
// determine what kind of compressed data we have and decompress
|
||||
ZipLocalFile.prototype.unzip = function() {
|
||||
|
||||
// Zip Version 1.0, no compression (store only)
|
||||
if (this.compressionMethod === 0 ) {
|
||||
info("ZIP v" + this.version + ", store only: " + this.filename + " (" + this.compressedSize + " bytes)");
|
||||
currentBytesUnarchivedInFile = this.compressedSize;
|
||||
currentBytesUnarchived += this.compressedSize;
|
||||
this.fileData = zeroCompression(this.fileData, this.uncompressedSize);
|
||||
} else if (this.compressionMethod === 8) {
|
||||
// version == 20, compression method == 8 (DEFLATE)
|
||||
info("ZIP v2.0, DEFLATE: " + this.filename + " (" + this.compressedSize + " bytes)");
|
||||
this.fileData = inflate(this.fileData, this.uncompressedSize);
|
||||
} else {
|
||||
err("UNSUPPORTED VERSION/FORMAT: ZIP v" + this.version + ", compression method=" + this.compressionMethod + ": " + this.filename + " (" + this.compressedSize + " bytes)");
|
||||
this.fileData = null;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Takes an ArrayBuffer of a zip file in
|
||||
// returns null on error
|
||||
// returns an array of DecompressedFile objects on success
|
||||
// ToDo This function differs
|
||||
var unzip = function(arrayBuffer) {
|
||||
postMessage(new bitjs.archive.UnarchiveStartEvent());
|
||||
|
||||
currentFilename = "";
|
||||
currentFileNumber = 0;
|
||||
currentBytesUnarchivedInFile = 0;
|
||||
currentBytesUnarchived = 0;
|
||||
totalUncompressedBytesInArchive = 0;
|
||||
totalFilesInArchive = 0;
|
||||
currentBytesUnarchived = 0;
|
||||
|
||||
var bstream = new bitjs.io.ByteStream(arrayBuffer);
|
||||
// detect local file header signature or return null
|
||||
if (bstream.peekNumber(4) === zLocalFileHeaderSignature) {
|
||||
var localFiles = [];
|
||||
// loop until we don't see any more local files
|
||||
while (bstream.peekNumber(4) === zLocalFileHeaderSignature) {
|
||||
var oneLocalFile = new ZipLocalFile(bstream);
|
||||
// this should strip out directories/folders
|
||||
if (oneLocalFile && oneLocalFile.uncompressedSize > 0 && oneLocalFile.fileData) {
|
||||
localFiles.push(oneLocalFile);
|
||||
totalUncompressedBytesInArchive += oneLocalFile.uncompressedSize;
|
||||
}
|
||||
}
|
||||
totalFilesInArchive = localFiles.length;
|
||||
|
||||
// got all local files, now sort them
|
||||
localFiles.sort(alphanumCase);
|
||||
|
||||
// archive extra data record
|
||||
if (bstream.peekNumber(4) === zArchiveExtraDataSignature) {
|
||||
info(" Found an Archive Extra Data Signature");
|
||||
|
||||
// skipping this record for now
|
||||
bstream.readNumber(4);
|
||||
var archiveExtraFieldLength = bstream.readNumber(4);
|
||||
bstream.readString(archiveExtraFieldLength);
|
||||
}
|
||||
|
||||
// central directory structure
|
||||
// TODO: handle the rest of the structures (Zip64 stuff)
|
||||
if (bstream.peekNumber(4) === zCentralFileHeaderSignature) {
|
||||
info(" Found a Central File Header");
|
||||
|
||||
// read all file headers
|
||||
while (bstream.peekNumber(4) === zCentralFileHeaderSignature) {
|
||||
bstream.readNumber(4); // signature
|
||||
bstream.readNumber(2); // version made by
|
||||
bstream.readNumber(2); // version needed to extract
|
||||
bstream.readNumber(2); // general purpose bit flag
|
||||
bstream.readNumber(2); // compression method
|
||||
bstream.readNumber(2); // last mod file time
|
||||
bstream.readNumber(2); // last mod file date
|
||||
bstream.readNumber(4); // crc32
|
||||
bstream.readNumber(4); // compressed size
|
||||
bstream.readNumber(4); // uncompressed size
|
||||
var fileNameLength = bstream.readNumber(2); // file name length
|
||||
var extraFieldLength = bstream.readNumber(2); // extra field length
|
||||
var fileCommentLength = bstream.readNumber(2); // file comment length
|
||||
bstream.readNumber(2); // disk number start
|
||||
bstream.readNumber(2); // internal file attributes
|
||||
bstream.readNumber(4); // external file attributes
|
||||
bstream.readNumber(4); // relative offset of local header
|
||||
|
||||
bstream.readString(fileNameLength); // file name
|
||||
bstream.readString(extraFieldLength); // extra field
|
||||
bstream.readString(fileCommentLength); // file comment
|
||||
}
|
||||
}
|
||||
|
||||
// digital signature
|
||||
if (bstream.peekNumber(4) === zDigitalSignatureSignature) {
|
||||
info(" Found a Digital Signature");
|
||||
|
||||
bstream.readNumber(4);
|
||||
var sizeOfSignature = bstream.readNumber(2);
|
||||
bstream.readString(sizeOfSignature); // digital signature data
|
||||
}
|
||||
|
||||
// report # files and total length
|
||||
if (localFiles.length > 0) {
|
||||
postProgress();
|
||||
}
|
||||
|
||||
// now do the unzipping of each file
|
||||
for (var i = 0; i < localFiles.length; ++i) {
|
||||
var localfile = localFiles[i];
|
||||
|
||||
// update progress
|
||||
currentFilename = localfile.filename;
|
||||
currentFileNumber = i;
|
||||
currentBytesUnarchivedInFile = 0;
|
||||
|
||||
// actually do the unzipping
|
||||
localfile.unzip();
|
||||
|
||||
if (localfile.fileData !== null) {
|
||||
postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile));
|
||||
postProgress();
|
||||
}
|
||||
}
|
||||
postProgress();
|
||||
postMessage(new bitjs.archive.UnarchiveFinishEvent());
|
||||
}
|
||||
};
|
||||
|
||||
// returns a table of Huffman codes
|
||||
// each entry's index is its code and its value is a JavaScript object
|
||||
// containing {length: 6, symbol: X}
|
||||
function getHuffmanCodes(bitLengths) {
|
||||
// ensure bitLengths is an array containing at least one element
|
||||
if (typeof bitLengths !== typeof [] || bitLengths.length < 1) {
|
||||
err("Error! getHuffmanCodes() called with an invalid array");
|
||||
return null;
|
||||
}
|
||||
|
||||
// Reference: http://tools.ietf.org/html/rfc1951#page-8
|
||||
var numLengths = bitLengths.length;
|
||||
var blCount = [];
|
||||
var MAX_BITS = 1;
|
||||
|
||||
// Step 1: count up how many codes of each length we have
|
||||
for (var i = 0; i < numLengths; ++i) {
|
||||
var length = bitLengths[i];
|
||||
// test to ensure each bit length is a positive, non-zero number
|
||||
if (typeof length !== typeof 1 || length < 0) {
|
||||
err("bitLengths contained an invalid number in getHuffmanCodes(): " + length + " of type " + (typeof length));
|
||||
return null;
|
||||
}
|
||||
// increment the appropriate bitlength count
|
||||
if (typeof blCount[length] === "undefined") blCount[length] = 0;
|
||||
// a length of zero means this symbol is not participating in the huffman coding
|
||||
if (length > 0) blCount[length]++;
|
||||
|
||||
if (length > MAX_BITS) MAX_BITS = length;
|
||||
}
|
||||
|
||||
// Step 2: Find the numerical value of the smallest code for each code length
|
||||
var nextCode = [];
|
||||
var code = 0;
|
||||
for (var bits = 1; bits <= MAX_BITS; ++bits) {
|
||||
var length2 = bits - 1;
|
||||
// ensure undefined lengths are zero
|
||||
if (typeof blCount[length2] === "undefined") blCount[length2] = 0;
|
||||
code = (code + blCount[bits - 1]) << 1;
|
||||
nextCode [bits] = code;
|
||||
}
|
||||
|
||||
// Step 3: Assign numerical values to all codes
|
||||
var table = {};
|
||||
var tableLength = 0;
|
||||
for (var n = 0; n < numLengths; ++n) {
|
||||
var len = bitLengths[n];
|
||||
if (len !== 0) {
|
||||
table[nextCode [len]] = { length: len, symbol: n }; //, bitstring: binaryValueToString(nextCode [len],len) };
|
||||
tableLength++;
|
||||
nextCode [len]++;
|
||||
}
|
||||
}
|
||||
table.maxLength = tableLength;
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
/*
|
||||
The Huffman codes for the two alphabets are fixed, and are not
|
||||
represented explicitly in the data. The Huffman code lengths
|
||||
for the literal/length alphabet are:
|
||||
|
||||
Lit Value Bits Codes
|
||||
--------- ---- -----
|
||||
0 - 143 8 00110000 through
|
||||
10111111
|
||||
144 - 255 9 110010000 through
|
||||
111111111
|
||||
256 - 279 7 0000000 through
|
||||
0010111
|
||||
280 - 287 8 11000000 through
|
||||
11000111
|
||||
*/
|
||||
// fixed Huffman codes go from 7-9 bits, so we need an array whose index can hold up to 9 bits
|
||||
var fixedHCtoLiteral = null;
|
||||
var fixedHCtoDistance = null;
|
||||
|
||||
function getFixedLiteralTable() {
|
||||
// create once
|
||||
if (!fixedHCtoLiteral) {
|
||||
var bitlengths = new Array(288);
|
||||
var i;
|
||||
for (i = 0; i <= 143; ++i) bitlengths[i] = 8;
|
||||
for (i = 144; i <= 255; ++i) bitlengths[i] = 9;
|
||||
for (i = 256; i <= 279; ++i) bitlengths[i] = 7;
|
||||
for (i = 280; i <= 287; ++i) bitlengths[i] = 8;
|
||||
|
||||
// get huffman code table
|
||||
fixedHCtoLiteral = getHuffmanCodes(bitlengths);
|
||||
}
|
||||
return fixedHCtoLiteral;
|
||||
}
|
||||
|
||||
function getFixedDistanceTable() {
|
||||
// create once
|
||||
if (!fixedHCtoDistance) {
|
||||
var bitlengths = new Array(32);
|
||||
for (var i = 0; i < 32; ++i) {
|
||||
bitlengths[i] = 5;
|
||||
}
|
||||
|
||||
// get huffman code table
|
||||
fixedHCtoDistance = getHuffmanCodes(bitlengths);
|
||||
}
|
||||
return fixedHCtoDistance;
|
||||
}
|
||||
|
||||
// extract one bit at a time until we find a matching Huffman Code
|
||||
// then return that symbol
|
||||
function decodeSymbol(bstream, hcTable) {
|
||||
var code = 0;
|
||||
var len = 0;
|
||||
|
||||
// loop until we match
|
||||
for (;;) {
|
||||
// read in next bit
|
||||
var bit = bstream.readBits(1);
|
||||
code = (code << 1) | bit;
|
||||
++len;
|
||||
|
||||
// check against Huffman Code table and break if found
|
||||
if (hcTable.hasOwnProperty(code) && hcTable[code].length === len) {
|
||||
break;
|
||||
}
|
||||
if (len > hcTable.maxLength) {
|
||||
err("Bit stream out of sync, didn't find a Huffman Code, length was " + len +
|
||||
" and table only max code length of " + hcTable.maxLength);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return hcTable[code].symbol;
|
||||
}
|
||||
|
||||
|
||||
var CodeLengthCodeOrder = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
|
||||
/*
|
||||
Extra Extra Extra
|
||||
Code Bits Length(s) Code Bits Lengths Code Bits Length(s)
|
||||
---- ---- ------ ---- ---- ------- ---- ---- -------
|
||||
257 0 3 267 1 15,16 277 4 67-82
|
||||
258 0 4 268 1 17,18 278 4 83-98
|
||||
259 0 5 269 2 19-22 279 4 99-114
|
||||
260 0 6 270 2 23-26 280 4 115-130
|
||||
261 0 7 271 2 27-30 281 5 131-162
|
||||
262 0 8 272 2 31-34 282 5 163-194
|
||||
263 0 9 273 3 35-42 283 5 195-226
|
||||
264 0 10 274 3 43-50 284 5 227-257
|
||||
265 1 11,12 275 3 51-58 285 0 258
|
||||
266 1 13,14 276 3 59-66
|
||||
*/
|
||||
var LengthLookupTable = [
|
||||
[0, 3],
|
||||
[0, 4],
|
||||
[0, 5],
|
||||
[0, 6],
|
||||
[0, 7],
|
||||
[0, 8],
|
||||
[0, 9],
|
||||
[0, 10],
|
||||
[1, 11],
|
||||
[1, 13],
|
||||
[1, 15],
|
||||
[1, 17],
|
||||
[2, 19],
|
||||
[2, 23],
|
||||
[2, 27],
|
||||
[2, 31],
|
||||
[3, 35],
|
||||
[3, 43],
|
||||
[3, 51],
|
||||
[3, 59],
|
||||
[4, 67],
|
||||
[4, 83],
|
||||
[4, 99],
|
||||
[4, 115],
|
||||
[5, 131],
|
||||
[5, 163],
|
||||
[5, 195],
|
||||
[5, 227],
|
||||
[0, 258]
|
||||
];
|
||||
/*
|
||||
Extra Extra Extra
|
||||
Code Bits Dist Code Bits Dist Code Bits Distance
|
||||
---- ---- ---- ---- ---- ------ ---- ---- --------
|
||||
0 0 1 10 4 33-48 20 9 1025-1536
|
||||
1 0 2 11 4 49-64 21 9 1537-2048
|
||||
2 0 3 12 5 65-96 22 10 2049-3072
|
||||
3 0 4 13 5 97-128 23 10 3073-4096
|
||||
4 1 5,6 14 6 129-192 24 11 4097-6144
|
||||
5 1 7,8 15 6 193-256 25 11 6145-8192
|
||||
6 2 9-12 16 7 257-384 26 12 8193-12288
|
||||
7 2 13-16 17 7 385-512 27 12 12289-16384
|
||||
8 3 17-24 18 8 513-768 28 13 16385-24576
|
||||
9 3 25-32 19 8 769-1024 29 13 24577-32768
|
||||
*/
|
||||
var DistLookupTable = [
|
||||
[0, 1],
|
||||
[0, 2],
|
||||
[0, 3],
|
||||
[0, 4],
|
||||
[1, 5],
|
||||
[1, 7],
|
||||
[2, 9],
|
||||
[2, 13],
|
||||
[3, 17],
|
||||
[3, 25],
|
||||
[4, 33],
|
||||
[4, 49],
|
||||
[5, 65],
|
||||
[5, 97],
|
||||
[6, 129],
|
||||
[6, 193],
|
||||
[7, 257],
|
||||
[7, 385],
|
||||
[8, 513],
|
||||
[8, 769],
|
||||
[9, 1025],
|
||||
[9, 1537],
|
||||
[10, 2049],
|
||||
[10, 3073],
|
||||
[11, 4097],
|
||||
[11, 6145],
|
||||
[12, 8193],
|
||||
[12, 12289],
|
||||
[13, 16385],
|
||||
[13, 24577]
|
||||
];
|
||||
|
||||
function inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer) {
|
||||
/*
|
||||
loop (until end of block code recognized)
|
||||
decode literal/length value from input stream
|
||||
if value < 256
|
||||
copy value (literal byte) to output stream
|
||||
otherwise
|
||||
if value = end of block (256)
|
||||
break from loop
|
||||
otherwise (value = 257..285)
|
||||
decode distance from input stream
|
||||
|
||||
move backwards distance bytes in the output
|
||||
stream, and copy length bytes from this
|
||||
position to the output stream.
|
||||
*/
|
||||
var blockSize = 0;
|
||||
for (;;) {
|
||||
var symbol = decodeSymbol(bstream, hcLiteralTable);
|
||||
if (symbol < 256) {
|
||||
// copy literal byte to output
|
||||
buffer.insertByte(symbol);
|
||||
blockSize++;
|
||||
} else {
|
||||
// end of block reached
|
||||
if (symbol === 256) {
|
||||
break;
|
||||
} else {
|
||||
var lengthLookup = LengthLookupTable[symbol - 257];
|
||||
var length = lengthLookup[1] + bstream.readBits(lengthLookup[0]);
|
||||
var distLookup = DistLookupTable[decodeSymbol(bstream, hcDistanceTable)];
|
||||
var distance = distLookup[1] + bstream.readBits(distLookup[0]);
|
||||
|
||||
// now apply length and distance appropriately and copy to output
|
||||
|
||||
// TODO: check that backward distance < data.length?
|
||||
|
||||
// http://tools.ietf.org/html/rfc1951#page-11
|
||||
// "Note also that the referenced string may overlap the current
|
||||
// position; for example, if the last 2 bytes decoded have values
|
||||
// X and Y, a string reference with <length = 5, distance = 2>
|
||||
// adds X,Y,X,Y,X to the output stream."
|
||||
//
|
||||
// loop for each character
|
||||
var ch = buffer.ptr - distance;
|
||||
blockSize += length;
|
||||
if (length > distance) {
|
||||
var data = buffer.data;
|
||||
while (length--) {
|
||||
buffer.insertByte(data[ch++]);
|
||||
}
|
||||
} else {
|
||||
buffer.insertBytes(buffer.data.subarray(ch, ch + length));
|
||||
}
|
||||
} // length-distance pair
|
||||
} // length-distance pair or end-of-block
|
||||
} // loop until we reach end of block
|
||||
return blockSize;
|
||||
}
|
||||
|
||||
function zeroCompression(compressedData, numDecompressedBytes) {
|
||||
var bstream = new bitjs.io.BitStream(compressedData.buffer,
|
||||
false /* rtl */,
|
||||
compressedData.byteOffset,
|
||||
compressedData.byteLength);
|
||||
var buffer = new bitjs.io.ByteBuffer(numDecompressedBytes);
|
||||
buffer.insertBytes(bstream.readBytes(numDecompressedBytes));
|
||||
return buffer.data;
|
||||
}
|
||||
|
||||
// {Uint8Array} compressedData A Uint8Array of the compressed file data.
|
||||
// compression method 8
|
||||
// deflate: http://tools.ietf.org/html/rfc1951
|
||||
function inflate(compressedData, numDecompressedBytes) {
|
||||
// Bit stream representing the compressed data.
|
||||
var bstream = new bitjs.io.BitStream(compressedData.buffer,
|
||||
false /* rtl */,
|
||||
compressedData.byteOffset,
|
||||
compressedData.byteLength);
|
||||
var buffer = new bitjs.io.ByteBuffer(numDecompressedBytes);
|
||||
var blockSize = 0;
|
||||
|
||||
// block format: http://tools.ietf.org/html/rfc1951#page-9
|
||||
var bFinal = 0;
|
||||
do {
|
||||
bFinal = bstream.readBits(1);
|
||||
var bType = bstream.readBits(2);
|
||||
blockSize = 0;
|
||||
// ++numBlocks;
|
||||
// no compression
|
||||
if (bType === 0) {
|
||||
// skip remaining bits in this byte
|
||||
while (bstream.bitPtr !== 0) bstream.readBits(1);
|
||||
var len = bstream.readBits(16);
|
||||
bstream.readBits(16);
|
||||
// TODO: check if nlen is the ones-complement of len?
|
||||
|
||||
if (len > 0) buffer.insertBytes(bstream.readBytes(len));
|
||||
blockSize = len;
|
||||
} else if (bType === 1) {
|
||||
// fixed Huffman codes
|
||||
blockSize = inflateBlockData(bstream, getFixedLiteralTable(), getFixedDistanceTable(), buffer);
|
||||
} else if (bType === 2) {
|
||||
// dynamic Huffman codes
|
||||
var numLiteralLengthCodes = bstream.readBits(5) + 257;
|
||||
var numDistanceCodes = bstream.readBits(5) + 1,
|
||||
numCodeLengthCodes = bstream.readBits(4) + 4;
|
||||
|
||||
// populate the array of code length codes (first de-compaction)
|
||||
var codeLengthsCodeLengths = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
for (var i = 0; i < numCodeLengthCodes; ++i) {
|
||||
codeLengthsCodeLengths[ CodeLengthCodeOrder[i] ] = bstream.readBits(3);
|
||||
}
|
||||
|
||||
// get the Huffman Codes for the code lengths
|
||||
var codeLengthsCodes = getHuffmanCodes(codeLengthsCodeLengths);
|
||||
|
||||
// now follow this mapping
|
||||
/*
|
||||
0 - 15: Represent code lengths of 0 - 15
|
||||
16: Copy the previous code length 3 - 6 times.
|
||||
The next 2 bits indicate repeat length
|
||||
(0 = 3, ... , 3 = 6)
|
||||
Example: Codes 8, 16 (+2 bits 11),
|
||||
16 (+2 bits 10) will expand to
|
||||
12 code lengths of 8 (1 + 6 + 5)
|
||||
17: Repeat a code length of 0 for 3 - 10 times.
|
||||
(3 bits of length)
|
||||
18: Repeat a code length of 0 for 11 - 138 times
|
||||
(7 bits of length)
|
||||
*/
|
||||
// to generate the true code lengths of the Huffman Codes for the literal
|
||||
// and distance tables together
|
||||
var literalCodeLengths = [];
|
||||
var prevCodeLength = 0;
|
||||
while (literalCodeLengths.length < numLiteralLengthCodes + numDistanceCodes) {
|
||||
var symbol = decodeSymbol(bstream, codeLengthsCodes);
|
||||
if (symbol <= 15) {
|
||||
literalCodeLengths.push(symbol);
|
||||
prevCodeLength = symbol;
|
||||
} else if (symbol === 16) {
|
||||
var repeat = bstream.readBits(2) + 3;
|
||||
while (repeat--) {
|
||||
literalCodeLengths.push(prevCodeLength);
|
||||
}
|
||||
} else if (symbol === 17) {
|
||||
var repeat1 = bstream.readBits(3) + 3;
|
||||
while (repeat1--) {
|
||||
literalCodeLengths.push(0);
|
||||
}
|
||||
} else if (symbol === 18) {
|
||||
var repeat2 = bstream.readBits(7) + 11;
|
||||
while (repeat2--) {
|
||||
literalCodeLengths.push(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// now split the distance code lengths out of the literal code array
|
||||
var distanceCodeLengths = literalCodeLengths.splice(numLiteralLengthCodes, numDistanceCodes);
|
||||
|
||||
// now generate the true Huffman Code tables using these code lengths
|
||||
var hcLiteralTable = getHuffmanCodes(literalCodeLengths);
|
||||
var hcDistanceTable = getHuffmanCodes(distanceCodeLengths);
|
||||
blockSize = inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer);
|
||||
} else {
|
||||
// error
|
||||
err("Error! Encountered deflate block of type 3");
|
||||
return null;
|
||||
}
|
||||
|
||||
// update progress
|
||||
currentBytesUnarchivedInFile += blockSize;
|
||||
currentBytesUnarchived += blockSize;
|
||||
postProgress();
|
||||
|
||||
} while (bFinal !== 1);
|
||||
// we are done reading blocks if the bFinal bit was set for this block
|
||||
|
||||
// return the buffer data bytes
|
||||
return buffer.data;
|
||||
}
|
||||
|
||||
// event.data.file has the ArrayBuffer.
|
||||
onmessage = function(event) {
|
||||
unzip(event.data.file, true);
|
||||
};
|
||||
@@ -412,8 +412,12 @@ if($("body.advsearch").length > 0) {
|
||||
$("#add-to-shelves").toggle();
|
||||
});
|
||||
$('#add-to-shelf').height("40px");
|
||||
function dropdownToggle() {
|
||||
topPos = $("#add-to-shelf").offset().top-20;
|
||||
function search_dropdownToggle() {
|
||||
if( $("#add-to-shelf").length) {
|
||||
topPos = $("#add-to-shelf").offset().top - 20;
|
||||
} else {
|
||||
topPos = 0
|
||||
}
|
||||
if ($('div[aria-label="Add to shelves"]').length > 0) {
|
||||
|
||||
position = $('div[aria-label="Add to shelves"]').offset().left
|
||||
@@ -428,10 +432,10 @@ if($("body.advsearch").length > 0) {
|
||||
}
|
||||
}
|
||||
|
||||
dropdownToggle();
|
||||
search_dropdownToggle();
|
||||
|
||||
$(window).on("resize", function () {
|
||||
dropdownToggle();
|
||||
search_dropdownToggle();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -0,0 +1,90 @@
|
||||
// Copyright (c) 2017 Matthew Brennan Jones <matthew.brennan.jones@gmail.com>
|
||||
// This software is licensed under a MIT License
|
||||
// https://github.com/workhorsy/uncompress.js
|
||||
|
||||
"use strict";
|
||||
|
||||
// Based on the information from:
|
||||
// https://en.wikipedia.org/wiki/Tar_(computing)
|
||||
|
||||
|
||||
(function() {
|
||||
|
||||
const TAR_TYPE_FILE = 0;
|
||||
const TAR_TYPE_DIR = 5;
|
||||
|
||||
const TAR_HEADER_SIZE = 512;
|
||||
const TAR_TYPE_OFFSET = 156;
|
||||
const TAR_TYPE_SIZE = 1;
|
||||
const TAR_SIZE_OFFSET = 124;
|
||||
const TAR_SIZE_SIZE = 12;
|
||||
const TAR_NAME_OFFSET = 0;
|
||||
const TAR_NAME_SIZE = 100;
|
||||
|
||||
function _tarRead(view, offset, size) {
|
||||
return view.slice(offset, offset + size);
|
||||
}
|
||||
|
||||
function tarGetEntries(filename, array_buffer) {
|
||||
let view = new Uint8Array(array_buffer);
|
||||
let offset = 0;
|
||||
let entries = [];
|
||||
|
||||
while (offset + TAR_HEADER_SIZE < view.byteLength) {
|
||||
// Get entry name
|
||||
let entry_name = saneMap(_tarRead(view, offset + TAR_NAME_OFFSET, TAR_NAME_SIZE), String.fromCharCode);
|
||||
entry_name = entry_name.join('').replace(/\0/g, '');
|
||||
|
||||
// No entry name, so probably the last block
|
||||
if (entry_name.length === 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Get entry size
|
||||
let entry_size = parseInt(saneJoin(saneMap(_tarRead(view, offset + TAR_SIZE_OFFSET, TAR_SIZE_SIZE), String.fromCharCode), ''), 8);
|
||||
let entry_type = saneMap(_tarRead(view, offset + TAR_TYPE_OFFSET, TAR_TYPE_SIZE), String.fromCharCode) | 0;
|
||||
|
||||
// Save this as en entry if it is a file or directory
|
||||
if (entry_type === TAR_TYPE_FILE || entry_type === TAR_TYPE_DIR) {
|
||||
let entry = {
|
||||
name: entry_name,
|
||||
size: entry_size,
|
||||
is_file: entry_type == TAR_TYPE_FILE,
|
||||
offset: offset
|
||||
};
|
||||
entries.push(entry);
|
||||
}
|
||||
|
||||
// Round the offset up to be divisible by TAR_HEADER_SIZE
|
||||
offset += (entry_size + TAR_HEADER_SIZE);
|
||||
if (offset % TAR_HEADER_SIZE > 0) {
|
||||
let even = (offset / TAR_HEADER_SIZE) | 0; // number of times it goes evenly into TAR_HEADER_SIZE
|
||||
offset = (even + 1) * TAR_HEADER_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
function tarGetEntryData(entry, array_buffer) {
|
||||
let view = new Uint8Array(array_buffer);
|
||||
let offset = entry.offset;
|
||||
let size = entry.size;
|
||||
|
||||
// Get entry data
|
||||
let entry_data = _tarRead(view, offset + TAR_HEADER_SIZE, size);
|
||||
return entry_data;
|
||||
}
|
||||
|
||||
// Figure out if we are running in a Window or Web Worker
|
||||
let scope = null;
|
||||
if (typeof window === 'object') {
|
||||
scope = window;
|
||||
} else if (typeof importScripts === 'function') {
|
||||
scope = self;
|
||||
}
|
||||
|
||||
// Set exports
|
||||
scope.tarGetEntries = tarGetEntries;
|
||||
scope.tarGetEntryData = tarGetEntryData;
|
||||
})();
|
||||
@@ -0,0 +1,420 @@
|
||||
// Copyright (c) 2017 Matthew Brennan Jones <matthew.brennan.jones@gmail.com>
|
||||
// This software is licensed under a MIT License
|
||||
// https://github.com/workhorsy/uncompress.js
|
||||
|
||||
"use strict";
|
||||
|
||||
|
||||
function loadScript(url, cb) {
|
||||
// Window
|
||||
if (typeof window === 'object') {
|
||||
let script = document.createElement('script');
|
||||
script.type = "text/javascript";
|
||||
script.src = url;
|
||||
script.onload = function() {
|
||||
if (cb) cb();
|
||||
};
|
||||
document.head.appendChild(script);
|
||||
// Web Worker
|
||||
} else if (typeof importScripts === 'function') {
|
||||
importScripts(url);
|
||||
if (cb) cb();
|
||||
}
|
||||
}
|
||||
|
||||
function currentScriptPath() {
|
||||
// NOTE: document.currentScript does not work in a Web Worker
|
||||
// So we have to parse a stack trace maually
|
||||
try {
|
||||
throw new Error('');
|
||||
} catch(e) {
|
||||
let stack = e.stack;
|
||||
let line = null;
|
||||
|
||||
// Chrome and IE
|
||||
if (stack.indexOf('@') !== -1) {
|
||||
line = stack.split('@')[1].split('\n')[0];
|
||||
// Firefox
|
||||
} else {
|
||||
line = stack.split('(')[1].split(')')[0];
|
||||
}
|
||||
line = line.substring(0, line.lastIndexOf('/')) + '/';
|
||||
return line;
|
||||
}
|
||||
}
|
||||
|
||||
// This is used by libunrar.js to load libunrar.js.mem
|
||||
let unrarMemoryFileLocation = null;
|
||||
let g_on_loaded_cb = null;
|
||||
|
||||
(function() {
|
||||
|
||||
let _loaded_archive_formats = [];
|
||||
|
||||
// Polyfill for missing array slice method (IE 11)
|
||||
if (typeof Uint8Array !== 'undefined') {
|
||||
if (! Uint8Array.prototype.slice) {
|
||||
Uint8Array.prototype.slice = function(start, end) {
|
||||
let retval = new Uint8Array(end - start);
|
||||
let j = 0;
|
||||
for (let i=start; i<end; ++i) {
|
||||
retval[j] = this[i];
|
||||
j++;
|
||||
}
|
||||
return retval;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: This function is super inefficient
|
||||
function saneJoin(array, separator) {
|
||||
let retval = '';
|
||||
for (let i=0; i<array.length; ++i) {
|
||||
if (i === 0) {
|
||||
retval += array[i];
|
||||
} else {
|
||||
retval += separator + array[i];
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
function saneMap(array, cb) {
|
||||
let retval = new Array(array.length);
|
||||
for (let i=0; i<retval.length; ++i) {
|
||||
retval[i] = cb(array[i]);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
function loadArchiveFormats(formats, cb) {
|
||||
// Get the path of the current script
|
||||
let path = currentScriptPath();
|
||||
let load_counter = 0;
|
||||
|
||||
let checkForLoadDone = function() {
|
||||
load_counter++;
|
||||
|
||||
// Get the total number of loads before we are done loading
|
||||
// If loading RAR in a Window, have 1 extra load.
|
||||
let load_total = formats.length;
|
||||
if (formats.indexOf('rar') !== -1 && typeof window === 'object') {
|
||||
load_total++;
|
||||
}
|
||||
|
||||
// run the callback if the last script has loaded
|
||||
if (load_counter === load_total) {
|
||||
cb();
|
||||
}
|
||||
};
|
||||
|
||||
g_on_loaded_cb = checkForLoadDone;
|
||||
|
||||
// Load the formats
|
||||
formats.forEach(function(archive_format) {
|
||||
// Skip this format if it is already loaded
|
||||
if (_loaded_archive_formats.indexOf(archive_format) !== -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Load the archive format
|
||||
switch (archive_format) {
|
||||
case 'rar':
|
||||
unrarMemoryFileLocation = path + 'libunrar.js.mem';
|
||||
loadScript(path + 'libunrar.js', checkForLoadDone);
|
||||
_loaded_archive_formats.push(archive_format);
|
||||
break;
|
||||
case 'zip':
|
||||
loadScript(path + 'jszip.js', checkForLoadDone);
|
||||
_loaded_archive_formats.push(archive_format);
|
||||
break;
|
||||
case 'tar':
|
||||
loadScript(path + 'libuntar.js', checkForLoadDone);
|
||||
_loaded_archive_formats.push(archive_format);
|
||||
break;
|
||||
default:
|
||||
throw new Error("Unknown archive format '" + archive_format + "'.");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function archiveOpenFile(array_buffer, cb) {
|
||||
let file_name = "Hugo"; //file.name;
|
||||
let password = null;
|
||||
|
||||
try {
|
||||
let archive = archiveOpenArrayBuffer(file_name, password, array_buffer);
|
||||
cb(archive, null);
|
||||
} catch(e) {
|
||||
cb(null, e);
|
||||
}
|
||||
}
|
||||
|
||||
function archiveOpenArrayBuffer(file_name, password, array_buffer) {
|
||||
// Get the archive type
|
||||
let archive_type = null;
|
||||
if (isRarFile(array_buffer)) {
|
||||
archive_type = 'rar';
|
||||
} else if(isZipFile(array_buffer)) {
|
||||
archive_type = 'zip';
|
||||
} else if(isTarFile(array_buffer)) {
|
||||
archive_type = 'tar';
|
||||
} else {
|
||||
throw new Error("The archive type is unknown");
|
||||
}
|
||||
|
||||
// Make sure the archive format is loaded
|
||||
if (_loaded_archive_formats.indexOf(archive_type) === -1) {
|
||||
throw new Error("The archive format '" + archive_type + "' is not loaded.");
|
||||
}
|
||||
|
||||
// Get the entries
|
||||
let handle = null;
|
||||
let entries = [];
|
||||
try {
|
||||
switch (archive_type) {
|
||||
case 'rar':
|
||||
handle = _rarOpen(file_name, password, array_buffer);
|
||||
entries = _rarGetEntries(handle);
|
||||
break;
|
||||
case 'zip':
|
||||
handle = _zipOpen(file_name, password, array_buffer);
|
||||
entries = _zipGetEntries(handle);
|
||||
break;
|
||||
case 'tar':
|
||||
handle = _tarOpen(file_name, password, array_buffer);
|
||||
entries = _tarGetEntries(handle);
|
||||
break;
|
||||
}
|
||||
} catch(e) {
|
||||
throw new Error("Failed to open '" + archive_type + "' archive.");
|
||||
}
|
||||
|
||||
// Sort the entries by name
|
||||
entries.sort(function(a, b) {
|
||||
if(a.name < b.name) return -1;
|
||||
if(a.name > b.name) return 1;
|
||||
return 0;
|
||||
});
|
||||
|
||||
// Return the archive object
|
||||
return {
|
||||
file_name: file_name,
|
||||
archive_type: archive_type,
|
||||
array_buffer: array_buffer,
|
||||
entries: entries,
|
||||
handle: handle
|
||||
};
|
||||
}
|
||||
|
||||
function archiveClose(archive) {
|
||||
archive.file_name = null;
|
||||
archive.archive_type = null;
|
||||
archive.array_buffer = null;
|
||||
archive.entries = null;
|
||||
archive.handle = null;
|
||||
}
|
||||
|
||||
function _rarOpen(file_name, password, array_buffer) {
|
||||
// Create an array of rar files
|
||||
let rar_files = [{
|
||||
name: file_name,
|
||||
size: array_buffer.byteLength,
|
||||
type: '',
|
||||
content: new Uint8Array(array_buffer)
|
||||
}];
|
||||
|
||||
// Return rar handle
|
||||
return {
|
||||
file_name: file_name,
|
||||
array_buffer: array_buffer,
|
||||
password: password,
|
||||
rar_files: rar_files
|
||||
};
|
||||
}
|
||||
|
||||
function _zipOpen(file_name, password, array_buffer) {
|
||||
let zip = new JSZip(array_buffer);
|
||||
|
||||
// Return zip handle
|
||||
return {
|
||||
file_name: file_name,
|
||||
array_buffer: array_buffer,
|
||||
password: password,
|
||||
zip: zip
|
||||
};
|
||||
}
|
||||
|
||||
function _tarOpen(file_name, password, array_buffer) {
|
||||
// Return tar handle
|
||||
return {
|
||||
file_name: file_name,
|
||||
array_buffer: array_buffer,
|
||||
password: password
|
||||
};
|
||||
}
|
||||
|
||||
function _rarGetEntries(rar_handle) {
|
||||
// Get the entries
|
||||
let info = readRARFileNames(rar_handle.rar_files, rar_handle.password);
|
||||
let entries = [];
|
||||
Object.keys(info).forEach(function(i) {
|
||||
let name = info[i].name;
|
||||
let is_file = info[i].is_file;
|
||||
if (is_file) {
|
||||
entries.push({
|
||||
name: name,
|
||||
is_file: is_file, // info[i].is_file,
|
||||
size_compressed: info[i].size_compressed,
|
||||
size_uncompressed: info[i].size_uncompressed,
|
||||
readData: function (cb) {
|
||||
setTimeout(function () {
|
||||
if (is_file) {
|
||||
try {
|
||||
readRARContent(rar_handle.rar_files, rar_handle.password, name, cb);
|
||||
} catch (e) {
|
||||
cb(null, e);
|
||||
}
|
||||
} else {
|
||||
cb(null, null);
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
function _zipGetEntries(zip_handle) {
|
||||
let zip = zip_handle.zip;
|
||||
|
||||
// Get all the entries
|
||||
let entries = [];
|
||||
Object.keys(zip.files).forEach(function(i) {
|
||||
let zip_entry = zip.files[i];
|
||||
let name = zip_entry.name;
|
||||
let is_file = ! zip_entry.dir;
|
||||
let size_compressed = zip_entry._data ? zip_entry._data.compressedSize : 0;
|
||||
let size_uncompressed = zip_entry._data ? zip_entry._data.uncompressedSize : 0;
|
||||
if (is_file) {
|
||||
entries.push({
|
||||
name: name,
|
||||
is_file: is_file,
|
||||
size_compressed: size_compressed,
|
||||
size_uncompressed: size_uncompressed,
|
||||
readData: function (cb) {
|
||||
setTimeout(function () {
|
||||
if (is_file) {
|
||||
let data = zip_entry.asArrayBuffer();
|
||||
cb(data, null);
|
||||
} else {
|
||||
cb(null, null);
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
function _tarGetEntries(tar_handle) {
|
||||
let tar_entries = tarGetEntries(tar_handle.file_name, tar_handle.array_buffer);
|
||||
|
||||
// Get all the entries
|
||||
let entries = [];
|
||||
tar_entries.forEach(function(entry) {
|
||||
let name = entry.name;
|
||||
let is_file = entry.is_file;
|
||||
let size = entry.size;
|
||||
if (is_file) {
|
||||
entries.push({
|
||||
name: name,
|
||||
is_file: is_file,
|
||||
size_compressed: size,
|
||||
size_uncompressed: size,
|
||||
readData: function (cb) {
|
||||
setTimeout(function () {
|
||||
if (is_file) {
|
||||
let data = tarGetEntryData(entry, tar_handle.array_buffer);
|
||||
cb(data.buffer, null);
|
||||
} else {
|
||||
cb(null, null);
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
function isRarFile(array_buffer) {
|
||||
// The three styles of RAR headers
|
||||
let rar_header1 = saneJoin([0x52, 0x45, 0x7E, 0x5E], ', '); // old
|
||||
let rar_header2 = saneJoin([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00], ', '); // 1.5 to 4.0
|
||||
let rar_header3 = saneJoin([0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x01, 0x00], ', '); // 5.0
|
||||
|
||||
// Just return false if the file is smaller than the header
|
||||
if (array_buffer.byteLength < 8) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Return true if the header matches one of the RAR headers
|
||||
let header1 = saneJoin(new Uint8Array(array_buffer).slice(0, 4), ', ');
|
||||
let header2 = saneJoin(new Uint8Array(array_buffer).slice(0, 7), ', ');
|
||||
let header3 = saneJoin(new Uint8Array(array_buffer).slice(0, 8), ', ');
|
||||
return (header1 === rar_header1 || header2 === rar_header2 || header3 === rar_header3);
|
||||
}
|
||||
|
||||
function isZipFile(array_buffer) {
|
||||
// The ZIP header
|
||||
let zip_header = saneJoin([0x50, 0x4b, 0x03, 0x04], ', ');
|
||||
|
||||
// Just return false if the file is smaller than the header
|
||||
if (array_buffer.byteLength < 4) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Return true if the header matches the ZIP header
|
||||
let header = saneJoin(new Uint8Array(array_buffer).slice(0, 4), ', ');
|
||||
return (header === zip_header);
|
||||
}
|
||||
|
||||
function isTarFile(array_buffer) {
|
||||
// The TAR header
|
||||
let tar_header = saneJoin(['u', 's', 't', 'a', 'r'], ', ');
|
||||
|
||||
// Just return false if the file is smaller than the header size
|
||||
if (array_buffer.byteLength < 512) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Return true if the header matches the TAR header
|
||||
let header = saneJoin(saneMap(new Uint8Array(array_buffer).slice(257, 257 + 5), String.fromCharCode), ', ');
|
||||
return (header === tar_header);
|
||||
}
|
||||
|
||||
// Figure out if we are running in a Window or Web Worker
|
||||
let scope = null;
|
||||
if (typeof window === 'object') {
|
||||
scope = window;
|
||||
} else if (typeof importScripts === 'function') {
|
||||
scope = self;
|
||||
}
|
||||
|
||||
// Set exports
|
||||
scope.loadArchiveFormats = loadArchiveFormats;
|
||||
scope.archiveOpenFile = archiveOpenFile;
|
||||
scope.archiveOpenArrayBuffer = archiveOpenArrayBuffer;
|
||||
scope.archiveClose = archiveClose;
|
||||
scope.isRarFile = isRarFile;
|
||||
scope.isZipFile = isZipFile;
|
||||
scope.isTarFile = isTarFile;
|
||||
scope.saneJoin = saneJoin;
|
||||
scope.saneMap = saneMap;
|
||||
})();
|
||||
@@ -22,7 +22,21 @@ $(function() {
|
||||
});
|
||||
|
||||
$("#have_read_cb").on("change", function() {
|
||||
$(this).closest("form").submit();
|
||||
$.post({
|
||||
url: this.closest("form").action,
|
||||
error: function(response) {
|
||||
var data = [{type:"danger", message:response.responseText}]
|
||||
$("#flash_success").remove();
|
||||
$("#flash_danger").remove();
|
||||
if (!jQuery.isEmptyObject(data)) {
|
||||
data.forEach(function (item) {
|
||||
$(".navbar").after('<div class="row-fluid text-center" >' +
|
||||
'<div id="flash_' + item.type + '" class="alert alert-' + item.type + '">' + item.message + '</div>' +
|
||||
'</div>');
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(function() {
|
||||
@@ -55,7 +69,7 @@ $("#archived_cb").on("change", function() {
|
||||
templates.remove({
|
||||
add: this.href,
|
||||
remove: $this.data("remove-href"),
|
||||
content: this.textContent
|
||||
content: $("<div>").text(this.textContent).html()
|
||||
})
|
||||
);
|
||||
break;
|
||||
@@ -64,7 +78,7 @@ $("#archived_cb").on("change", function() {
|
||||
templates.add({
|
||||
add: $this.data("add-href"),
|
||||
remove: this.href,
|
||||
content: this.textContent
|
||||
content: $("<div>").text(this.textContent).html(),
|
||||
})
|
||||
);
|
||||
break;
|
||||
|
||||
+35
-53
@@ -10,58 +10,38 @@ if ($("#description").length) {
|
||||
menubar: "edit view format",
|
||||
language: language
|
||||
});
|
||||
}
|
||||
|
||||
if (!Modernizr.inputtypes.date) {
|
||||
$("#pubdate").datepicker({
|
||||
format: "yyyy-mm-dd",
|
||||
language: language
|
||||
}).on("change", function () {
|
||||
// Show localized date over top of the standard YYYY-MM-DD date
|
||||
var pubDate;
|
||||
var results = /(\d{4})[-\/\\](\d{1,2})[-\/\\](\d{1,2})/.exec(this.value); // YYYY-MM-DD
|
||||
if (results) {
|
||||
pubDate = new Date(results[1], parseInt(results[2], 10) - 1, results[3]) || new Date(this.value);
|
||||
$("#fake_pubdate")
|
||||
.val(pubDate.toLocaleDateString(language))
|
||||
.removeClass("hidden");
|
||||
}
|
||||
}).trigger("change");
|
||||
if ($(".tiny_editor").length) {
|
||||
tinymce.init({
|
||||
selector: ".tiny_editor",
|
||||
branding: false,
|
||||
menubar: "edit view format",
|
||||
language: language
|
||||
});
|
||||
}
|
||||
|
||||
$(".datepicker").datepicker({
|
||||
format: "yyyy-mm-dd",
|
||||
language: language
|
||||
}).on("change", function () {
|
||||
// Show localized date over top of the standard YYYY-MM-DD date
|
||||
var pubDate;
|
||||
var results = /(\d{4})[-\/\\](\d{1,2})[-\/\\](\d{1,2})/.exec(this.value); // YYYY-MM-DD
|
||||
if (results) {
|
||||
pubDate = new Date(results[1], parseInt(results[2], 10) - 1, results[3]) || new Date(this.value);
|
||||
$(this).next('input')
|
||||
.val(pubDate.toLocaleDateString(language))
|
||||
.removeClass("hidden");
|
||||
}
|
||||
}
|
||||
}).trigger("change");
|
||||
|
||||
if (!Modernizr.inputtypes.date) {
|
||||
$("#Publishstart").datepicker({
|
||||
format: "yyyy-mm-dd",
|
||||
language: language
|
||||
}).on("change", function () {
|
||||
// Show localized date over top of the standard YYYY-MM-DD date
|
||||
var pubDate;
|
||||
var results = /(\d{4})[-\/\\](\d{1,2})[-\/\\](\d{1,2})/.exec(this.value); // YYYY-MM-DD
|
||||
if (results) {
|
||||
pubDate = new Date(results[1], parseInt(results[2], 10) - 1, results[3]) || new Date(this.value);
|
||||
$("#fake_Publishstart")
|
||||
.val(pubDate.toLocaleDateString(language))
|
||||
.removeClass("hidden");
|
||||
}
|
||||
}).trigger("change");
|
||||
}
|
||||
$(".datepicker_delete").click(function() {
|
||||
var inputs = $(this).parent().siblings('input');
|
||||
$(inputs[0]).data('datepicker').clearDates();
|
||||
$(inputs[1]).addClass('hidden');
|
||||
});
|
||||
|
||||
if (!Modernizr.inputtypes.date) {
|
||||
$("#Publishend").datepicker({
|
||||
format: "yyyy-mm-dd",
|
||||
language: language
|
||||
}).on("change", function () {
|
||||
// Show localized date over top of the standard YYYY-MM-DD date
|
||||
var pubDate;
|
||||
var results = /(\d{4})[-\/\\](\d{1,2})[-\/\\](\d{1,2})/.exec(this.value); // YYYY-MM-DD
|
||||
if (results) {
|
||||
pubDate = new Date(results[1], parseInt(results[2], 10) - 1, results[3]) || new Date(this.value);
|
||||
$("#fake_Publishend")
|
||||
.val(pubDate.toLocaleDateString(language))
|
||||
.removeClass("hidden");
|
||||
}
|
||||
}).trigger("change");
|
||||
}
|
||||
|
||||
/*
|
||||
Takes a prefix, query typeahead callback, Bloodhound typeahead adapter
|
||||
@@ -78,11 +58,6 @@ function prefixedSource(prefix, query, cb, bhAdapter) {
|
||||
});
|
||||
}
|
||||
|
||||
/*function getPath() {
|
||||
var jsFileLocation = $("script[src*=edit_books]").attr("src"); // the js file path
|
||||
return jsFileLocation.substr(0, jsFileLocation.search("/static/js/edit_books.js")); // the js folder path
|
||||
}*/
|
||||
|
||||
var authors = new Bloodhound({
|
||||
name: "authors",
|
||||
datumTokenizer: function datumTokenizer(datum) {
|
||||
@@ -288,3 +263,10 @@ $("#btn-upload-cover").on("change", function () {
|
||||
$("#upload-cover").html(filename);
|
||||
});
|
||||
|
||||
$("#xchange").click(function () {
|
||||
this.blur();
|
||||
var title = $("#book_title").val();
|
||||
$("#book_title").val($("#bookAuthor").val());
|
||||
$("#bookAuthor").val(title);
|
||||
});
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
var direction = $("#asc").data('order'); // 0=Descending order; 1= ascending order
|
||||
|
||||
var $list = $("#list").isotope({
|
||||
itemSelector: ".book",
|
||||
layoutMode: "fitRows",
|
||||
@@ -24,6 +26,9 @@ var $list = $("#list").isotope({
|
||||
});
|
||||
|
||||
$("#desc").click(function() {
|
||||
if (direction === 0) {
|
||||
return;
|
||||
}
|
||||
var page = $(this).data("id");
|
||||
$.ajax({
|
||||
method:"post",
|
||||
@@ -39,6 +44,9 @@ $("#desc").click(function() {
|
||||
});
|
||||
|
||||
$("#asc").click(function() {
|
||||
if (direction === 1) {
|
||||
return;
|
||||
}
|
||||
var page = $(this).data("id");
|
||||
$.ajax({
|
||||
method:"post",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
var direction = 0; // Descending order
|
||||
var direction = $("#asc").data('order'); // 0=Descending order; 1= ascending order
|
||||
var sort = 0; // Show sorted entries
|
||||
|
||||
$("#sort_name").click(function() {
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/* This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
|
||||
* Copyright (C) 2021 OzzieIsaacs
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
function toggleFullscreen(elem) {
|
||||
if (!document.fullscreenElement && !document.mozFullScreenElement &&
|
||||
!document.webkitFullscreenElement && !document.msFullscreenElement) {
|
||||
if (elem.requestFullscreen) {
|
||||
elem.requestFullscreen();
|
||||
} else if (elem.msRequestFullscreen) {
|
||||
elem.msRequestFullscreen();
|
||||
} else if (elem.mozRequestFullScreen) {
|
||||
elem.mozRequestFullScreen();
|
||||
} else if (elem.webkitRequestFullscreen) {
|
||||
elem.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
|
||||
}
|
||||
} else {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$("#detailcover").click(function() {
|
||||
toggleFullscreen(this);
|
||||
});
|
||||
+91
-272
@@ -14,37 +14,16 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/*
|
||||
* Get Metadata from Douban Books api and Google Books api and ComicVine
|
||||
* Google Books api document: https://developers.google.com/books/docs/v1/using
|
||||
* Douban Books api document: https://developers.douban.com/wiki/?title=book_v2 (Chinese Only)
|
||||
* ComicVine api document: https://comicvine.gamespot.com/api/documentation
|
||||
*/
|
||||
/* global _, i18nMsg, tinymce */
|
||||
var dbResults = [];
|
||||
var ggResults = [];
|
||||
var cvResults = [];
|
||||
/* global _, i18nMsg, tinymce, getPath */
|
||||
|
||||
$(function () {
|
||||
var msg = i18nMsg;
|
||||
var douban = "https://api.douban.com";
|
||||
var dbSearch = "/v2/book/search";
|
||||
var dbDone = 0;
|
||||
|
||||
var google = "https://www.googleapis.com";
|
||||
var ggSearch = "/books/v1/volumes";
|
||||
var ggDone = 0;
|
||||
|
||||
var comicvine = "https://comicvine.gamespot.com";
|
||||
var cvSearch = "/api/search/";
|
||||
var cvDone = 0;
|
||||
|
||||
var showFlag = 0;
|
||||
var keyword = ""
|
||||
|
||||
var templates = {
|
||||
bookResult: _.template(
|
||||
$("#template-book-result").html()
|
||||
)
|
||||
)
|
||||
};
|
||||
|
||||
function populateForm (book) {
|
||||
@@ -53,14 +32,15 @@ $(function () {
|
||||
$.each(book.tags, function(i, el) {
|
||||
if ($.inArray(el, uniqueTags) === -1) uniqueTags.push(el);
|
||||
});
|
||||
|
||||
var ampSeparatedAuthors = (book.authors || []).join(" & ");
|
||||
$("#bookAuthor").val(ampSeparatedAuthors);
|
||||
$("#book_title").val(book.title);
|
||||
$("#tags").val(uniqueTags.join(","));
|
||||
$("#rating").data("rating").setValue(Math.round(book.rating));
|
||||
$(".cover img").attr("src", book.cover);
|
||||
$("#cover_url").val(book.cover);
|
||||
if(book.cover !== null){
|
||||
$(".cover img").attr("src", book.cover);
|
||||
$("#cover_url").val(book.cover);
|
||||
}
|
||||
$("#pubdate").val(book.publishedDate);
|
||||
$("#publisher").val(book.publisher);
|
||||
if (typeof book.series !== "undefined") {
|
||||
@@ -68,261 +48,100 @@ $(function () {
|
||||
}
|
||||
}
|
||||
|
||||
function showResult () {
|
||||
showFlag++;
|
||||
if (showFlag === 1) {
|
||||
$("#meta-info").html("<ul id=\"book-list\" class=\"media-list\"></ul>");
|
||||
}
|
||||
if ((ggDone === 3 || (ggDone === 1 && ggResults.length === 0)) &&
|
||||
(dbDone === 3 || (dbDone === 1 && dbResults.length === 0)) &&
|
||||
(cvDone === 3 || (cvDone === 1 && cvResults.length === 0))) {
|
||||
$("#meta-info").html("<p class=\"text-danger\">" + msg.no_result + "</p>");
|
||||
return;
|
||||
}
|
||||
function formatDate (date) {
|
||||
var d = new Date(date),
|
||||
month = "" + (d.getMonth() + 1),
|
||||
day = "" + d.getDate(),
|
||||
year = d.getFullYear();
|
||||
|
||||
if (month.length < 2) {
|
||||
month = "0" + month;
|
||||
}
|
||||
if (day.length < 2) {
|
||||
day = "0" + day;
|
||||
}
|
||||
|
||||
return [year, month, day].join("-");
|
||||
}
|
||||
|
||||
if (ggResults.length > 0) {
|
||||
if (ggDone < 2) {
|
||||
ggResults.forEach(function(result) {
|
||||
var book = {
|
||||
id: result.id,
|
||||
title: result.volumeInfo.title,
|
||||
authors: result.volumeInfo.authors || [],
|
||||
description: result.volumeInfo.description || "",
|
||||
publisher: result.volumeInfo.publisher || "",
|
||||
publishedDate: result.volumeInfo.publishedDate || "",
|
||||
tags: result.volumeInfo.categories || [],
|
||||
rating: result.volumeInfo.averageRating || 0,
|
||||
cover: result.volumeInfo.imageLinks ?
|
||||
result.volumeInfo.imageLinks.thumbnail : location + "/../../../static/generic_cover.jpg",
|
||||
url: "https://books.google.com/books?id=" + result.id,
|
||||
source: {
|
||||
id: "google",
|
||||
description: "Google Books",
|
||||
url: "https://books.google.com/"
|
||||
}
|
||||
};
|
||||
|
||||
var $book = $(templates.bookResult(book));
|
||||
$book.find("img").on("click", function () {
|
||||
populateForm(book);
|
||||
});
|
||||
|
||||
$("#book-list").append($book);
|
||||
});
|
||||
ggDone = 2;
|
||||
} else {
|
||||
ggDone = 3;
|
||||
}
|
||||
}
|
||||
|
||||
if (dbResults.length > 0) {
|
||||
if (dbDone < 2) {
|
||||
dbResults.forEach(function(result) {
|
||||
var seriesTitle = "";
|
||||
if (result.series) {
|
||||
seriesTitle = result.series.title;
|
||||
}
|
||||
var dateFomers = result.pubdate.split("-");
|
||||
var publishedYear = parseInt(dateFomers[0], 10);
|
||||
var publishedMonth = parseInt(dateFomers[1], 10);
|
||||
var publishedDate = new Date(publishedYear, publishedMonth - 1, 1);
|
||||
|
||||
publishedDate = formatDate(publishedDate);
|
||||
|
||||
var book = {
|
||||
id: result.id,
|
||||
title: result.title,
|
||||
authors: result.author || [],
|
||||
description: result.summary,
|
||||
publisher: result.publisher || "",
|
||||
publishedDate: publishedDate || "",
|
||||
tags: result.tags.map(function(tag) {
|
||||
return tag.title.toLowerCase().replace(/,/g, "_");
|
||||
}),
|
||||
rating: result.rating.average || 0,
|
||||
series: seriesTitle || "",
|
||||
cover: result.image,
|
||||
url: "https://book.douban.com/subject/" + result.id,
|
||||
source: {
|
||||
id: "douban",
|
||||
description: "Douban Books",
|
||||
url: "https://book.douban.com/"
|
||||
}
|
||||
};
|
||||
|
||||
if (book.rating > 0) {
|
||||
book.rating /= 2;
|
||||
}
|
||||
|
||||
var $book = $(templates.bookResult(book));
|
||||
$book.find("img").on("click", function () {
|
||||
populateForm(book);
|
||||
});
|
||||
|
||||
$("#book-list").append($book);
|
||||
});
|
||||
dbDone = 2;
|
||||
} else {
|
||||
dbDone = 3;
|
||||
}
|
||||
}
|
||||
if (cvResults.length > 0) {
|
||||
if (cvDone < 2) {
|
||||
cvResults.forEach(function(result) {
|
||||
var seriesTitle = "";
|
||||
if (result.volume.name) {
|
||||
seriesTitle = result.volume.name;
|
||||
}
|
||||
var dateFomers = "";
|
||||
if (result.store_date) {
|
||||
dateFomers = result.store_date.split("-");
|
||||
} else {
|
||||
dateFomers = result.date_added.split("-");
|
||||
}
|
||||
var publishedYear = parseInt(dateFomers[0], 10);
|
||||
var publishedMonth = parseInt(dateFomers[1], 10);
|
||||
var publishedDate = new Date(publishedYear, publishedMonth - 1, 1);
|
||||
|
||||
publishedDate = formatDate(publishedDate);
|
||||
|
||||
var book = {
|
||||
id: result.id,
|
||||
title: seriesTitle + " #" + ("00" + result.issue_number).slice(-3) + " - " + result.name,
|
||||
authors: result.author || [],
|
||||
description: result.description,
|
||||
publisher: "",
|
||||
publishedDate: publishedDate || "",
|
||||
tags: ["Comics", seriesTitle],
|
||||
rating: 0,
|
||||
series: seriesTitle || "",
|
||||
cover: result.image.original_url,
|
||||
url: result.site_detail_url,
|
||||
source: {
|
||||
id: "comicvine",
|
||||
description: "ComicVine Books",
|
||||
url: "https://comicvine.gamespot.com/"
|
||||
}
|
||||
};
|
||||
|
||||
var $book = $(templates.bookResult(book));
|
||||
$book.find("img").on("click", function () {
|
||||
populateForm(book);
|
||||
});
|
||||
|
||||
$("#book-list").append($book);
|
||||
});
|
||||
cvDone = 2;
|
||||
} else {
|
||||
cvDone = 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ggSearchBook (title) {
|
||||
$.ajax({
|
||||
url: google + ggSearch + "?q=" + title.replace(/\s+/gm, "+"),
|
||||
type: "GET",
|
||||
dataType: "jsonp",
|
||||
jsonp: "callback",
|
||||
success: function success(data) {
|
||||
if ("items" in data) {
|
||||
ggResults = data.items;
|
||||
}
|
||||
},
|
||||
complete: function complete() {
|
||||
ggDone = 1;
|
||||
showResult();
|
||||
$("#show-google").trigger("change");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function dbSearchBook (title) {
|
||||
var apikey = "054022eaeae0b00e0fc068c0c0a2102a";
|
||||
$.ajax({
|
||||
url: douban + dbSearch + "?apikey=" + apikey + "&q=" + title + "&fields=all&count=10",
|
||||
type: "GET",
|
||||
dataType: "jsonp",
|
||||
jsonp: "callback",
|
||||
success: function success(data) {
|
||||
dbResults = data.books;
|
||||
},
|
||||
error: function error() {
|
||||
$("#meta-info").html("<p class=\"text-danger\">" + msg.search_error + "!</p>" + $("#meta-info")[0].innerHTML);
|
||||
},
|
||||
complete: function complete() {
|
||||
dbDone = 1;
|
||||
showResult();
|
||||
$("#show-douban").trigger("change");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function cvSearchBook (title) {
|
||||
var apikey = "57558043c53943d5d1e96a9ad425b0eb85532ee6";
|
||||
title = encodeURIComponent(title);
|
||||
$.ajax({
|
||||
url: comicvine + cvSearch + "?api_key=" + apikey + "&resources=issue&query=" + title + "&sort=name:desc&format=jsonp",
|
||||
type: "GET",
|
||||
dataType: "jsonp",
|
||||
jsonp: "json_callback",
|
||||
success: function success(data) {
|
||||
cvResults = data.results;
|
||||
},
|
||||
error: function error() {
|
||||
$("#meta-info").html("<p class=\"text-danger\">" + msg.search_error + "!</p>" + $("#meta-info")[0].innerHTML);
|
||||
},
|
||||
complete: function complete() {
|
||||
cvDone = 1;
|
||||
showResult();
|
||||
$("#show-comics").trigger("change");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function doSearch (keyword) {
|
||||
showFlag = 0;
|
||||
dbDone = ggDone = cvDone = 0;
|
||||
dbResults = [];
|
||||
ggResults = [];
|
||||
cvResults = [];
|
||||
$("#meta-info").text(msg.loading);
|
||||
if (keyword) {
|
||||
dbSearchBook(keyword);
|
||||
ggSearchBook(keyword);
|
||||
cvSearchBook(keyword);
|
||||
$("#meta-info").text(msg.loading);
|
||||
$.ajax({
|
||||
url: getPath() + "/metadata/search",
|
||||
type: "POST",
|
||||
data: {"query": keyword},
|
||||
dataType: "json",
|
||||
success: function success(data) {
|
||||
$("#meta-info").html("<ul id=\"book-list\" class=\"media-list\"></ul>");
|
||||
data.forEach(function(book) {
|
||||
var $book = $(templates.bookResult(book));
|
||||
$book.find("img").on("click", function () {
|
||||
populateForm(book);
|
||||
});
|
||||
$("#book-list").append($book);
|
||||
});
|
||||
},
|
||||
error: function error() {
|
||||
$("#meta-info").html("<p class=\"text-danger\">" + msg.search_error + "!</p>" + $("#meta-info")[0].innerHTML);
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function populate_provider() {
|
||||
$("#metadata_provider").empty();
|
||||
$.ajax({
|
||||
url: getPath() + "/metadata/provider",
|
||||
type: "get",
|
||||
dataType: "json",
|
||||
success: function success(data) {
|
||||
data.forEach(function(provider) {
|
||||
var checked = "";
|
||||
if (provider.active) {
|
||||
checked = "checked";
|
||||
}
|
||||
var $provider_button = '<input type="checkbox" id="show-' + provider.name + '" class="pill" data-initial="' + provider.initial + '" data-control="' + provider.id + '" ' + checked + '><label for="show-' + provider.name + '">' + provider.name + ' <span class="glyphicon glyphicon-ok"></span></label>'
|
||||
$("#metadata_provider").append($provider_button);
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
$(document).on("change", ".pill", function () {
|
||||
var element = $(this);
|
||||
var id = element.data("control");
|
||||
var initial = element.data("initial");
|
||||
var val = element.prop('checked');
|
||||
var params = {id : id, value: val};
|
||||
if (!initial) {
|
||||
params['initial'] = initial;
|
||||
params['query'] = keyword;
|
||||
}
|
||||
$.ajax({
|
||||
method:"post",
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
url: getPath() + "/metadata/provider/" + id,
|
||||
data: JSON.stringify(params),
|
||||
success: function success(data) {
|
||||
element.data("initial", "true");
|
||||
data.forEach(function(book) {
|
||||
var $book = $(templates.bookResult(book));
|
||||
$book.find("img").on("click", function () {
|
||||
populateForm(book);
|
||||
});
|
||||
$("#book-list").append($book);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#meta-search").on("submit", function (e) {
|
||||
e.preventDefault();
|
||||
var keyword = $("#keyword").val();
|
||||
if (keyword) {
|
||||
doSearch(keyword);
|
||||
}
|
||||
keyword = $("#keyword").val();
|
||||
$('.pill').each(function(){
|
||||
// console.log($(this).data('control'));
|
||||
$(this).data("initial", $(this).prop('checked'));
|
||||
// console.log($(this).data('initial'));
|
||||
});
|
||||
doSearch(keyword);
|
||||
});
|
||||
|
||||
$("#get_meta").click(function () {
|
||||
populate_provider();
|
||||
var bookTitle = $("#book_title").val();
|
||||
if (bookTitle) {
|
||||
$("#keyword").val(bookTitle);
|
||||
doSearch(bookTitle);
|
||||
}
|
||||
$("#keyword").val(bookTitle);
|
||||
keyword = bookTitle;
|
||||
doSearch(bookTitle);
|
||||
});
|
||||
$("#metaModal").on("show.bs.modal", function(e) {
|
||||
$(e.relatedTarget).one('focus', function (e) {
|
||||
$(this).blur();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -1,237 +0,0 @@
|
||||
/*
|
||||
* bitstream.js
|
||||
*
|
||||
* Provides readers for bitstreams.
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
*
|
||||
* Copyright(c) 2011 Google Inc.
|
||||
* Copyright(c) 2011 antimatter15
|
||||
*/
|
||||
|
||||
/* global bitjs, Uint8Array */
|
||||
|
||||
var bitjs = bitjs || {};
|
||||
bitjs.io = bitjs.io || {};
|
||||
|
||||
(function() {
|
||||
|
||||
// mask for getting the Nth bit (zero-based)
|
||||
bitjs.BIT = [0x01, 0x02, 0x04, 0x08,
|
||||
0x10, 0x20, 0x40, 0x80,
|
||||
0x100, 0x200, 0x400, 0x800,
|
||||
0x1000, 0x2000, 0x4000, 0x8000
|
||||
];
|
||||
|
||||
// mask for getting N number of bits (0-8)
|
||||
var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF];
|
||||
|
||||
|
||||
/**
|
||||
* This bit stream peeks and consumes bits out of a binary stream.
|
||||
*
|
||||
* @param {ArrayBuffer} ab An ArrayBuffer object or a Uint8Array.
|
||||
* @param {boolean} rtl Whether the stream reads bits from the byte starting
|
||||
* from bit 7 to 0 (true) or bit 0 to 7 (false).
|
||||
* @param {Number} optOffset The offset into the ArrayBuffer
|
||||
* @param {Number} optLength The length of this BitStream
|
||||
*/
|
||||
bitjs.io.BitStream = function(ab, rtl, optOffset, optLength) {
|
||||
if (!ab || !ab.toString || ab.toString() !== "[object ArrayBuffer]") {
|
||||
throw "Error! BitArray constructed with an invalid ArrayBuffer object";
|
||||
}
|
||||
|
||||
var offset = optOffset || 0;
|
||||
var length = optLength || ab.byteLength;
|
||||
this.bytes = new Uint8Array(ab, offset, length);
|
||||
this.bytePtr = 0; // tracks which byte we are on
|
||||
this.bitPtr = 0; // tracks which bit we are on (can have values 0 through 7)
|
||||
this.peekBits = rtl ? this.peekBitsRtl : this.peekBitsLtr;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* byte0 byte1 byte2 byte3
|
||||
* 7......0 | 7......0 | 7......0 | 7......0
|
||||
*
|
||||
* The bit pointer starts at bit0 of byte0 and moves left until it reaches
|
||||
* bit7 of byte0, then jumps to bit0 of byte1, etc.
|
||||
* @param {number} n The number of bits to peek.
|
||||
* @param {boolean=} movePointers Whether to move the pointer, defaults false.
|
||||
* @return {number} The peeked bits, as an unsigned number.
|
||||
*/
|
||||
bitjs.io.BitStream.prototype.peekBitsLtr = function(n, movePointers) {
|
||||
if (n <= 0 || typeof n !== typeof 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
var movePointers = movePointers || false,
|
||||
bytePtr = this.bytePtr,
|
||||
bitPtr = this.bitPtr,
|
||||
result = 0,
|
||||
bitsIn = 0,
|
||||
bytes = this.bytes;
|
||||
|
||||
// keep going until we have no more bits left to peek at
|
||||
// TODO: Consider putting all bits from bytes we will need into a variable and then
|
||||
// shifting/masking it to just extract the bits we want.
|
||||
// This could be considerably faster when reading more than 3 or 4 bits at a time.
|
||||
while (n > 0) {
|
||||
if (bytePtr >= bytes.length) {
|
||||
throw "Error! Overflowed the bit stream! n=" + n + ", bytePtr=" + bytePtr + ", bytes.length=" +
|
||||
bytes.length + ", bitPtr=" + bitPtr;
|
||||
// return -1;
|
||||
}
|
||||
|
||||
var numBitsLeftInThisByte = (8 - bitPtr);
|
||||
var mask;
|
||||
if (n >= numBitsLeftInThisByte) {
|
||||
mask = (BITMASK[numBitsLeftInThisByte] << bitPtr);
|
||||
result |= (((bytes[bytePtr] & mask) >> bitPtr) << bitsIn);
|
||||
|
||||
bytePtr++;
|
||||
bitPtr = 0;
|
||||
bitsIn += numBitsLeftInThisByte;
|
||||
n -= numBitsLeftInThisByte;
|
||||
} else {
|
||||
mask = (BITMASK[n] << bitPtr);
|
||||
result |= (((bytes[bytePtr] & mask) >> bitPtr) << bitsIn);
|
||||
|
||||
bitPtr += n;
|
||||
bitsIn += n;
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (movePointers) {
|
||||
this.bitPtr = bitPtr;
|
||||
this.bytePtr = bytePtr;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* byte0 byte1 byte2 byte3
|
||||
* 7......0 | 7......0 | 7......0 | 7......0
|
||||
*
|
||||
* The bit pointer starts at bit7 of byte0 and moves right until it reaches
|
||||
* bit0 of byte0, then goes to bit7 of byte1, etc.
|
||||
* @param {number} n The number of bits to peek.
|
||||
* @param {boolean=} movePointers Whether to move the pointer, defaults false.
|
||||
* @return {number} The peeked bits, as an unsigned number.
|
||||
*/
|
||||
bitjs.io.BitStream.prototype.peekBitsRtl = function(n, movePointers) {
|
||||
if (n <= 0 || typeof n !== typeof 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
var movePointers = movePointers || false,
|
||||
bytePtr = this.bytePtr,
|
||||
bitPtr = this.bitPtr,
|
||||
result = 0,
|
||||
bytes = this.bytes;
|
||||
|
||||
// keep going until we have no more bits left to peek at
|
||||
// TODO: Consider putting all bits from bytes we will need into a variable and then
|
||||
// shifting/masking it to just extract the bits we want.
|
||||
// This could be considerably faster when reading more than 3 or 4 bits at a time.
|
||||
while (n > 0) {
|
||||
|
||||
if (bytePtr >= bytes.length) {
|
||||
throw "Error! Overflowed the bit stream! n=" + n + ", bytePtr=" + bytePtr + ", bytes.length=" +
|
||||
bytes.length + ", bitPtr=" + bitPtr;
|
||||
// return -1;
|
||||
}
|
||||
|
||||
var numBitsLeftInThisByte = (8 - bitPtr);
|
||||
if (n >= numBitsLeftInThisByte) {
|
||||
result <<= numBitsLeftInThisByte;
|
||||
result |= (BITMASK[numBitsLeftInThisByte] & bytes[bytePtr]);
|
||||
bytePtr++;
|
||||
bitPtr = 0;
|
||||
n -= numBitsLeftInThisByte;
|
||||
} else {
|
||||
result <<= n;
|
||||
result |= ((bytes[bytePtr] & (BITMASK[n] << (8 - n - bitPtr))) >> (8 - n - bitPtr));
|
||||
|
||||
bitPtr += n;
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (movePointers) {
|
||||
this.bitPtr = bitPtr;
|
||||
this.bytePtr = bytePtr;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Peek at 16 bits from current position in the buffer.
|
||||
* Bit at (bytePtr,bitPtr) has the highest position in returning data.
|
||||
* Taken from getbits.hpp in unrar.
|
||||
* TODO: Move this out of BitStream and into unrar.
|
||||
*/
|
||||
bitjs.io.BitStream.prototype.getBits = function() {
|
||||
return (((((this.bytes[this.bytePtr] & 0xff) << 16) +
|
||||
((this.bytes[this.bytePtr + 1] & 0xff) << 8) +
|
||||
((this.bytes[this.bytePtr + 2] & 0xff))) >>> (8 - this.bitPtr)) & 0xffff);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Reads n bits out of the stream, consuming them (moving the bit pointer).
|
||||
* @param {number} n The number of bits to read.
|
||||
* @return {number} The read bits, as an unsigned number.
|
||||
*/
|
||||
bitjs.io.BitStream.prototype.readBits = function(n) {
|
||||
return this.peekBits(n, true);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* This returns n bytes as a sub-array, advancing the pointer if movePointers
|
||||
* is true. Only use this for uncompressed blocks as this throws away remaining
|
||||
* bits in the current byte.
|
||||
* @param {number} n The number of bytes to peek.
|
||||
* @param {boolean=} movePointers Whether to move the pointer, defaults false.
|
||||
* @return {Uint8Array} The subarray.
|
||||
*/
|
||||
bitjs.io.BitStream.prototype.peekBytes = function(n, movePointers) {
|
||||
if (n <= 0 || typeof n !== typeof 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// from http://tools.ietf.org/html/rfc1951#page-11
|
||||
// "Any bits of input up to the next byte boundary are ignored."
|
||||
while (this.bitPtr !== 0) {
|
||||
this.readBits(1);
|
||||
}
|
||||
|
||||
var movePointers = movePointers || false;
|
||||
var bytePtr = this.bytePtr;
|
||||
// bitPtr = this.bitPtr;
|
||||
|
||||
var result = this.bytes.subarray(bytePtr, bytePtr + n);
|
||||
|
||||
if (movePointers) {
|
||||
this.bytePtr += n;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @return {Uint8Array} The subarray.
|
||||
*/
|
||||
bitjs.io.BitStream.prototype.readBytes = function(n) {
|
||||
return this.peekBytes(n, true);
|
||||
};
|
||||
|
||||
})();
|
||||
@@ -1,124 +0,0 @@
|
||||
/*
|
||||
* bytestream.js
|
||||
*
|
||||
* Provides a writer for bytes.
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
*
|
||||
* Copyright(c) 2011 Google Inc.
|
||||
* Copyright(c) 2011 antimatter15
|
||||
*/
|
||||
|
||||
/* global bitjs, Uint8Array */
|
||||
|
||||
var bitjs = bitjs || {};
|
||||
bitjs.io = bitjs.io || {};
|
||||
|
||||
(function() {
|
||||
|
||||
|
||||
/**
|
||||
* A write-only Byte buffer which uses a Uint8 Typed Array as a backing store.
|
||||
* @param {number} numBytes The number of bytes to allocate.
|
||||
* @constructor
|
||||
*/
|
||||
bitjs.io.ByteBuffer = function(numBytes) {
|
||||
if (typeof numBytes !== typeof 1 || numBytes <= 0) {
|
||||
throw "Error! ByteBuffer initialized with '" + numBytes + "'";
|
||||
}
|
||||
this.data = new Uint8Array(numBytes);
|
||||
this.ptr = 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {number} b The byte to insert.
|
||||
*/
|
||||
bitjs.io.ByteBuffer.prototype.insertByte = function(b) {
|
||||
// TODO: throw if byte is invalid?
|
||||
this.data[this.ptr++] = b;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Array.<number>|Uint8Array|Int8Array} bytes The bytes to insert.
|
||||
*/
|
||||
bitjs.io.ByteBuffer.prototype.insertBytes = function(bytes) {
|
||||
// TODO: throw if bytes is invalid?
|
||||
this.data.set(bytes, this.ptr);
|
||||
this.ptr += bytes.length;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Writes an unsigned number into the next n bytes. If the number is too large
|
||||
* to fit into n bytes or is negative, an error is thrown.
|
||||
* @param {number} num The unsigned number to write.
|
||||
* @param {number} numBytes The number of bytes to write the number into.
|
||||
*/
|
||||
bitjs.io.ByteBuffer.prototype.writeNumber = function(num, numBytes) {
|
||||
if (numBytes < 1) {
|
||||
throw "Trying to write into too few bytes: " + numBytes;
|
||||
}
|
||||
if (num < 0) {
|
||||
throw "Trying to write a negative number (" + num +
|
||||
") as an unsigned number to an ArrayBuffer";
|
||||
}
|
||||
if (num > (Math.pow(2, numBytes * 8) - 1)) {
|
||||
throw "Trying to write " + num + " into only " + numBytes + " bytes";
|
||||
}
|
||||
|
||||
// Roll 8-bits at a time into an array of bytes.
|
||||
var bytes = [];
|
||||
while (numBytes-- > 0) {
|
||||
var eightBits = num & 255;
|
||||
bytes.push(eightBits);
|
||||
num >>= 8;
|
||||
}
|
||||
|
||||
this.insertBytes(bytes);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Writes a signed number into the next n bytes. If the number is too large
|
||||
* to fit into n bytes, an error is thrown.
|
||||
* @param {number} num The signed number to write.
|
||||
* @param {number} numBytes The number of bytes to write the number into.
|
||||
*/
|
||||
bitjs.io.ByteBuffer.prototype.writeSignedNumber = function(num, numBytes) {
|
||||
if (numBytes < 1) {
|
||||
throw "Trying to write into too few bytes: " + numBytes;
|
||||
}
|
||||
|
||||
var HALF = Math.pow(2, (numBytes * 8) - 1);
|
||||
if (num >= HALF || num < -HALF) {
|
||||
throw "Trying to write " + num + " into only " + numBytes + " bytes";
|
||||
}
|
||||
|
||||
// Roll 8-bits at a time into an array of bytes.
|
||||
var bytes = [];
|
||||
while (numBytes-- > 0) {
|
||||
var eightBits = num & 255;
|
||||
bytes.push(eightBits);
|
||||
num >>= 8;
|
||||
}
|
||||
|
||||
this.insertBytes(bytes);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {string} str The ASCII string to write.
|
||||
*/
|
||||
bitjs.io.ByteBuffer.prototype.writeASCIIString = function(str) {
|
||||
for (var i = 0; i < str.length; ++i) {
|
||||
var curByte = str.charCodeAt(i);
|
||||
if (curByte < 0 || curByte > 255) {
|
||||
throw "Trying to write a non-ASCII string!";
|
||||
}
|
||||
this.insertByte(curByte);
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
@@ -1,195 +0,0 @@
|
||||
/*
|
||||
* bytestream.js
|
||||
*
|
||||
* Provides readers for byte streams.
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
*
|
||||
* Copyright(c) 2011 Google Inc.
|
||||
* Copyright(c) 2011 antimatter15
|
||||
*/
|
||||
|
||||
/* global bitjs, Uint8Array */
|
||||
|
||||
var bitjs = bitjs || {};
|
||||
bitjs.io = bitjs.io || {};
|
||||
|
||||
(function() {
|
||||
|
||||
|
||||
/**
|
||||
* This object allows you to peek and consume bytes as numbers and strings
|
||||
* out of an ArrayBuffer. In this buffer, everything must be byte-aligned.
|
||||
*
|
||||
* @param {ArrayBuffer} ab The ArrayBuffer object.
|
||||
* @param {number=} optOffset The offset into the ArrayBuffer
|
||||
* @param {number=} optLength The length of this BitStream
|
||||
* @constructor
|
||||
*/
|
||||
bitjs.io.ByteStream = function(ab, optOffset, optLength) {
|
||||
var offset = optOffset || 0;
|
||||
var length = optLength || ab.byteLength;
|
||||
this.bytes = new Uint8Array(ab, offset, length);
|
||||
this.ptr = 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Peeks at the next n bytes as an unsigned number but does not advance the
|
||||
* pointer
|
||||
* TODO: This apparently cannot read more than 4 bytes as a number?
|
||||
* @param {number} n The number of bytes to peek at.
|
||||
* @return {number} The n bytes interpreted as an unsigned number.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.peekNumber = function(n) {
|
||||
// TODO: return error if n would go past the end of the stream?
|
||||
if (n <= 0 || typeof n !== typeof 1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
var result = 0;
|
||||
// read from last byte to first byte and roll them in
|
||||
var curByte = this.ptr + n - 1;
|
||||
while (curByte >= this.ptr) {
|
||||
result <<= 8;
|
||||
result |= this.bytes[curByte];
|
||||
--curByte;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the next n bytes as an unsigned number (or -1 on error)
|
||||
* and advances the stream pointer n bytes.
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @return {number} The n bytes interpreted as an unsigned number.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.readNumber = function(n) {
|
||||
var num = this.peekNumber(n);
|
||||
this.ptr += n;
|
||||
return num;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the next n bytes as a signed number but does not advance the
|
||||
* pointer.
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @return {number} The bytes interpreted as a signed number.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.peekSignedNumber = function(n) {
|
||||
var num = this.peekNumber(n);
|
||||
var HALF = Math.pow(2, (n * 8) - 1);
|
||||
var FULL = HALF * 2;
|
||||
|
||||
if (num >= HALF) num -= FULL;
|
||||
|
||||
return num;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the next n bytes as a signed number and advances the stream pointer.
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @return {number} The bytes interpreted as a signed number.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.readSignedNumber = function(n) {
|
||||
var num = this.peekSignedNumber(n);
|
||||
this.ptr += n;
|
||||
return num;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* ToDo: Returns the next n bytes as a signed number and advances the stream pointer.
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @return {number} The bytes interpreted as a signed number.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.movePointer = function(n) {
|
||||
this.ptr += n;
|
||||
// end of buffer reached
|
||||
if ((this.bytes.byteLength - this.ptr) < 0 ) {
|
||||
this.ptr = this.bytes.byteLength;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ToDo: Returns the next n bytes as a signed number and advances the stream pointer.
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @return {number} The bytes interpreted as a signed number.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.moveTo = function(n) {
|
||||
if ( n < 0 ) {
|
||||
n = 0;
|
||||
}
|
||||
this.ptr = n;
|
||||
// end of buffer reached
|
||||
if ((this.bytes.byteLength - this.ptr) < 0 ) {
|
||||
this.ptr = this.bytes.byteLength;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This returns n bytes as a sub-array, advancing the pointer if movePointers
|
||||
* is true.
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @param {boolean} movePointers Whether to move the pointers.
|
||||
* @return {Uint8Array} The subarray.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.peekBytes = function(n, movePointers) {
|
||||
if (n <= 0 || typeof n !== typeof 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var result = this.bytes.subarray(this.ptr, this.ptr + n);
|
||||
|
||||
if (movePointers) {
|
||||
this.ptr += n;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Reads the next n bytes as a sub-array.
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @return {Uint8Array} The subarray.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.readBytes = function(n) {
|
||||
return this.peekBytes(n, true);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Peeks at the next n bytes as a string but does not advance the pointer.
|
||||
* @param {number} n The number of bytes to peek at.
|
||||
* @return {string} The next n bytes as a string.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.peekString = function(n) {
|
||||
if (n <= 0 || typeof n !== typeof 1) {
|
||||
return "";
|
||||
}
|
||||
|
||||
var result = "";
|
||||
for (var p = this.ptr, end = this.ptr + n; p < end; ++p) {
|
||||
result += String.fromCharCode(this.bytes[p]);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the next n bytes as an ASCII string and advances the stream pointer
|
||||
* n bytes.
|
||||
* @param {number} n The number of bytes to read.
|
||||
* @return {string} The next n bytes as a string.
|
||||
*/
|
||||
bitjs.io.ByteStream.prototype.readString = function(n) {
|
||||
var strToReturn = this.peekString(n);
|
||||
this.ptr += n;
|
||||
return strToReturn;
|
||||
};
|
||||
|
||||
})();
|
||||
+76
-106
@@ -15,7 +15,7 @@
|
||||
* Typed Arrays: http://www.khronos.org/registry/typedarray/specs/latest/#6
|
||||
|
||||
*/
|
||||
/* global screenfull, bitjs, Uint8Array, opera */
|
||||
/* global screenfull, bitjs, Uint8Array, opera, loadArchiveFormats, archiveOpenFile */
|
||||
/* exported init, event */
|
||||
|
||||
|
||||
@@ -69,7 +69,9 @@ var settings = {
|
||||
rotateTimes: 0,
|
||||
fitMode: kthoom.Key.B,
|
||||
theme: "light",
|
||||
direction: 0 // 0 = Left to Right, 1 = Right to Left
|
||||
direction: 0, // 0 = Left to Right, 1 = Right to Left
|
||||
nextPage: 0, // 0 = Reset to Top, 1 = Remember Position
|
||||
scrollbar: 1 // 0 = Hide Scrollbar, 1 = Show Scrollbar
|
||||
};
|
||||
|
||||
kthoom.saveSettings = function() {
|
||||
@@ -102,9 +104,8 @@ kthoom.setSettings = function() {
|
||||
};
|
||||
|
||||
var createURLFromArray = function(array, mimeType) {
|
||||
var offset = array.byteOffset;
|
||||
var offset = 0; // array.byteOffset;
|
||||
var len = array.byteLength;
|
||||
// var url;
|
||||
var blob;
|
||||
|
||||
if (mimeType === "image/xml+svg") {
|
||||
@@ -164,90 +165,61 @@ kthoom.ImageFile = function(file) {
|
||||
}
|
||||
if ( this.mimeType !== undefined) {
|
||||
this.dataURI = createURLFromArray(file.fileData, this.mimeType);
|
||||
this.data = file;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
function initProgressClick() {
|
||||
$("#progress").click(function(e) {
|
||||
var page = Math.max(1, Math.ceil((e.offsetX / $(this).width()) * totalImages)) - 1;
|
||||
currentImage = page;
|
||||
var offset = $(this).offset();
|
||||
var x = e.pageX - offset.left;
|
||||
var rate = settings.direction === 0 ? x / $(this).width() : 1 - x / $(this).width();
|
||||
currentImage = Math.max(1, Math.ceil(rate * totalImages)) - 1;
|
||||
updatePage();
|
||||
});
|
||||
}
|
||||
|
||||
function loadFromArrayBuffer(ab) {
|
||||
var start = (new Date).getTime();
|
||||
var h = new Uint8Array(ab, 0, 10);
|
||||
var pathToBitJS = "../../static/js/archive/";
|
||||
var lastCompletion = 0;
|
||||
if (h[0] === 0x52 && h[1] === 0x61 && h[2] === 0x72 && h[3] === 0x21) { //Rar!
|
||||
unarchiver = new bitjs.archive.Unrarrer(ab, pathToBitJS);
|
||||
} else if (h[0] === 80 && h[1] === 75) { //PK (Zip)
|
||||
unarchiver = new bitjs.archive.Unzipper(ab, pathToBitJS);
|
||||
} else if (h[0] === 255 && h[1] === 216) { // JPEG
|
||||
// ToDo: check
|
||||
updateProgress(100);
|
||||
lastCompletion = 100;
|
||||
return;
|
||||
} else { // Try with tar
|
||||
unarchiver = new bitjs.archive.Untarrer(ab, pathToBitJS);
|
||||
}
|
||||
// Listen for UnarchiveEvents.
|
||||
if (unarchiver) {
|
||||
unarchiver.addEventListener(bitjs.archive.UnarchiveEvent.Type.PROGRESS,
|
||||
function(e) {
|
||||
var percentage = e.currentBytesUnarchived / e.totalUncompressedBytesInArchive;
|
||||
if (totalImages === 0) {
|
||||
totalImages = e.totalFilesInArchive;
|
||||
}
|
||||
updateProgress(percentage * 100);
|
||||
lastCompletion = percentage * 100;
|
||||
});
|
||||
unarchiver.addEventListener(bitjs.archive.UnarchiveEvent.Type.INFO,
|
||||
function(e) {
|
||||
// console.log(e.msg); // Enable debug output here
|
||||
});
|
||||
unarchiver.addEventListener(bitjs.archive.UnarchiveEvent.Type.EXTRACT,
|
||||
function(e) {
|
||||
// convert DecompressedFile into a bunch of ImageFiles
|
||||
if (e.unarchivedFile) {
|
||||
var f = e.unarchivedFile;
|
||||
// add any new pages based on the filename
|
||||
if (imageFilenames.indexOf(f.filename) === -1) {
|
||||
var test = new kthoom.ImageFile(f);
|
||||
if ( test.mimeType !== undefined) {
|
||||
imageFilenames.push(f.filename);
|
||||
imageFiles.push(test);
|
||||
// add thumbnails to the TOC list
|
||||
$("#thumbnails").append(
|
||||
"<li>" +
|
||||
"<a data-page='" + imageFiles.length + "'>" +
|
||||
loadArchiveFormats(['rar', 'zip', 'tar'], function() {
|
||||
// Open the file as an archive
|
||||
archiveOpenFile(ab, function (archive) {
|
||||
if (archive) {
|
||||
totalImages = archive.entries.length
|
||||
console.info('Uncompressing ' + archive.archive_type + ' ...');
|
||||
archive.entries.forEach(function(e, i) {
|
||||
updateProgress( (i + 1)/ totalImages * 100);
|
||||
if (e.is_file) {
|
||||
e.readData(function(d) {
|
||||
// add any new pages based on the filename
|
||||
if (imageFilenames.indexOf(e.name) === -1) {
|
||||
let data = {filename: e.name, fileData: d};
|
||||
var test = new kthoom.ImageFile(data);
|
||||
if (test.mimeType !== undefined) {
|
||||
imageFilenames.push(e.name);
|
||||
imageFiles.push(test);
|
||||
// add thumbnails to the TOC list
|
||||
$("#thumbnails").append(
|
||||
"<li>" +
|
||||
"<a data-page='" + imageFiles.length + "'>" +
|
||||
"<img src='" + imageFiles[imageFiles.length - 1].dataURI + "'/>" +
|
||||
"<span>" + imageFiles.length + "</span>" +
|
||||
"</a>" +
|
||||
"</li>"
|
||||
);
|
||||
// display first page if we haven't yet
|
||||
if (imageFiles.length === currentImage + 1) {
|
||||
updatePage(lastCompletion);
|
||||
"</a>" +
|
||||
"</li>"
|
||||
);
|
||||
// display first page if we haven't yet
|
||||
if (imageFiles.length === currentImage + 1) {
|
||||
updatePage(lastCompletion);
|
||||
}
|
||||
} else {
|
||||
totalImages--;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
totalImages--;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
unarchiver.addEventListener(bitjs.archive.UnarchiveEvent.Type.FINISH,
|
||||
function() {
|
||||
var diff = ((new Date).getTime() - start) / 1000;
|
||||
console.log("Unarchiving done in " + diff + "s");
|
||||
});
|
||||
unarchiver.start();
|
||||
} else {
|
||||
alert("Some error");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function scrollTocToActive() {
|
||||
@@ -279,12 +251,29 @@ function updatePage() {
|
||||
}
|
||||
|
||||
$("body").toggleClass("dark-theme", settings.theme === "dark");
|
||||
$("#mainContent").toggleClass("disabled-scrollbar", settings.scrollbar === 0);
|
||||
|
||||
kthoom.setSettings();
|
||||
kthoom.saveSettings();
|
||||
}
|
||||
|
||||
function updateProgress(loadPercentage) {
|
||||
if (settings.direction === 0) {
|
||||
$("#progress .bar-read")
|
||||
.removeClass("from-right")
|
||||
.addClass("from-left");
|
||||
$("#progress .bar-load")
|
||||
.removeClass("from-right")
|
||||
.addClass("from-left");
|
||||
} else {
|
||||
$("#progress .bar-read")
|
||||
.removeClass("from-left")
|
||||
.addClass("from-right");
|
||||
$("#progress .bar-load")
|
||||
.removeClass("from-left")
|
||||
.addClass("from-right");
|
||||
}
|
||||
|
||||
// Set the load/unzip progress if it's passed in
|
||||
if (loadPercentage) {
|
||||
$("#progress .bar-load").css({ width: loadPercentage + "%" });
|
||||
@@ -295,7 +284,6 @@ function updateProgress(loadPercentage) {
|
||||
.find(".load").text("");
|
||||
}
|
||||
}
|
||||
|
||||
// Set page progress bar
|
||||
$("#progress .bar-read").css({ width: totalImages === 0 ? 0 : Math.round((currentImage + 1) / totalImages * 100) + "%"});
|
||||
}
|
||||
@@ -420,6 +408,9 @@ function showPrevPage() {
|
||||
currentImage++;
|
||||
} else {
|
||||
updatePage();
|
||||
if (settings.nextPage === 0) {
|
||||
$("#mainContent").scrollTop(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -430,6 +421,9 @@ function showNextPage() {
|
||||
currentImage--;
|
||||
} else {
|
||||
updatePage();
|
||||
if (settings.nextPage === 0) {
|
||||
$("#mainContent").scrollTop(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -525,19 +519,14 @@ function keyHandler(evt) {
|
||||
updateScale(false);
|
||||
break;
|
||||
case kthoom.Key.SPACE:
|
||||
var container = $("#mainContent");
|
||||
var atTop = container.scrollTop() === 0;
|
||||
var atBottom = container.scrollTop() >= container[0].scrollHeight - container.height();
|
||||
|
||||
if (evt.shiftKey && atTop) {
|
||||
if (evt.shiftKey) {
|
||||
evt.preventDefault();
|
||||
// If it's Shift + Space and the container is at the top of the page
|
||||
showLeftPage();
|
||||
} else if (!evt.shiftKey && atBottom) {
|
||||
showPrevPage();
|
||||
} else {
|
||||
evt.preventDefault();
|
||||
// If you're at the bottom of the page and you only pressed space
|
||||
showRightPage();
|
||||
container.scrollTop(0);
|
||||
showNextPage();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -546,33 +535,11 @@ function keyHandler(evt) {
|
||||
}
|
||||
}
|
||||
|
||||
/*function ImageLoadCallback() {
|
||||
var jso = this.response;
|
||||
// Unable to decompress file, or no response from server
|
||||
if (jso === null) {
|
||||
setImage("error");
|
||||
} else {
|
||||
// IE 11 sometimes sees the response as a string
|
||||
if (typeof jso !== "object") {
|
||||
jso = JSON.parse(jso);
|
||||
}
|
||||
|
||||
if (jso.page !== jso.last) {
|
||||
this.open("GET", this.fileid + "/" + (jso.page + 1));
|
||||
this.addEventListener("load", ImageLoadCallback);
|
||||
this.send();
|
||||
}
|
||||
|
||||
loadFromArrayBuffer(jso);
|
||||
}
|
||||
}*/
|
||||
function init(filename) {
|
||||
var request = new XMLHttpRequest();
|
||||
request.open("GET", filename);
|
||||
request.responseType = "arraybuffer";
|
||||
request.setRequestHeader("X-Test", "test1");
|
||||
request.setRequestHeader("X-Test", "test2");
|
||||
request.addEventListener("load", function(event) {
|
||||
request.addEventListener("load", function() {
|
||||
if (request.status >= 200 && request.status < 300) {
|
||||
loadFromArrayBuffer(request.response);
|
||||
} else {
|
||||
@@ -632,6 +599,9 @@ function init(filename) {
|
||||
$("#thumbnails").on("click", "a", function() {
|
||||
currentImage = $(this).data("page") - 1;
|
||||
updatePage();
|
||||
if (settings.nextPage === 0) {
|
||||
$("#mainContent").scrollTop(0);
|
||||
}
|
||||
});
|
||||
|
||||
// Fullscreen mode
|
||||
|
||||
Vendored
+2
-2
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates["pt-BR"]={days:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"],daysShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],daysMin:["Do","Se","Te","Qu","Qu","Se","Sa"],months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthsShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],today:"Hoje",monthsTitle:"Meses",clear:"Limpar",format:"dd/mm/yyyy"}}(jQuery);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
Vendored
-639
@@ -1,639 +0,0 @@
|
||||
/* Copyright 2012 Mozilla Foundation
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
/* eslint strict: ["error", "function"] */
|
||||
/* eslint-disable no-extend-native */
|
||||
/* globals VBArray, PDFJS */
|
||||
|
||||
(function compatibilityWrapper() {
|
||||
'use strict';
|
||||
|
||||
var userAgent = navigator.userAgent;
|
||||
|
||||
var isAndroid = /Android/.test(userAgent);
|
||||
var isAndroidPre3 = /Android\s[0-2][^\d]/.test(userAgent);
|
||||
var isAndroidPre5 = /Android\s[0-4][^\d]/.test(userAgent);
|
||||
var isChrome = userAgent.indexOf('Chrom') >= 0;
|
||||
var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(userAgent);
|
||||
var isIE = userAgent.indexOf('Trident') >= 0;
|
||||
var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);
|
||||
var isOpera = userAgent.indexOf('Opera') >= 0;
|
||||
var isSafari = /Safari\//.test(userAgent) &&
|
||||
!/(Chrome\/|Android\s)/.test(userAgent);
|
||||
|
||||
// Initializing PDFJS global object here, it case if we need to change/disable
|
||||
// some PDF.js features, e.g. range requests
|
||||
if (typeof PDFJS === 'undefined') {
|
||||
(typeof window !== 'undefined' ? window : this).PDFJS = {};
|
||||
}
|
||||
|
||||
// Checking if the typed arrays are supported
|
||||
// Support: iOS<6.0 (subarray), IE<10, Android<4.0
|
||||
(function checkTypedArrayCompatibility() {
|
||||
if (typeof Uint8Array !== 'undefined') {
|
||||
// Support: iOS<6.0
|
||||
if (typeof Uint8Array.prototype.subarray === 'undefined') {
|
||||
Uint8Array.prototype.subarray = function subarray(start, end) {
|
||||
return new Uint8Array(this.slice(start, end));
|
||||
};
|
||||
Float32Array.prototype.subarray = function subarray(start, end) {
|
||||
return new Float32Array(this.slice(start, end));
|
||||
};
|
||||
}
|
||||
|
||||
// Support: Android<4.1
|
||||
if (typeof Float64Array === 'undefined') {
|
||||
window.Float64Array = Float32Array;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
function subarray(start, end) {
|
||||
return new TypedArray(this.slice(start, end));
|
||||
}
|
||||
|
||||
function setArrayOffset(array, offset) {
|
||||
if (arguments.length < 2) {
|
||||
offset = 0;
|
||||
}
|
||||
for (var i = 0, n = array.length; i < n; ++i, ++offset) {
|
||||
this[offset] = array[i] & 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
function TypedArray(arg1) {
|
||||
var result, i, n;
|
||||
if (typeof arg1 === 'number') {
|
||||
result = [];
|
||||
for (i = 0; i < arg1; ++i) {
|
||||
result[i] = 0;
|
||||
}
|
||||
} else if ('slice' in arg1) {
|
||||
result = arg1.slice(0);
|
||||
} else {
|
||||
result = [];
|
||||
for (i = 0, n = arg1.length; i < n; ++i) {
|
||||
result[i] = arg1[i];
|
||||
}
|
||||
}
|
||||
|
||||
result.subarray = subarray;
|
||||
result.buffer = result;
|
||||
result.byteLength = result.length;
|
||||
result.set = setArrayOffset;
|
||||
|
||||
if (typeof arg1 === 'object' && arg1.buffer) {
|
||||
result.buffer = arg1.buffer;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
window.Uint8Array = TypedArray;
|
||||
window.Int8Array = TypedArray;
|
||||
|
||||
// we don't need support for set, byteLength for 32-bit array
|
||||
// so we can use the TypedArray as well
|
||||
window.Uint32Array = TypedArray;
|
||||
window.Int32Array = TypedArray;
|
||||
window.Uint16Array = TypedArray;
|
||||
window.Float32Array = TypedArray;
|
||||
window.Float64Array = TypedArray;
|
||||
})();
|
||||
|
||||
// URL = URL || webkitURL
|
||||
// Support: Safari<7, Android 4.2+
|
||||
(function normalizeURLObject() {
|
||||
if (!window.URL) {
|
||||
window.URL = window.webkitURL;
|
||||
}
|
||||
})();
|
||||
|
||||
// Object.defineProperty()?
|
||||
// Support: Android<4.0, Safari<5.1
|
||||
(function checkObjectDefinePropertyCompatibility() {
|
||||
if (typeof Object.defineProperty !== 'undefined') {
|
||||
var definePropertyPossible = true;
|
||||
try {
|
||||
// some browsers (e.g. safari) cannot use defineProperty() on DOM objects
|
||||
// and thus the native version is not sufficient
|
||||
Object.defineProperty(new Image(), 'id', { value: 'test' });
|
||||
// ... another test for android gb browser for non-DOM objects
|
||||
var Test = function Test() {};
|
||||
Test.prototype = { get id() { } };
|
||||
Object.defineProperty(new Test(), 'id',
|
||||
{ value: '', configurable: true, enumerable: true, writable: false });
|
||||
} catch (e) {
|
||||
definePropertyPossible = false;
|
||||
}
|
||||
if (definePropertyPossible) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Object.defineProperty = function objectDefineProperty(obj, name, def) {
|
||||
delete obj[name];
|
||||
if ('get' in def) {
|
||||
obj.__defineGetter__(name, def['get']);
|
||||
}
|
||||
if ('set' in def) {
|
||||
obj.__defineSetter__(name, def['set']);
|
||||
}
|
||||
if ('value' in def) {
|
||||
obj.__defineSetter__(name, function objectDefinePropertySetter(value) {
|
||||
this.__defineGetter__(name, function objectDefinePropertyGetter() {
|
||||
return value;
|
||||
});
|
||||
return value;
|
||||
});
|
||||
obj[name] = def.value;
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
|
||||
// No XMLHttpRequest#response?
|
||||
// Support: IE<11, Android <4.0
|
||||
(function checkXMLHttpRequestResponseCompatibility() {
|
||||
var xhrPrototype = XMLHttpRequest.prototype;
|
||||
var xhr = new XMLHttpRequest();
|
||||
if (!('overrideMimeType' in xhr)) {
|
||||
// IE10 might have response, but not overrideMimeType
|
||||
// Support: IE10
|
||||
Object.defineProperty(xhrPrototype, 'overrideMimeType', {
|
||||
value: function xmlHttpRequestOverrideMimeType(mimeType) {}
|
||||
});
|
||||
}
|
||||
if ('responseType' in xhr) {
|
||||
return;
|
||||
}
|
||||
|
||||
// The worker will be using XHR, so we can save time and disable worker.
|
||||
PDFJS.disableWorker = true;
|
||||
|
||||
Object.defineProperty(xhrPrototype, 'responseType', {
|
||||
get: function xmlHttpRequestGetResponseType() {
|
||||
return this._responseType || 'text';
|
||||
},
|
||||
set: function xmlHttpRequestSetResponseType(value) {
|
||||
if (value === 'text' || value === 'arraybuffer') {
|
||||
this._responseType = value;
|
||||
if (value === 'arraybuffer' &&
|
||||
typeof this.overrideMimeType === 'function') {
|
||||
this.overrideMimeType('text/plain; charset=x-user-defined');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Support: IE9
|
||||
if (typeof VBArray !== 'undefined') {
|
||||
Object.defineProperty(xhrPrototype, 'response', {
|
||||
get: function xmlHttpRequestResponseGet() {
|
||||
if (this.responseType === 'arraybuffer') {
|
||||
return new Uint8Array(new VBArray(this.responseBody).toArray());
|
||||
}
|
||||
return this.responseText;
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
Object.defineProperty(xhrPrototype, 'response', {
|
||||
get: function xmlHttpRequestResponseGet() {
|
||||
if (this.responseType !== 'arraybuffer') {
|
||||
return this.responseText;
|
||||
}
|
||||
var text = this.responseText;
|
||||
var i, n = text.length;
|
||||
var result = new Uint8Array(n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
result[i] = text.charCodeAt(i) & 0xFF;
|
||||
}
|
||||
return result.buffer;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
// window.btoa (base64 encode function) ?
|
||||
// Support: IE<10
|
||||
(function checkWindowBtoaCompatibility() {
|
||||
if ('btoa' in window) {
|
||||
return;
|
||||
}
|
||||
|
||||
var digits =
|
||||
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||
|
||||
window.btoa = function windowBtoa(chars) {
|
||||
var buffer = '';
|
||||
var i, n;
|
||||
for (i = 0, n = chars.length; i < n; i += 3) {
|
||||
var b1 = chars.charCodeAt(i) & 0xFF;
|
||||
var b2 = chars.charCodeAt(i + 1) & 0xFF;
|
||||
var b3 = chars.charCodeAt(i + 2) & 0xFF;
|
||||
var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
|
||||
var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
|
||||
var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
|
||||
buffer += (digits.charAt(d1) + digits.charAt(d2) +
|
||||
digits.charAt(d3) + digits.charAt(d4));
|
||||
}
|
||||
return buffer;
|
||||
};
|
||||
})();
|
||||
|
||||
// window.atob (base64 encode function)?
|
||||
// Support: IE<10
|
||||
(function checkWindowAtobCompatibility() {
|
||||
if ('atob' in window) {
|
||||
return;
|
||||
}
|
||||
|
||||
// https://github.com/davidchambers/Base64.js
|
||||
var digits =
|
||||
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||
window.atob = function (input) {
|
||||
input = input.replace(/=+$/, '');
|
||||
if (input.length % 4 === 1) {
|
||||
throw new Error('bad atob input');
|
||||
}
|
||||
for (
|
||||
// initialize result and counters
|
||||
var bc = 0, bs, buffer, idx = 0, output = '';
|
||||
// get next character
|
||||
(buffer = input.charAt(idx++));
|
||||
// character found in table?
|
||||
// initialize bit storage and add its ascii value
|
||||
~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
|
||||
// and if not first of each 4 characters,
|
||||
// convert the first 8 bits to one ascii character
|
||||
bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
|
||||
) {
|
||||
// try to find character in table (0-63, not found => -1)
|
||||
buffer = digits.indexOf(buffer);
|
||||
}
|
||||
return output;
|
||||
};
|
||||
})();
|
||||
|
||||
// Function.prototype.bind?
|
||||
// Support: Android<4.0, iOS<6.0
|
||||
(function checkFunctionPrototypeBindCompatibility() {
|
||||
if (typeof Function.prototype.bind !== 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
Function.prototype.bind = function functionPrototypeBind(obj) {
|
||||
var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);
|
||||
var bound = function functionPrototypeBindBound() {
|
||||
var args = headArgs.concat(Array.prototype.slice.call(arguments));
|
||||
return fn.apply(obj, args);
|
||||
};
|
||||
return bound;
|
||||
};
|
||||
})();
|
||||
|
||||
// HTMLElement dataset property
|
||||
// Support: IE<11, Safari<5.1, Android<4.0
|
||||
(function checkDatasetProperty() {
|
||||
var div = document.createElement('div');
|
||||
if ('dataset' in div) {
|
||||
return; // dataset property exists
|
||||
}
|
||||
|
||||
Object.defineProperty(HTMLElement.prototype, 'dataset', {
|
||||
get: function() {
|
||||
if (this._dataset) {
|
||||
return this._dataset;
|
||||
}
|
||||
|
||||
var dataset = {};
|
||||
for (var j = 0, jj = this.attributes.length; j < jj; j++) {
|
||||
var attribute = this.attributes[j];
|
||||
if (attribute.name.substring(0, 5) !== 'data-') {
|
||||
continue;
|
||||
}
|
||||
var key = attribute.name.substring(5).replace(/\-([a-z])/g,
|
||||
function(all, ch) {
|
||||
return ch.toUpperCase();
|
||||
});
|
||||
dataset[key] = attribute.value;
|
||||
}
|
||||
|
||||
Object.defineProperty(this, '_dataset', {
|
||||
value: dataset,
|
||||
writable: false,
|
||||
enumerable: false
|
||||
});
|
||||
return dataset;
|
||||
},
|
||||
enumerable: true
|
||||
});
|
||||
})();
|
||||
|
||||
// HTMLElement classList property
|
||||
// Support: IE<10, Android<4.0, iOS<5.0
|
||||
(function checkClassListProperty() {
|
||||
var div = document.createElement('div');
|
||||
if ('classList' in div) {
|
||||
return; // classList property exists
|
||||
}
|
||||
|
||||
function changeList(element, itemName, add, remove) {
|
||||
var s = element.className || '';
|
||||
var list = s.split(/\s+/g);
|
||||
if (list[0] === '') {
|
||||
list.shift();
|
||||
}
|
||||
var index = list.indexOf(itemName);
|
||||
if (index < 0 && add) {
|
||||
list.push(itemName);
|
||||
}
|
||||
if (index >= 0 && remove) {
|
||||
list.splice(index, 1);
|
||||
}
|
||||
element.className = list.join(' ');
|
||||
return (index >= 0);
|
||||
}
|
||||
|
||||
var classListPrototype = {
|
||||
add: function(name) {
|
||||
changeList(this.element, name, true, false);
|
||||
},
|
||||
contains: function(name) {
|
||||
return changeList(this.element, name, false, false);
|
||||
},
|
||||
remove: function(name) {
|
||||
changeList(this.element, name, false, true);
|
||||
},
|
||||
toggle: function(name) {
|
||||
changeList(this.element, name, true, true);
|
||||
}
|
||||
};
|
||||
|
||||
Object.defineProperty(HTMLElement.prototype, 'classList', {
|
||||
get: function() {
|
||||
if (this._classList) {
|
||||
return this._classList;
|
||||
}
|
||||
|
||||
var classList = Object.create(classListPrototype, {
|
||||
element: {
|
||||
value: this,
|
||||
writable: false,
|
||||
enumerable: true
|
||||
}
|
||||
});
|
||||
Object.defineProperty(this, '_classList', {
|
||||
value: classList,
|
||||
writable: false,
|
||||
enumerable: false
|
||||
});
|
||||
return classList;
|
||||
},
|
||||
enumerable: true
|
||||
});
|
||||
})();
|
||||
|
||||
// Check console compatibility
|
||||
// In older IE versions the console object is not available
|
||||
// unless console is open.
|
||||
// Support: IE<10
|
||||
(function checkConsoleCompatibility() {
|
||||
if (!('console' in window)) {
|
||||
window.console = {
|
||||
log: function() {},
|
||||
error: function() {},
|
||||
warn: function() {}
|
||||
};
|
||||
} else if (!('bind' in console.log)) {
|
||||
// native functions in IE9 might not have bind
|
||||
console.log = (function(fn) {
|
||||
return function(msg) { return fn(msg); };
|
||||
})(console.log);
|
||||
console.error = (function(fn) {
|
||||
return function(msg) { return fn(msg); };
|
||||
})(console.error);
|
||||
console.warn = (function(fn) {
|
||||
return function(msg) { return fn(msg); };
|
||||
})(console.warn);
|
||||
}
|
||||
})();
|
||||
|
||||
// Check onclick compatibility in Opera
|
||||
// Support: Opera<15
|
||||
(function checkOnClickCompatibility() {
|
||||
// workaround for reported Opera bug DSK-354448:
|
||||
// onclick fires on disabled buttons with opaque content
|
||||
function ignoreIfTargetDisabled(event) {
|
||||
if (isDisabled(event.target)) {
|
||||
event.stopPropagation();
|
||||
}
|
||||
}
|
||||
function isDisabled(node) {
|
||||
return node.disabled || (node.parentNode && isDisabled(node.parentNode));
|
||||
}
|
||||
if (isOpera) {
|
||||
// use browser detection since we cannot feature-check this bug
|
||||
document.addEventListener('click', ignoreIfTargetDisabled, true);
|
||||
}
|
||||
})();
|
||||
|
||||
// Checks if possible to use URL.createObjectURL()
|
||||
// Support: IE
|
||||
(function checkOnBlobSupport() {
|
||||
// sometimes IE loosing the data created with createObjectURL(), see #3977
|
||||
if (isIE) {
|
||||
PDFJS.disableCreateObjectURL = true;
|
||||
}
|
||||
})();
|
||||
|
||||
// Checks if navigator.language is supported
|
||||
(function checkNavigatorLanguage() {
|
||||
if ('language' in navigator) {
|
||||
return;
|
||||
}
|
||||
PDFJS.locale = navigator.userLanguage || 'en-US';
|
||||
})();
|
||||
|
||||
// Support: Safari 6.0+, Android<3.0, Chrome 39/40, iOS
|
||||
(function checkRangeRequests() {
|
||||
// Safari has issues with cached range requests see:
|
||||
// https://github.com/mozilla/pdf.js/issues/3260
|
||||
// Last tested with version 6.0.4.
|
||||
|
||||
// Older versions of Android (pre 3.0) has issues with range requests, see:
|
||||
// https://github.com/mozilla/pdf.js/issues/3381.
|
||||
// Make sure that we only match webkit-based Android browsers,
|
||||
// since Firefox/Fennec works as expected.
|
||||
|
||||
// Range requests are broken in Chrome 39 and 40, https://crbug.com/442318
|
||||
if (isSafari || isAndroidPre3 || isChromeWithRangeBug || isIOS) {
|
||||
PDFJS.disableRange = true;
|
||||
PDFJS.disableStream = true;
|
||||
}
|
||||
})();
|
||||
|
||||
// Check if the browser supports manipulation of the history.
|
||||
// Support: IE<10, Android<4.2
|
||||
(function checkHistoryManipulation() {
|
||||
// Android 2.x has so buggy pushState support that it was removed in
|
||||
// Android 3.0 and restored as late as in Android 4.2.
|
||||
// Support: Android 2.x
|
||||
if (!history.pushState || isAndroidPre3) {
|
||||
PDFJS.disableHistory = true;
|
||||
}
|
||||
})();
|
||||
|
||||
// Support: IE<11, Chrome<21, Android<4.4, Safari<6
|
||||
(function checkSetPresenceInImageData() {
|
||||
// IE < 11 will use window.CanvasPixelArray which lacks set function.
|
||||
if (window.CanvasPixelArray) {
|
||||
if (typeof window.CanvasPixelArray.prototype.set !== 'function') {
|
||||
window.CanvasPixelArray.prototype.set = function(arr) {
|
||||
for (var i = 0, ii = this.length; i < ii; i++) {
|
||||
this[i] = arr[i];
|
||||
}
|
||||
};
|
||||
}
|
||||
} else {
|
||||
// Old Chrome and Android use an inaccessible CanvasPixelArray prototype.
|
||||
// Because we cannot feature detect it, we rely on user agent parsing.
|
||||
var polyfill = false, versionMatch;
|
||||
if (isChrome) {
|
||||
versionMatch = userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
|
||||
// Chrome < 21 lacks the set function.
|
||||
polyfill = versionMatch && parseInt(versionMatch[2]) < 21;
|
||||
} else if (isAndroid) {
|
||||
// Android < 4.4 lacks the set function.
|
||||
// Android >= 4.4 will contain Chrome in the user agent,
|
||||
// thus pass the Chrome check above and not reach this block.
|
||||
polyfill = isAndroidPre5;
|
||||
} else if (isSafari) {
|
||||
versionMatch = userAgent.
|
||||
match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//);
|
||||
// Safari < 6 lacks the set function.
|
||||
polyfill = versionMatch && parseInt(versionMatch[1]) < 6;
|
||||
}
|
||||
|
||||
if (polyfill) {
|
||||
var contextPrototype = window.CanvasRenderingContext2D.prototype;
|
||||
var createImageData = contextPrototype.createImageData;
|
||||
contextPrototype.createImageData = function(w, h) {
|
||||
var imageData = createImageData.call(this, w, h);
|
||||
imageData.data.set = function(arr) {
|
||||
for (var i = 0, ii = this.length; i < ii; i++) {
|
||||
this[i] = arr[i];
|
||||
}
|
||||
};
|
||||
return imageData;
|
||||
};
|
||||
// this closure will be kept referenced, so clear its vars
|
||||
contextPrototype = null;
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
// Support: IE<10, Android<4.0, iOS
|
||||
(function checkRequestAnimationFrame() {
|
||||
function fakeRequestAnimationFrame(callback) {
|
||||
window.setTimeout(callback, 20);
|
||||
}
|
||||
|
||||
if (isIOS) {
|
||||
// requestAnimationFrame on iOS is broken, replacing with fake one.
|
||||
window.requestAnimationFrame = fakeRequestAnimationFrame;
|
||||
return;
|
||||
}
|
||||
if ('requestAnimationFrame' in window) {
|
||||
return;
|
||||
}
|
||||
window.requestAnimationFrame =
|
||||
window.mozRequestAnimationFrame ||
|
||||
window.webkitRequestAnimationFrame ||
|
||||
fakeRequestAnimationFrame;
|
||||
})();
|
||||
|
||||
// Support: Android, iOS
|
||||
(function checkCanvasSizeLimitation() {
|
||||
if (isIOS || isAndroid) {
|
||||
// 5MP
|
||||
PDFJS.maxCanvasPixels = 5242880;
|
||||
}
|
||||
})();
|
||||
|
||||
// Disable fullscreen support for certain problematic configurations.
|
||||
// Support: IE11+ (when embedded).
|
||||
(function checkFullscreenSupport() {
|
||||
if (isIE && window.parent !== window) {
|
||||
PDFJS.disableFullscreen = true;
|
||||
}
|
||||
})();
|
||||
|
||||
// Provides document.currentScript support
|
||||
// Support: IE, Chrome<29.
|
||||
(function checkCurrentScript() {
|
||||
if ('currentScript' in document) {
|
||||
return;
|
||||
}
|
||||
Object.defineProperty(document, 'currentScript', {
|
||||
get: function () {
|
||||
var scripts = document.getElementsByTagName('script');
|
||||
return scripts[scripts.length - 1];
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
})();
|
||||
|
||||
// Provides `input.type = 'type'` runtime failure protection.
|
||||
// Support: IE9,10.
|
||||
(function checkInputTypeNumberAssign() {
|
||||
var el = document.createElement('input');
|
||||
try {
|
||||
el.type = 'number';
|
||||
} catch (ex) {
|
||||
var inputProto = el.constructor.prototype;
|
||||
var typeProperty = Object.getOwnPropertyDescriptor(inputProto, 'type');
|
||||
Object.defineProperty(inputProto, 'type', {
|
||||
get: function () { return typeProperty.get.call(this); },
|
||||
set: function (value) {
|
||||
typeProperty.set.call(this, value === 'number' ? 'text' : value);
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
// Provides correct document.readyState value for legacy browsers.
|
||||
// Support: IE9,10.
|
||||
(function checkDocumentReadyState() {
|
||||
if (!document.attachEvent) {
|
||||
return;
|
||||
}
|
||||
var documentProto = document.constructor.prototype;
|
||||
var readyStateProto = Object.getOwnPropertyDescriptor(documentProto,
|
||||
'readyState');
|
||||
Object.defineProperty(documentProto, 'readyState', {
|
||||
get: function () {
|
||||
var value = readyStateProto.get.call(this);
|
||||
return value === 'interactive' ? 'loading' : value;
|
||||
},
|
||||
set: function (value) { readyStateProto.set.call(this, value); },
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
})();
|
||||
|
||||
}).call((typeof window === 'undefined') ? this : window);
|
||||
Vendored
+3
-6
File diff suppressed because one or more lines are too long
Vendored
-147
@@ -1,147 +0,0 @@
|
||||
/*!
|
||||
* context.js Library associated with > v0.9.6.2 of intention.js
|
||||
* http://intentionjs.com/
|
||||
*
|
||||
* Copyright 2011, 2013 Dowjones and other contributors
|
||||
* Released under the MIT license
|
||||
*
|
||||
*/
|
||||
|
||||
(function () {
|
||||
|
||||
'use strict';
|
||||
var context = function($, Intention){
|
||||
|
||||
// create a brand spankin new intention object
|
||||
var intent=new Intention(),
|
||||
// placeholder for the horizontal axis
|
||||
horizontal_axis,
|
||||
orientation_axis;
|
||||
|
||||
// throttle funtion used for keeping calls to the resize responive
|
||||
// callback to a minimum
|
||||
function throttle(callback, interval){
|
||||
var lastExec = new Date(),
|
||||
timer = null;
|
||||
|
||||
return function(e){
|
||||
var d = new Date();
|
||||
if (d-lastExec < interval) {
|
||||
if (timer) {
|
||||
window.clearTimeout(timer);
|
||||
}
|
||||
var callbackWrapper = function(event){
|
||||
return function(){
|
||||
callback(event);
|
||||
};
|
||||
};
|
||||
timer = window.setTimeout(callbackWrapper(e), interval);
|
||||
return false;
|
||||
}
|
||||
callback(e);
|
||||
lastExec = d;
|
||||
};
|
||||
}
|
||||
|
||||
// catchall
|
||||
// =======================================================================
|
||||
intent.responsive([{name:'base'}]).respond('base');
|
||||
|
||||
// width context?
|
||||
// =======================================================================
|
||||
horizontal_axis = intent.responsive({
|
||||
ID:'width',
|
||||
contexts: [
|
||||
{name:'standard', min:840},
|
||||
{name:'tablet', min:510},
|
||||
{name:'mobile', min:0}],
|
||||
// compare the return value of the callback to each context
|
||||
// return true for a match
|
||||
matcher: function(test, context){
|
||||
if(typeof test === 'string'){
|
||||
|
||||
return test === context.name;
|
||||
}
|
||||
return test>=context.min;
|
||||
},
|
||||
// callback, return value is passed to matcher()
|
||||
// to compare against current context
|
||||
measure: function(arg){
|
||||
|
||||
if(typeof arg === 'string'){
|
||||
return arg;
|
||||
}
|
||||
|
||||
return $(window).width();
|
||||
}});
|
||||
|
||||
// orientation context?
|
||||
// =======================================================================
|
||||
orientation_axis = intent.responsive({
|
||||
ID:'orientation',
|
||||
contexts: [{name:'portrait', rotation: 0},
|
||||
{name:'landscape', rotation:90}],
|
||||
matcher: function(measure, ctx){
|
||||
return measure === ctx.rotation;
|
||||
},
|
||||
measure: function(){
|
||||
var test = Math.abs(window.orientation);
|
||||
if(test > 0) {
|
||||
test = 180 - test;
|
||||
}
|
||||
return test;
|
||||
}
|
||||
});
|
||||
|
||||
// ONE TIME CHECK AXES:
|
||||
// touch device?
|
||||
// =======================================================================
|
||||
intent.responsive({
|
||||
ID:'touch',
|
||||
contexts:[{name:'touch'}],
|
||||
matcher: function() {
|
||||
return "ontouchstart" in window;
|
||||
}}).respond();
|
||||
|
||||
// retina display?
|
||||
// =======================================================================
|
||||
intent.responsive({
|
||||
ID: 'highres',
|
||||
// contexts
|
||||
contexts:[{name:'highres'}],
|
||||
// matching:
|
||||
matcher: function(){
|
||||
return window.devicePixelRatio > 1;
|
||||
}}).respond();
|
||||
|
||||
// bind events to the window
|
||||
$(window).on('resize', throttle(horizontal_axis.respond, 100))
|
||||
.on('orientationchange', horizontal_axis.respond)
|
||||
.on('orientationchange', orientation_axis.respond);
|
||||
|
||||
// register the current width and orientation without waiting for a window
|
||||
// resize
|
||||
horizontal_axis.respond();
|
||||
orientation_axis.respond();
|
||||
|
||||
$(function(){
|
||||
// at doc ready grab all of the elements in the doc
|
||||
intent.elements(document);
|
||||
});
|
||||
|
||||
// return the intention object so that it can be extended by other plugins
|
||||
return intent;
|
||||
};
|
||||
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define('context', ['jquery', 'intention'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
root.intent = factory(root.jQuery, root.Intention);
|
||||
}
|
||||
}(this, function ($, Intention) {
|
||||
return context($, Intention);
|
||||
}));
|
||||
}).call(this);
|
||||
Vendored
+163
-155
@@ -14,37 +14,41 @@
|
||||
*/
|
||||
/* eslint-disable no-var */
|
||||
|
||||
'use strict';
|
||||
"use strict";
|
||||
|
||||
var FontInspector = (function FontInspectorClosure() {
|
||||
var fonts, createObjectURL;
|
||||
var fonts;
|
||||
var active = false;
|
||||
var fontAttribute = 'data-font-name';
|
||||
var fontAttribute = "data-font-name";
|
||||
function removeSelection() {
|
||||
let divs = document.querySelectorAll(`span[${fontAttribute}]`);
|
||||
for (let div of divs) {
|
||||
div.className = '';
|
||||
const divs = document.querySelectorAll(`span[${fontAttribute}]`);
|
||||
for (const div of divs) {
|
||||
div.className = "";
|
||||
}
|
||||
}
|
||||
function resetSelection() {
|
||||
let divs = document.querySelectorAll(`span[${fontAttribute}]`);
|
||||
for (let div of divs) {
|
||||
div.className = 'debuggerHideText';
|
||||
const divs = document.querySelectorAll(`span[${fontAttribute}]`);
|
||||
for (const div of divs) {
|
||||
div.className = "debuggerHideText";
|
||||
}
|
||||
}
|
||||
function selectFont(fontName, show) {
|
||||
let divs = document.querySelectorAll(`span[${fontAttribute}=${fontName}]`);
|
||||
for (let div of divs) {
|
||||
div.className = show ? 'debuggerShowText' : 'debuggerHideText';
|
||||
const divs = document.querySelectorAll(
|
||||
`span[${fontAttribute}=${fontName}]`
|
||||
);
|
||||
for (const div of divs) {
|
||||
div.className = show ? "debuggerShowText" : "debuggerHideText";
|
||||
}
|
||||
}
|
||||
function textLayerClick(e) {
|
||||
if (!e.target.dataset.fontName ||
|
||||
e.target.tagName.toUpperCase() !== 'SPAN') {
|
||||
if (
|
||||
!e.target.dataset.fontName ||
|
||||
e.target.tagName.toUpperCase() !== "SPAN"
|
||||
) {
|
||||
return;
|
||||
}
|
||||
var fontName = e.target.dataset.fontName;
|
||||
var selects = document.getElementsByTagName('input');
|
||||
var selects = document.getElementsByTagName("input");
|
||||
for (var i = 0; i < selects.length; ++i) {
|
||||
var select = selects[i];
|
||||
if (select.dataset.fontName !== fontName) {
|
||||
@@ -57,25 +61,22 @@ var FontInspector = (function FontInspectorClosure() {
|
||||
}
|
||||
return {
|
||||
// Properties/functions needed by PDFBug.
|
||||
id: 'FontInspector',
|
||||
name: 'Font Inspector',
|
||||
id: "FontInspector",
|
||||
name: "Font Inspector",
|
||||
panel: null,
|
||||
manager: null,
|
||||
init: function init(pdfjsLib) {
|
||||
var panel = this.panel;
|
||||
panel.setAttribute('style', 'padding: 5px;');
|
||||
var tmp = document.createElement('button');
|
||||
tmp.addEventListener('click', resetSelection);
|
||||
tmp.textContent = 'Refresh';
|
||||
var tmp = document.createElement("button");
|
||||
tmp.addEventListener("click", resetSelection);
|
||||
tmp.textContent = "Refresh";
|
||||
panel.appendChild(tmp);
|
||||
|
||||
fonts = document.createElement('div');
|
||||
fonts = document.createElement("div");
|
||||
panel.appendChild(fonts);
|
||||
|
||||
createObjectURL = pdfjsLib.createObjectURL;
|
||||
},
|
||||
cleanup: function cleanup() {
|
||||
fonts.textContent = '';
|
||||
fonts.textContent = "";
|
||||
},
|
||||
enabled: false,
|
||||
get active() {
|
||||
@@ -84,62 +85,62 @@ var FontInspector = (function FontInspectorClosure() {
|
||||
set active(value) {
|
||||
active = value;
|
||||
if (active) {
|
||||
document.body.addEventListener('click', textLayerClick, true);
|
||||
document.body.addEventListener("click", textLayerClick, true);
|
||||
resetSelection();
|
||||
} else {
|
||||
document.body.removeEventListener('click', textLayerClick, true);
|
||||
document.body.removeEventListener("click", textLayerClick, true);
|
||||
removeSelection();
|
||||
}
|
||||
},
|
||||
// FontInspector specific functions.
|
||||
fontAdded: function fontAdded(fontObj, url) {
|
||||
function properties(obj, list) {
|
||||
var moreInfo = document.createElement('table');
|
||||
var moreInfo = document.createElement("table");
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var tr = document.createElement('tr');
|
||||
var td1 = document.createElement('td');
|
||||
var tr = document.createElement("tr");
|
||||
var td1 = document.createElement("td");
|
||||
td1.textContent = list[i];
|
||||
tr.appendChild(td1);
|
||||
var td2 = document.createElement('td');
|
||||
var td2 = document.createElement("td");
|
||||
td2.textContent = obj[list[i]].toString();
|
||||
tr.appendChild(td2);
|
||||
moreInfo.appendChild(tr);
|
||||
}
|
||||
return moreInfo;
|
||||
}
|
||||
var moreInfo = properties(fontObj, ['name', 'type']);
|
||||
var fontName = fontObj.loadedName;
|
||||
var font = document.createElement('div');
|
||||
var name = document.createElement('span');
|
||||
var moreInfo = properties(fontObj, ["name", "type"]);
|
||||
const fontName = fontObj.loadedName;
|
||||
var font = document.createElement("div");
|
||||
var name = document.createElement("span");
|
||||
name.textContent = fontName;
|
||||
var download = document.createElement('a');
|
||||
var download = document.createElement("a");
|
||||
if (url) {
|
||||
url = /url\(['"]?([^\)"']+)/.exec(url);
|
||||
url = /url\(['"]?([^)"']+)/.exec(url);
|
||||
download.href = url[1];
|
||||
} else if (fontObj.data) {
|
||||
download.href = createObjectURL(fontObj.data, fontObj.mimeType);
|
||||
download.href = URL.createObjectURL(
|
||||
new Blob([fontObj.data], { type: fontObj.mimeType })
|
||||
);
|
||||
}
|
||||
download.textContent = 'Download';
|
||||
var logIt = document.createElement('a');
|
||||
logIt.href = '';
|
||||
logIt.textContent = 'Log';
|
||||
logIt.addEventListener('click', function(event) {
|
||||
download.textContent = "Download";
|
||||
var logIt = document.createElement("a");
|
||||
logIt.href = "";
|
||||
logIt.textContent = "Log";
|
||||
logIt.addEventListener("click", function (event) {
|
||||
event.preventDefault();
|
||||
console.log(fontObj);
|
||||
});
|
||||
var select = document.createElement('input');
|
||||
select.setAttribute('type', 'checkbox');
|
||||
const select = document.createElement("input");
|
||||
select.setAttribute("type", "checkbox");
|
||||
select.dataset.fontName = fontName;
|
||||
select.addEventListener('click', (function(select, fontName) {
|
||||
return (function() {
|
||||
selectFont(fontName, select.checked);
|
||||
});
|
||||
})(select, fontName));
|
||||
select.addEventListener("click", function () {
|
||||
selectFont(fontName, select.checked);
|
||||
});
|
||||
font.appendChild(select);
|
||||
font.appendChild(name);
|
||||
font.appendChild(document.createTextNode(' '));
|
||||
font.appendChild(document.createTextNode(" "));
|
||||
font.appendChild(download);
|
||||
font.appendChild(document.createTextNode(' '));
|
||||
font.appendChild(document.createTextNode(" "));
|
||||
font.appendChild(logIt);
|
||||
font.appendChild(moreInfo);
|
||||
fonts.appendChild(font);
|
||||
@@ -165,24 +166,23 @@ var StepperManager = (function StepperManagerClosure() {
|
||||
var breakPoints = Object.create(null);
|
||||
return {
|
||||
// Properties/functions needed by PDFBug.
|
||||
id: 'Stepper',
|
||||
name: 'Stepper',
|
||||
id: "Stepper",
|
||||
name: "Stepper",
|
||||
panel: null,
|
||||
manager: null,
|
||||
init: function init(pdfjsLib) {
|
||||
var self = this;
|
||||
this.panel.setAttribute('style', 'padding: 5px;');
|
||||
stepperControls = document.createElement('div');
|
||||
stepperChooser = document.createElement('select');
|
||||
stepperChooser.addEventListener('change', function(event) {
|
||||
stepperControls = document.createElement("div");
|
||||
stepperChooser = document.createElement("select");
|
||||
stepperChooser.addEventListener("change", function (event) {
|
||||
self.selectStepper(this.value);
|
||||
});
|
||||
stepperControls.appendChild(stepperChooser);
|
||||
stepperDiv = document.createElement('div');
|
||||
stepperDiv = document.createElement("div");
|
||||
this.panel.appendChild(stepperControls);
|
||||
this.panel.appendChild(stepperDiv);
|
||||
if (sessionStorage.getItem('pdfjsBreakPoints')) {
|
||||
breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
|
||||
if (sessionStorage.getItem("pdfjsBreakPoints")) {
|
||||
breakPoints = JSON.parse(sessionStorage.getItem("pdfjsBreakPoints"));
|
||||
}
|
||||
|
||||
opMap = Object.create(null);
|
||||
@@ -191,21 +191,21 @@ var StepperManager = (function StepperManagerClosure() {
|
||||
}
|
||||
},
|
||||
cleanup: function cleanup() {
|
||||
stepperChooser.textContent = '';
|
||||
stepperDiv.textContent = '';
|
||||
stepperChooser.textContent = "";
|
||||
stepperDiv.textContent = "";
|
||||
steppers = [];
|
||||
},
|
||||
enabled: false,
|
||||
active: false,
|
||||
// Stepper specific functions.
|
||||
create: function create(pageIndex) {
|
||||
var debug = document.createElement('div');
|
||||
debug.id = 'stepper' + pageIndex;
|
||||
debug.setAttribute('hidden', true);
|
||||
debug.className = 'stepper';
|
||||
var debug = document.createElement("div");
|
||||
debug.id = "stepper" + pageIndex;
|
||||
debug.setAttribute("hidden", true);
|
||||
debug.className = "stepper";
|
||||
stepperDiv.appendChild(debug);
|
||||
var b = document.createElement('option');
|
||||
b.textContent = 'Page ' + (pageIndex + 1);
|
||||
var b = document.createElement("option");
|
||||
b.textContent = "Page " + (pageIndex + 1);
|
||||
b.value = pageIndex;
|
||||
stepperChooser.appendChild(b);
|
||||
var initBreakPoints = breakPoints[pageIndex] || [];
|
||||
@@ -225,9 +225,9 @@ var StepperManager = (function StepperManagerClosure() {
|
||||
for (i = 0; i < steppers.length; ++i) {
|
||||
var stepper = steppers[i];
|
||||
if (stepper.pageIndex === pageIndex) {
|
||||
stepper.panel.removeAttribute('hidden');
|
||||
stepper.panel.removeAttribute("hidden");
|
||||
} else {
|
||||
stepper.panel.setAttribute('hidden', true);
|
||||
stepper.panel.setAttribute("hidden", true);
|
||||
}
|
||||
}
|
||||
var options = stepperChooser.options;
|
||||
@@ -238,7 +238,7 @@ var StepperManager = (function StepperManagerClosure() {
|
||||
},
|
||||
saveBreakPoints: function saveBreakPoints(pageIndex, bps) {
|
||||
breakPoints[pageIndex] = bps;
|
||||
sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));
|
||||
sessionStorage.setItem("pdfjsBreakPoints", JSON.stringify(breakPoints));
|
||||
},
|
||||
};
|
||||
})();
|
||||
@@ -255,22 +255,26 @@ var Stepper = (function StepperClosure() {
|
||||
}
|
||||
|
||||
function simplifyArgs(args) {
|
||||
if (typeof args === 'string') {
|
||||
if (typeof args === "string") {
|
||||
var MAX_STRING_LENGTH = 75;
|
||||
return args.length <= MAX_STRING_LENGTH ? args :
|
||||
args.substring(0, MAX_STRING_LENGTH) + '...';
|
||||
return args.length <= MAX_STRING_LENGTH
|
||||
? args
|
||||
: args.substring(0, MAX_STRING_LENGTH) + "...";
|
||||
}
|
||||
if (typeof args !== 'object' || args === null) {
|
||||
if (typeof args !== "object" || args === null) {
|
||||
return args;
|
||||
}
|
||||
if ('length' in args) { // array
|
||||
var simpleArgs = [], i, ii;
|
||||
if ("length" in args) {
|
||||
// array
|
||||
var simpleArgs = [],
|
||||
i,
|
||||
ii;
|
||||
var MAX_ITEMS = 10;
|
||||
for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
|
||||
simpleArgs.push(simplifyArgs(args[i]));
|
||||
}
|
||||
if (i < args.length) {
|
||||
simpleArgs.push('...');
|
||||
simpleArgs.push("...");
|
||||
}
|
||||
return simpleArgs;
|
||||
}
|
||||
@@ -281,6 +285,7 @@ var Stepper = (function StepperClosure() {
|
||||
return simpleObj;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-shadow
|
||||
function Stepper(panel, pageIndex, initialBreakPoints) {
|
||||
this.panel = panel;
|
||||
this.breakPoint = 0;
|
||||
@@ -293,16 +298,16 @@ var Stepper = (function StepperClosure() {
|
||||
Stepper.prototype = {
|
||||
init: function init(operatorList) {
|
||||
var panel = this.panel;
|
||||
var content = c('div', 'c=continue, s=step');
|
||||
var table = c('table');
|
||||
var content = c("div", "c=continue, s=step");
|
||||
var table = c("table");
|
||||
content.appendChild(table);
|
||||
table.cellSpacing = 0;
|
||||
var headerRow = c('tr');
|
||||
var headerRow = c("tr");
|
||||
table.appendChild(headerRow);
|
||||
headerRow.appendChild(c('th', 'Break'));
|
||||
headerRow.appendChild(c('th', 'Idx'));
|
||||
headerRow.appendChild(c('th', 'fn'));
|
||||
headerRow.appendChild(c('th', 'args'));
|
||||
headerRow.appendChild(c("th", "Break"));
|
||||
headerRow.appendChild(c("th", "Idx"));
|
||||
headerRow.appendChild(c("th", "fn"));
|
||||
headerRow.appendChild(c("th", "args"));
|
||||
panel.appendChild(content);
|
||||
this.table = table;
|
||||
this.updateOperatorList(operatorList);
|
||||
@@ -326,56 +331,57 @@ var Stepper = (function StepperClosure() {
|
||||
}
|
||||
|
||||
var chunk = document.createDocumentFragment();
|
||||
var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,
|
||||
operatorList.fnArray.length);
|
||||
var operatorsToDisplay = Math.min(
|
||||
MAX_OPERATORS_COUNT,
|
||||
operatorList.fnArray.length
|
||||
);
|
||||
for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {
|
||||
var line = c('tr');
|
||||
line.className = 'line';
|
||||
var line = c("tr");
|
||||
line.className = "line";
|
||||
line.dataset.idx = i;
|
||||
chunk.appendChild(line);
|
||||
var checked = this.breakPoints.includes(i);
|
||||
var args = operatorList.argsArray[i] || [];
|
||||
|
||||
var breakCell = c('td');
|
||||
var cbox = c('input');
|
||||
cbox.type = 'checkbox';
|
||||
cbox.className = 'points';
|
||||
var breakCell = c("td");
|
||||
var cbox = c("input");
|
||||
cbox.type = "checkbox";
|
||||
cbox.className = "points";
|
||||
cbox.checked = checked;
|
||||
cbox.dataset.idx = i;
|
||||
cbox.onclick = cboxOnClick;
|
||||
|
||||
breakCell.appendChild(cbox);
|
||||
line.appendChild(breakCell);
|
||||
line.appendChild(c('td', i.toString()));
|
||||
line.appendChild(c("td", i.toString()));
|
||||
var fn = opMap[operatorList.fnArray[i]];
|
||||
var decArgs = args;
|
||||
if (fn === 'showText') {
|
||||
if (fn === "showText") {
|
||||
var glyphs = args[0];
|
||||
var newArgs = [];
|
||||
var str = [];
|
||||
for (var j = 0; j < glyphs.length; j++) {
|
||||
var glyph = glyphs[j];
|
||||
if (typeof glyph === 'object' && glyph !== null) {
|
||||
if (typeof glyph === "object" && glyph !== null) {
|
||||
str.push(glyph.fontChar);
|
||||
} else {
|
||||
if (str.length > 0) {
|
||||
newArgs.push(str.join(''));
|
||||
newArgs.push(str.join(""));
|
||||
str = [];
|
||||
}
|
||||
newArgs.push(glyph); // null or number
|
||||
}
|
||||
}
|
||||
if (str.length > 0) {
|
||||
newArgs.push(str.join(''));
|
||||
newArgs.push(str.join(""));
|
||||
}
|
||||
decArgs = [newArgs];
|
||||
}
|
||||
line.appendChild(c('td', fn));
|
||||
line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));
|
||||
line.appendChild(c("td", fn));
|
||||
line.appendChild(c("td", JSON.stringify(simplifyArgs(decArgs))));
|
||||
}
|
||||
if (operatorsToDisplay < operatorList.fnArray.length) {
|
||||
line = c('tr');
|
||||
var lastCell = c('td', '...');
|
||||
var lastCell = c("td", "...");
|
||||
lastCell.colspan = 4;
|
||||
chunk.appendChild(lastCell);
|
||||
}
|
||||
@@ -383,7 +389,7 @@ var Stepper = (function StepperClosure() {
|
||||
this.table.appendChild(chunk);
|
||||
},
|
||||
getNextBreakPoint: function getNextBreakPoint() {
|
||||
this.breakPoints.sort(function(a, b) {
|
||||
this.breakPoints.sort(function (a, b) {
|
||||
return a - b;
|
||||
});
|
||||
for (var i = 0; i < this.breakPoints.length; i++) {
|
||||
@@ -398,16 +404,16 @@ var Stepper = (function StepperClosure() {
|
||||
var self = this;
|
||||
var dom = document;
|
||||
self.currentIdx = idx;
|
||||
var listener = function(e) {
|
||||
var listener = function (e) {
|
||||
switch (e.keyCode) {
|
||||
case 83: // step
|
||||
dom.removeEventListener('keydown', listener);
|
||||
dom.removeEventListener("keydown", listener);
|
||||
self.nextBreakPoint = self.currentIdx + 1;
|
||||
self.goTo(-1);
|
||||
callback();
|
||||
break;
|
||||
case 67: // continue
|
||||
dom.removeEventListener('keydown', listener);
|
||||
dom.removeEventListener("keydown", listener);
|
||||
var breakPoint = self.getNextBreakPoint();
|
||||
self.nextBreakPoint = breakPoint;
|
||||
self.goTo(-1);
|
||||
@@ -415,15 +421,15 @@ var Stepper = (function StepperClosure() {
|
||||
break;
|
||||
}
|
||||
};
|
||||
dom.addEventListener('keydown', listener);
|
||||
dom.addEventListener("keydown", listener);
|
||||
self.goTo(idx);
|
||||
},
|
||||
goTo: function goTo(idx) {
|
||||
var allRows = this.panel.getElementsByClassName('line');
|
||||
var allRows = this.panel.getElementsByClassName("line");
|
||||
for (var x = 0, xx = allRows.length; x < xx; ++x) {
|
||||
var row = allRows[x];
|
||||
if ((row.dataset.idx | 0) === idx) {
|
||||
row.style.backgroundColor = 'rgb(251,250,207)';
|
||||
row.style.backgroundColor = "rgb(251,250,207)";
|
||||
row.scrollIntoView();
|
||||
} else {
|
||||
row.style.backgroundColor = null;
|
||||
@@ -451,13 +457,11 @@ var Stats = (function Stats() {
|
||||
}
|
||||
return {
|
||||
// Properties/functions needed by PDFBug.
|
||||
id: 'Stats',
|
||||
name: 'Stats',
|
||||
id: "Stats",
|
||||
name: "Stats",
|
||||
panel: null,
|
||||
manager: null,
|
||||
init(pdfjsLib) {
|
||||
this.panel.setAttribute('style', 'padding: 5px;');
|
||||
},
|
||||
init(pdfjsLib) {},
|
||||
enabled: false,
|
||||
active: false,
|
||||
// Stats specific functions.
|
||||
@@ -467,21 +471,21 @@ var Stats = (function Stats() {
|
||||
}
|
||||
var statsIndex = getStatIndex(pageNumber);
|
||||
if (statsIndex !== false) {
|
||||
var b = stats[statsIndex];
|
||||
const b = stats[statsIndex];
|
||||
this.panel.removeChild(b.div);
|
||||
stats.splice(statsIndex, 1);
|
||||
}
|
||||
var wrapper = document.createElement('div');
|
||||
wrapper.className = 'stats';
|
||||
var title = document.createElement('div');
|
||||
title.className = 'title';
|
||||
title.textContent = 'Page: ' + pageNumber;
|
||||
var statsDiv = document.createElement('div');
|
||||
var wrapper = document.createElement("div");
|
||||
wrapper.className = "stats";
|
||||
var title = document.createElement("div");
|
||||
title.className = "title";
|
||||
title.textContent = "Page: " + pageNumber;
|
||||
var statsDiv = document.createElement("div");
|
||||
statsDiv.textContent = stat.toString();
|
||||
wrapper.appendChild(title);
|
||||
wrapper.appendChild(statsDiv);
|
||||
stats.push({ pageNumber, div: wrapper, });
|
||||
stats.sort(function(a, b) {
|
||||
stats.push({ pageNumber, div: wrapper });
|
||||
stats.sort(function (a, b) {
|
||||
return a.pageNumber - b.pageNumber;
|
||||
});
|
||||
clear(this.panel);
|
||||
@@ -503,14 +507,11 @@ window.PDFBug = (function PDFBugClosure() {
|
||||
var activePanel = null;
|
||||
|
||||
return {
|
||||
tools: [
|
||||
FontInspector,
|
||||
StepperManager,
|
||||
Stats
|
||||
],
|
||||
tools: [FontInspector, StepperManager, Stats],
|
||||
enable(ids) {
|
||||
var all = false, tools = this.tools;
|
||||
if (ids.length === 1 && ids[0] === 'all') {
|
||||
var all = false,
|
||||
tools = this.tools;
|
||||
if (ids.length === 1 && ids[0] === "all") {
|
||||
all = true;
|
||||
}
|
||||
for (var i = 0; i < tools.length; ++i) {
|
||||
@@ -521,7 +522,7 @@ window.PDFBug = (function PDFBugClosure() {
|
||||
}
|
||||
if (!all) {
|
||||
// Sort the tools by the order they are enabled.
|
||||
tools.sort(function(a, b) {
|
||||
tools.sort(function (a, b) {
|
||||
var indexA = ids.indexOf(a.id);
|
||||
indexA = indexA < 0 ? tools.length : indexA;
|
||||
var indexB = ids.indexOf(b.id);
|
||||
@@ -540,34 +541,37 @@ window.PDFBug = (function PDFBugClosure() {
|
||||
* Panel
|
||||
* ...
|
||||
*/
|
||||
var ui = document.createElement('div');
|
||||
ui.id = 'PDFBug';
|
||||
var ui = document.createElement("div");
|
||||
ui.id = "PDFBug";
|
||||
|
||||
var controls = document.createElement('div');
|
||||
controls.setAttribute('class', 'controls');
|
||||
var controls = document.createElement("div");
|
||||
controls.setAttribute("class", "controls");
|
||||
ui.appendChild(controls);
|
||||
|
||||
var panels = document.createElement('div');
|
||||
panels.setAttribute('class', 'panels');
|
||||
var panels = document.createElement("div");
|
||||
panels.setAttribute("class", "panels");
|
||||
ui.appendChild(panels);
|
||||
|
||||
container.appendChild(ui);
|
||||
container.style.right = panelWidth + 'px';
|
||||
container.style.right = panelWidth + "px";
|
||||
|
||||
// Initialize all the debugging tools.
|
||||
var tools = this.tools;
|
||||
var self = this;
|
||||
for (var i = 0; i < tools.length; ++i) {
|
||||
var tool = tools[i];
|
||||
var panel = document.createElement('div');
|
||||
var panelButton = document.createElement('button');
|
||||
var panel = document.createElement("div");
|
||||
var panelButton = document.createElement("button");
|
||||
panelButton.textContent = tool.name;
|
||||
panelButton.addEventListener('click', (function(selected) {
|
||||
return function(event) {
|
||||
event.preventDefault();
|
||||
self.selectPanel(selected);
|
||||
};
|
||||
})(i));
|
||||
panelButton.addEventListener(
|
||||
"click",
|
||||
(function (selected) {
|
||||
return function (event) {
|
||||
event.preventDefault();
|
||||
self.selectPanel(selected);
|
||||
};
|
||||
})(i)
|
||||
);
|
||||
controls.appendChild(panelButton);
|
||||
panels.appendChild(panel);
|
||||
tool.panel = panel;
|
||||
@@ -575,9 +579,13 @@ window.PDFBug = (function PDFBugClosure() {
|
||||
if (tool.enabled) {
|
||||
tool.init(pdfjsLib);
|
||||
} else {
|
||||
panel.textContent = tool.name + ' is disabled. To enable add ' +
|
||||
' "' + tool.id + '" to the pdfBug parameter ' +
|
||||
'and refresh (separate multiple by commas).';
|
||||
panel.textContent =
|
||||
tool.name +
|
||||
" is disabled. To enable add " +
|
||||
' "' +
|
||||
tool.id +
|
||||
'" to the pdfBug parameter ' +
|
||||
"and refresh (separate multiple by commas).";
|
||||
}
|
||||
buttons.push(panelButton);
|
||||
}
|
||||
@@ -591,7 +599,7 @@ window.PDFBug = (function PDFBugClosure() {
|
||||
}
|
||||
},
|
||||
selectPanel(index) {
|
||||
if (typeof index !== 'number') {
|
||||
if (typeof index !== "number") {
|
||||
index = this.tools.indexOf(index);
|
||||
}
|
||||
if (index === activePanel) {
|
||||
@@ -601,13 +609,13 @@ window.PDFBug = (function PDFBugClosure() {
|
||||
var tools = this.tools;
|
||||
for (var j = 0; j < tools.length; ++j) {
|
||||
if (j === index) {
|
||||
buttons[j].setAttribute('class', 'active');
|
||||
buttons[j].setAttribute("class", "active");
|
||||
tools[j].active = true;
|
||||
tools[j].panel.removeAttribute('hidden');
|
||||
tools[j].panel.removeAttribute("hidden");
|
||||
} else {
|
||||
buttons[j].setAttribute('class', '');
|
||||
buttons[j].setAttribute("class", "");
|
||||
tools[j].active = false;
|
||||
tools[j].panel.setAttribute('hidden', 'true');
|
||||
tools[j].panel.setAttribute("hidden", "true");
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
Vendored
-564
@@ -1,564 +0,0 @@
|
||||
/*!
|
||||
* intention.js Library v0.9.7.2
|
||||
* http://intentionjs.com/
|
||||
*
|
||||
* Copyright 2011, 2013 Dowjones and other contributors
|
||||
* Released under the MIT license
|
||||
*
|
||||
*/
|
||||
|
||||
(function(root, factory) {
|
||||
|
||||
'use strict';
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define('intention', ['jquery', 'underscore'], factory);
|
||||
} else {
|
||||
root.Intention = factory(root.jQuery, root._);
|
||||
}
|
||||
}(this, function($, _) {
|
||||
'use strict';
|
||||
|
||||
var Intention = function(params){
|
||||
var intent = _.extend(this, params,
|
||||
{_listeners:{}, contexts:[], elms:$(), axes:{}, priority:[]});
|
||||
|
||||
return intent;
|
||||
};
|
||||
|
||||
Intention.prototype = {
|
||||
|
||||
// public methods
|
||||
responsive:function responsive(contexts, options){
|
||||
// for generating random ids for axis when not specified
|
||||
var idChars = 'abcdefghijklmnopqrstuvwxyz0123456789',
|
||||
id='', i;
|
||||
|
||||
// create a random id for the axis
|
||||
for(i=0; i<5; i++){
|
||||
id += idChars[Math.floor(Math.random() * idChars.length)];
|
||||
}
|
||||
var defaults = {
|
||||
// if no matcher function is specified expect to compare a
|
||||
// string to the ctx.name property
|
||||
matcher: function(measure, ctx){
|
||||
return measure === ctx.name;
|
||||
},
|
||||
// function takes one arg and returns it
|
||||
measure: _.identity,
|
||||
ID: id
|
||||
};
|
||||
|
||||
if(_.isObject(options) === false) {
|
||||
options = {};
|
||||
}
|
||||
|
||||
if((_.isArray(contexts)) && (_.isArray(contexts[0].contexts))){
|
||||
_.each(contexts, function(axis){
|
||||
responsive.apply(this, axis);
|
||||
}, this);
|
||||
return;
|
||||
}
|
||||
|
||||
if((_.isArray(contexts) === false) && _.isObject(contexts)){
|
||||
options = contexts;
|
||||
} else {
|
||||
options.contexts = contexts;
|
||||
}
|
||||
|
||||
// fill in the options
|
||||
options = _.extend({}, defaults, options);
|
||||
|
||||
// bind an the respond function to the axis ID and prefix it
|
||||
// with an underscore so that it does not get whomped accidentally
|
||||
this.on('_' + options.ID + ':', _.bind(
|
||||
function(e){
|
||||
this.axes = this._contextualize(
|
||||
options.ID, e.context, this.axes);
|
||||
this._respond(this.axes, this.elms);
|
||||
|
||||
}, this));
|
||||
|
||||
var axis = {
|
||||
ID:options.ID,
|
||||
current:null,
|
||||
contexts:options.contexts,
|
||||
respond:_.bind(this._responder(options.ID, options.contexts,
|
||||
options.matcher, options.measure), this)
|
||||
};
|
||||
|
||||
this.axes[options.ID] = axis;
|
||||
|
||||
this.axes.__keys__ = this.priority;
|
||||
|
||||
this.priority.unshift(options.ID);
|
||||
|
||||
return axis;
|
||||
},
|
||||
|
||||
elements: function(scope){
|
||||
|
||||
// find all responsive elms in a specific dom scope
|
||||
if(!scope){
|
||||
scope = document;
|
||||
}
|
||||
|
||||
$('[data-intent],[intent],[data-in],[in]',
|
||||
scope).each(_.bind(function(i, elm){
|
||||
this.add($(elm));
|
||||
}, this));
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
add: function(elms, options){
|
||||
|
||||
var spec;
|
||||
|
||||
if(!options) {
|
||||
options = {};
|
||||
}
|
||||
|
||||
// is expecting a jquery object
|
||||
elms.each(_.bind(function(i, elm){
|
||||
var exists = false;
|
||||
this.elms.each(function(i, respElm){
|
||||
if(elm === respElm) {
|
||||
exists=true;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
if(exists === false){
|
||||
// create the elements responsive data
|
||||
spec = this._fillSpec(
|
||||
_.extend(options, this._attrsToSpec(elm.attributes, this.axes)));
|
||||
// make any appropriate changes based on the current contexts
|
||||
this._makeChanges($(elm), spec, this.axes);
|
||||
|
||||
this.elms.push({
|
||||
elm: elm,
|
||||
spec: spec
|
||||
});
|
||||
}
|
||||
|
||||
}, this));
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
remove: function(elms){
|
||||
// is expecting a jquery object
|
||||
var respElms = this.elms;
|
||||
// elms to remove
|
||||
elms.each(function(i, elm){
|
||||
// elms to check against
|
||||
respElms.each(function(i, candidate){
|
||||
if(elm === candidate.elm){
|
||||
respElms.splice(i, 1);
|
||||
// found the match, break the loop
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
});
|
||||
return this;
|
||||
},
|
||||
|
||||
is: function(ctxName){
|
||||
var axes = this.axes;
|
||||
return _.some(axes.__keys__, function(key){
|
||||
return ctxName === axes[key].current;
|
||||
});
|
||||
},
|
||||
|
||||
current: function(axisName){
|
||||
if(this.axes.hasOwnProperty(axisName)){
|
||||
return this.axes[axisName].current;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
// code and concept taken from simple implementation of
|
||||
// observer pattern outlined here:
|
||||
// http://www.nczonline.net/blog/2010/03/09/custom-events-in-javascript/
|
||||
on: function(type, listener){
|
||||
|
||||
var events = type.split(' '),
|
||||
i=0;
|
||||
|
||||
for(i;i<events.length;i++){
|
||||
if(this._listeners[events[i]] === undefined) {
|
||||
this._listeners[events[i]]=[];
|
||||
}
|
||||
this._listeners[events[i]].push(listener);
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
off: function(type, listener){
|
||||
if(_.isArray(this._listeners[type])){
|
||||
var listeners = this._listeners[type],
|
||||
i;
|
||||
for(i=0;listeners.length; i++){
|
||||
if(listeners[i] === listener){
|
||||
listeners.splice(i,1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
// privates
|
||||
_responder: function(axisID, contexts, matcher, measure){
|
||||
|
||||
var currentContext;
|
||||
|
||||
// called to perform a check
|
||||
return function(){
|
||||
|
||||
var measurement = measure.apply(this, arguments);
|
||||
|
||||
_.every(contexts, function(ctx){
|
||||
if( matcher(measurement, ctx)) {
|
||||
// first time, or different than last context
|
||||
if( (currentContext===undefined) ||
|
||||
(ctx.name !== currentContext.name)){
|
||||
|
||||
currentContext = ctx;
|
||||
|
||||
// event emitting!
|
||||
// emit the private axis event
|
||||
this._emitter(
|
||||
{_type: '_' + axisID + ':', context:currentContext.name},
|
||||
currentContext, this)
|
||||
|
||||
// emit the public axis event
|
||||
._emitter({_type: axisID + ':', context:currentContext.name},
|
||||
currentContext, this)
|
||||
|
||||
// attempt to trigger the axis to context pair
|
||||
._emitter(_.extend({},
|
||||
{_type: axisID + ':' + currentContext.name},
|
||||
currentContext), currentContext, this)
|
||||
|
||||
// then emit the context event (second ensures the context
|
||||
// changes happen after all dom manipulations)
|
||||
._emitter(_.extend({}, {_type:currentContext.name},
|
||||
currentContext), currentContext, this);
|
||||
|
||||
// done, break the loop
|
||||
return false;
|
||||
}
|
||||
// same context, break the loop
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}, this);
|
||||
|
||||
// return the intention object for chaining
|
||||
return this;
|
||||
};
|
||||
},
|
||||
|
||||
_emitter: function(event){
|
||||
if(typeof event === 'string') {
|
||||
event={_type:event};
|
||||
}
|
||||
if(!event.target){
|
||||
event.target=this;
|
||||
}
|
||||
if(!event._type){
|
||||
throw new Error(event._type + ' is not a supported event.');
|
||||
}
|
||||
if(_.isArray(this._listeners[event._type])){
|
||||
var listeners = this._listeners[event._type],
|
||||
i;
|
||||
for(i=0; i<listeners.length; i++){
|
||||
listeners[i].apply(this, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
_fillSpec: function(spec){
|
||||
|
||||
var applySpec = function(fn){
|
||||
_.each(spec, function(axisOptions, axis){
|
||||
_.each(axisOptions, function(ctxOptions, ctx){
|
||||
fn(ctxOptions, ctx, axis);
|
||||
});
|
||||
});
|
||||
}, filler={};
|
||||
|
||||
applySpec(function(options){
|
||||
// check to see if the ctx val is an object, could be a string
|
||||
if(_.isObject(options)){
|
||||
_.each(options, function(val, func){
|
||||
filler[func] = '';
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
applySpec(function(options, ctx, axis){
|
||||
if(_.isObject(options)){
|
||||
spec[axis][ctx] = _.extend({}, filler, options);
|
||||
}
|
||||
});
|
||||
|
||||
return spec;
|
||||
},
|
||||
|
||||
_assocAxis: function(ctx, axes){
|
||||
|
||||
var match=false;
|
||||
|
||||
_.every(axes.__keys__, function(axis){
|
||||
|
||||
if(match === false){
|
||||
_.every(axes[axis].contexts, function(ctxCandidate){
|
||||
if(ctxCandidate.name === ctx){
|
||||
match = axis;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
return true;
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
return match;
|
||||
},
|
||||
|
||||
_makeSpec: function(axis, ctx, sAttr, value, spec){
|
||||
var axisObj,
|
||||
ctxObj;
|
||||
|
||||
if(spec[axis] !== undefined){
|
||||
axisObj = spec[axis];
|
||||
|
||||
if(axisObj[ctx] === undefined) {
|
||||
axisObj[ctx] = {};
|
||||
}
|
||||
} else {
|
||||
axisObj = {};
|
||||
axisObj[ctx] = {};
|
||||
spec[axis] = axisObj;
|
||||
}
|
||||
axisObj[ctx][sAttr] = value;
|
||||
|
||||
return spec;
|
||||
},
|
||||
|
||||
_attrsToSpec: function(attrs, axes){
|
||||
|
||||
var spec={},
|
||||
fullPattern = new RegExp(
|
||||
'^(data-)?(in|intent)-(([a-zA-Z0-9][a-zA-Z0-9]*:)?([a-zA-Z0-9]*))-([A-Za-z:-]+)'),
|
||||
axisPattern = new RegExp(
|
||||
'^(data-)?(in|intent)-([a-zA-Z0-9][_a-zA-Z0-9]*):$');
|
||||
|
||||
_.each(attrs, function(attr){
|
||||
|
||||
var specMatch = attr.name.match(fullPattern),
|
||||
axisName;
|
||||
|
||||
if(specMatch !== null) {
|
||||
|
||||
specMatch = specMatch.slice(-3);
|
||||
axisName = specMatch[0];
|
||||
|
||||
if(specMatch[0] === undefined){
|
||||
|
||||
// if there is no axis find one:
|
||||
specMatch[0] = this._assocAxis(specMatch[1], axes);
|
||||
|
||||
if(specMatch[0] === false) {
|
||||
// there is no context, so get outa here
|
||||
return; // skipt the attr
|
||||
}
|
||||
} else {
|
||||
specMatch[0] = specMatch[0].replace(/:$/, '');}
|
||||
|
||||
specMatch.push(attr.value);
|
||||
specMatch.push(spec);
|
||||
|
||||
spec = this._makeSpec.apply(this, specMatch);
|
||||
|
||||
} else if(axisPattern.test(attr.name)){
|
||||
|
||||
axisName = attr.name.match(axisPattern)[3];
|
||||
|
||||
_.each(axes[axisName].contexts,
|
||||
function(context){
|
||||
this._makeSpec(axisName, context.name, 'class', context.name +
|
||||
' ' + attr.value, spec);
|
||||
},
|
||||
this);}},
|
||||
this);
|
||||
|
||||
return spec;
|
||||
},
|
||||
|
||||
_contextSpec: function(ctxObj, specs){
|
||||
if(specs.hasOwnProperty(ctxObj.axis) &&
|
||||
specs[ctxObj.axis].hasOwnProperty(ctxObj.ctx)){
|
||||
return specs[ctxObj.axis][ctxObj.ctx];
|
||||
}
|
||||
return {};
|
||||
},
|
||||
_resolveSpecs: function(currentContexts, specs){
|
||||
|
||||
var changes={},
|
||||
moveFuncs=['append', 'prepend', 'before', 'after'];
|
||||
|
||||
_.each(currentContexts, function(ctxObj){
|
||||
// if the axis or the context to not exist in the specs object
|
||||
// skip to the next one
|
||||
_.each(this._contextSpec(ctxObj, specs), function(val, func){
|
||||
|
||||
if(func==='class'){
|
||||
if(!changes[func]){
|
||||
changes[func] = [];
|
||||
}
|
||||
changes[func] = _.union(changes[func], val.split(' '));
|
||||
|
||||
} else if(((changes.move === undefined) ||
|
||||
(changes.move.value === '')) &&
|
||||
($.inArray(func, moveFuncs) !== -1)){
|
||||
|
||||
changes.move = {value:val, placement:func};
|
||||
|
||||
} else {
|
||||
if((changes[func] === undefined) || (changes[func] === '')){
|
||||
changes[func]=val;
|
||||
}
|
||||
}
|
||||
}, this);
|
||||
}, this);
|
||||
return changes;
|
||||
},
|
||||
|
||||
_currentContexts: function(axes) {
|
||||
var contexts = [];
|
||||
|
||||
_.each(axes.__keys__, function(ID){
|
||||
if(axes[ID].current !== null) {
|
||||
contexts.push({ctx:axes[ID].current, axis:ID});
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
return contexts;
|
||||
},
|
||||
|
||||
_removeClasses: function(specs, axes) {
|
||||
|
||||
var toRemove = [];
|
||||
|
||||
_.each(axes.__keys__, function(key){
|
||||
|
||||
var axis = axes[key];
|
||||
|
||||
_.each(axis.contexts, function(ctx){
|
||||
|
||||
// ignore the current context, those classes SHOULD be applied
|
||||
if(ctx.name === axis.current) {
|
||||
return;
|
||||
}
|
||||
var contextSpec = this._contextSpec(
|
||||
{axis:axis.ID, ctx:ctx.name}, specs),
|
||||
classes;
|
||||
|
||||
if(contextSpec !== undefined) {
|
||||
if(contextSpec['class'] !== undefined) {
|
||||
classes = contextSpec['class'].split(' ');
|
||||
if(classes !== undefined){
|
||||
toRemove = _.union(toRemove, classes);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, this);
|
||||
|
||||
}, this);
|
||||
|
||||
return toRemove;
|
||||
},
|
||||
|
||||
_contextConfig: function(specs, axes){
|
||||
|
||||
return this._resolveSpecs(this._currentContexts(axes), specs, axes);
|
||||
},
|
||||
|
||||
_makeChanges: function(elm, specs, axes){
|
||||
|
||||
if(_.isEmpty(axes)===false){
|
||||
var ctxConfig = this._contextConfig(specs, axes);
|
||||
|
||||
_.each(ctxConfig, function(change, func){
|
||||
if(func==='move'){
|
||||
if( (specs.__placement__ !== change.placement) ||
|
||||
(specs.__move__ !== change.value)){
|
||||
|
||||
$(change.value)[change.placement](elm);
|
||||
|
||||
// save the last placement of the element so
|
||||
// we're not moving it around for no good reason
|
||||
specs.__placement__ = change.placement;
|
||||
specs.__move__ = change.value;
|
||||
}
|
||||
} else if(func === 'class') {
|
||||
|
||||
var classes = elm.attr('class') || '';
|
||||
|
||||
// the class add/remove formula
|
||||
classes = _.union(change,
|
||||
_.difference(classes.split(' '),
|
||||
this._removeClasses(specs, axes)));
|
||||
|
||||
elm.attr('class', classes.join(' '));
|
||||
|
||||
} else {
|
||||
elm.attr(func, change);
|
||||
}
|
||||
}, this);
|
||||
}
|
||||
return elm;
|
||||
},
|
||||
|
||||
_respond: function(axes, elms){
|
||||
// go through all of the responsive elms
|
||||
elms.each(_.bind(function(i, elm){
|
||||
var $elm = $(elm.elm);
|
||||
this._makeChanges($elm, elm.spec, axes);
|
||||
$elm.trigger('intent', this);
|
||||
}, this));
|
||||
},
|
||||
|
||||
_contextualize: function(axisID, context, axes){
|
||||
axes[axisID].current = context;
|
||||
return axes;
|
||||
},
|
||||
|
||||
// private props
|
||||
|
||||
// axis test, does it begin with an underscore? for testing inside
|
||||
// spec objects
|
||||
_axis_test_pattern: new RegExp("^_[a-zA-Z0-9]"),
|
||||
|
||||
// match a group after the underscore:
|
||||
_axis_match_pattern: new RegExp("^_([a-zA-Z0-9][_a-zA-Z0-9]*)"),
|
||||
|
||||
// simple trim
|
||||
_trim_pattern:new RegExp( "^\s+|\s+$", "g" )
|
||||
};
|
||||
|
||||
return Intention;
|
||||
}));
|
||||
Vendored
-1277
File diff suppressed because it is too large
Load Diff
+23
File diff suppressed because one or more lines are too long
Vendored
+2
-2
File diff suppressed because one or more lines are too long
Vendored
+2
-2
File diff suppressed because one or more lines are too long
Vendored
+8263
-18747
File diff suppressed because it is too large
Load Diff
Vendored
+25762
-34323
File diff suppressed because it is too large
Load Diff
Vendored
-5
@@ -1,8 +1,3 @@
|
||||
/* Function to select for custom build: form input types
|
||||
/*! modernizr 3.6.0 (Custom Build) | MIT *
|
||||
* https://modernizr.com/download/?-inputtypes-setclasses !*/
|
||||
!function(e,t,n){function a(e,t){return typeof e===t}function s(){var e,t,n,s,i,o,c;for(var u in r)if(r.hasOwnProperty(u)){if(e=[],t=r[u],t.name&&(e.push(t.name.toLowerCase()),t.options&&t.options.aliases&&t.options.aliases.length))for(n=0;n<t.options.aliases.length;n++)e.push(t.options.aliases[n].toLowerCase());for(s=a(t.fn,"function")?t.fn():t.fn,i=0;i<e.length;i++)o=e[i],c=o.split("."),1===c.length?Modernizr[c[0]]=s:(!Modernizr[c[0]]||Modernizr[c[0]]instanceof Boolean||(Modernizr[c[0]]=new Boolean(Modernizr[c[0]])),Modernizr[c[0]][c[1]]=s),l.push((s?"":"no-")+c.join("-"))}}function i(e){var t=u.className,n=Modernizr._config.classPrefix||"";if(f&&(t=t.baseVal),Modernizr._config.enableJSClass){var a=new RegExp("(^|\\s)"+n+"no-js(\\s|$)");t=t.replace(a,"$1"+n+"js$2")}Modernizr._config.enableClasses&&(t+=" "+n+e.join(" "+n),f?u.className.baseVal=t:u.className=t)}function o(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):f?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}var l=[],r=[],c={_version:"3.6.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,t){var n=this;setTimeout(function(){t(n[e])},0)},addTest:function(e,t,n){r.push({name:e,fn:t,options:n})},addAsyncTest:function(e){r.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=c,Modernizr=new Modernizr;var u=t.documentElement,f="svg"===u.nodeName.toLowerCase(),p=o("input"),d="search tel url email datetime date month week time datetime-local number range color".split(" "),m={};Modernizr.inputtypes=function(e){for(var a,s,i,o=e.length,l="1)",r=0;o>r;r++)p.setAttribute("type",a=e[r]),i="text"!==p.type&&"style"in p,i&&(p.value=l,p.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(a)&&p.style.WebkitAppearance!==n?(u.appendChild(p),s=t.defaultView,i=s.getComputedStyle&&"textfield"!==s.getComputedStyle(p,null).WebkitAppearance&&0!==p.offsetHeight,u.removeChild(p)):/^(search|tel)$/.test(a)||(i=/^(url|email)$/.test(a)?p.checkValidity&&p.checkValidity()===!1:p.value!=l)),m[e[r]]=!!i;return m}(d),s(),i(l),delete c.addTest,delete c.addAsyncTest;for(var h=0;h<Modernizr._q.length;h++)Modernizr._q[h]();e.Modernizr=Modernizr}(window,document);
|
||||
|
||||
/*!
|
||||
* @fileOverview TouchSwipe - jQuery Plugin
|
||||
* @version 1.6.18
|
||||
|
||||
Vendored
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*!
|
||||
* screenfull
|
||||
* v4.2.0 - 2019-04-01
|
||||
* v5.1.0 - 2020-12-24
|
||||
* (c) Sindre Sorhus; MIT License
|
||||
*/
|
||||
|
||||
!function(){"use strict";var u="undefined"!=typeof window&&void 0!==window.document?window.document:{},e="undefined"!=typeof module&&module.exports,t="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,c=function(){for(var e,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],l=0,r=n.length,t={};l<r;l++)if((e=n[l])&&e[1]in u){for(l=0;l<e.length;l++)t[n[0][l]]=e[l];return t}return!1}(),r={change:c.fullscreenchange,error:c.fullscreenerror},n={request:function(r){return new Promise(function(e){var n=c.requestFullscreen,l=function(){this.off("change",l),e()}.bind(this);r=r||u.documentElement,/ Version\/5\.1(?:\.\d+)? Safari\//.test(navigator.userAgent)?r[n]():r[n](t?Element.ALLOW_KEYBOARD_INPUT:{}),this.on("change",l)}.bind(this))},exit:function(){return new Promise(function(e){if(this.isFullscreen){var n=function(){this.off("change",n),e()}.bind(this);u[c.exitFullscreen](),this.on("change",n)}else e()}.bind(this))},toggle:function(e){return this.isFullscreen?this.exit():this.request(e)},onchange:function(e){this.on("change",e)},onerror:function(e){this.on("error",e)},on:function(e,n){var l=r[e];l&&u.addEventListener(l,n,!1)},off:function(e,n){var l=r[e];l&&u.removeEventListener(l,n,!1)},raw:c};c?(Object.defineProperties(n,{isFullscreen:{get:function(){return Boolean(u[c.fullscreenElement])}},element:{enumerable:!0,get:function(){return u[c.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return Boolean(u[c.fullscreenEnabled])}}}),e?(module.exports=n,module.exports.default=n):window.screenfull=n):e?module.exports=!1:window.screenfull=!1}();
|
||||
!function(){"use strict";var c="undefined"!=typeof window&&void 0!==window.document?window.document:{},e="undefined"!=typeof module&&module.exports,s=function(){for(var e,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],l=0,r=n.length,t={};l<r;l++)if((e=n[l])&&e[1]in c){for(l=0;l<e.length;l++)t[n[0][l]]=e[l];return t}return!1}(),l={change:s.fullscreenchange,error:s.fullscreenerror},n={request:function(t,u){return new Promise(function(e,n){var l=function(){this.off("change",l),e()}.bind(this);this.on("change",l);var r=(t=t||c.documentElement)[s.requestFullscreen](u);r instanceof Promise&&r.then(l).catch(n)}.bind(this))},exit:function(){return new Promise(function(e,n){var l,r;this.isFullscreen?(l=function(){this.off("change",l),e()}.bind(this),this.on("change",l),(r=c[s.exitFullscreen]())instanceof Promise&&r.then(l).catch(n)):e()}.bind(this))},toggle:function(e,n){return this.isFullscreen?this.exit():this.request(e,n)},onchange:function(e){this.on("change",e)},onerror:function(e){this.on("error",e)},on:function(e,n){e=l[e];e&&c.addEventListener(e,n,!1)},off:function(e,n){e=l[e];e&&c.removeEventListener(e,n,!1)},raw:s};s?(Object.defineProperties(n,{isFullscreen:{get:function(){return Boolean(c[s.fullscreenElement])}},element:{enumerable:!0,get:function(){return c[s.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return Boolean(c[s.fullscreenEnabled])}}}),e?module.exports=n:window.screenfull=n):e?module.exports={isEnabled:!1}:window.screenfull={isEnabled:!1}}();
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,420 @@
|
||||
tinymce.addI18n('ar',{
|
||||
"Redo": "\u0625\u0639\u0627\u062f\u0629",
|
||||
"Undo": "\u062a\u0631\u0627\u062c\u0639",
|
||||
"Cut": "\u0642\u0635",
|
||||
"Copy": "\u0646\u0633\u062e",
|
||||
"Paste": "\u0644\u0635\u0642",
|
||||
"Select all": "\u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0643\u0644",
|
||||
"New document": "\u0645\u0633\u062a\u0646\u062f \u062c\u062f\u064a\u062f",
|
||||
"Ok": "\u0645\u0648\u0627\u0641\u0642",
|
||||
"Cancel": "\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u0623\u0645\u0631",
|
||||
"Visual aids": "\u0623\u062f\u0648\u0627\u062a \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629 \u0627\u0644\u0628\u0635\u0631\u064a\u0629",
|
||||
"Bold": "\u063a\u0627\u0645\u0642",
|
||||
"Italic": "\u0645\u0627\u0626\u0644",
|
||||
"Underline": "\u062a\u0633\u0637\u064a\u0631",
|
||||
"Strikethrough": "\u064a\u062a\u0648\u0633\u0637\u0647 \u062e\u0637",
|
||||
"Superscript": "\u0645\u0631\u062a\u0641\u0639",
|
||||
"Subscript": "\u0645\u0646\u062e\u0641\u0636",
|
||||
"Clear formatting": "\u0645\u0633\u062d \u0627\u0644\u062a\u0646\u0633\u064a\u0642",
|
||||
"Align left": "\u0645\u062d\u0627\u0630\u0627\u0629 \u0625\u0644\u0649 \u0627\u0644\u064a\u0633\u0627\u0631",
|
||||
"Align center": "\u0645\u062d\u0627\u0630\u0627\u0629 \u0625\u0644\u0649 \u0627\u0644\u0648\u0633\u0637",
|
||||
"Align right": "\u0645\u062d\u0627\u0630\u0627\u0629 \u0625\u0644\u0649 \u0627\u0644\u064a\u0645\u064a\u0646",
|
||||
"Justify": "\u0636\u0628\u0637",
|
||||
"Bullet list": "\u0642\u0627\u0626\u0645\u0629 \u062a\u0639\u062f\u0627\u062f \u0646\u0642\u0637\u064a",
|
||||
"Numbered list": "\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u0642\u0645\u0651\u064e\u0629",
|
||||
"Decrease indent": "\u062a\u0642\u0644\u064a\u0644 \u0627\u0644\u0645\u0633\u0627\u0641\u0629 \u0627\u0644\u0628\u0627\u062f\u0626\u0629",
|
||||
"Increase indent": "\u0632\u064a\u0627\u062f\u0629 \u0627\u0644\u0645\u0633\u0627\u0641\u0629 \u0627\u0644\u0628\u0627\u062f\u0626\u0629",
|
||||
"Close": "\u0625\u063a\u0644\u0627\u0642",
|
||||
"Formats": "\u0627\u0644\u062a\u0646\u0633\u064a\u0642\u0627\u062a",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0645\u062a\u0635\u0641\u062d\u0643 \u0644\u0627 \u064a\u062f\u0639\u0645 \u0627\u0644\u0648\u0635\u0648\u0644 \u0627\u0644\u0645\u0628\u0627\u0634\u0631 \u0625\u0644\u0649 \u0627\u0644\u062d\u0627\u0641\u0638\u0629. \u064a\u064f\u0631\u062c\u0649 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u062e\u062a\u0635\u0627\u0631\u0627\u062a \u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d Ctrl+X\/C\/V \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u0630\u0644\u0643.",
|
||||
"Headers": "\u0627\u0644\u0639\u0646\u0627\u0648\u064a\u0646",
|
||||
"Header 1": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 1",
|
||||
"Header 2": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 2",
|
||||
"Header 3": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 3",
|
||||
"Header 4": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 4",
|
||||
"Header 5": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 5",
|
||||
"Header 6": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 6",
|
||||
"Headings": "\u0627\u0644\u0639\u0646\u0627\u0648\u064a\u0646",
|
||||
"Heading 1": "\u0639\u0646\u0648\u0627\u0646 \u0661",
|
||||
"Heading 2": "\u0639\u0646\u0648\u0627\u0646 2",
|
||||
"Heading 3": "\u0639\u0646\u0648\u0627\u0646 3",
|
||||
"Heading 4": "\u0639\u0646\u0648\u0627\u0646 4",
|
||||
"Heading 5": "\u0639\u0646\u0648\u0627\u0646 5",
|
||||
"Heading 6": "\u0639\u0646\u0648\u0627\u0646 6",
|
||||
"Preformatted": "\u0645\u0646\u0633\u0642 \u0645\u0633\u0628\u0642\u064b\u0627",
|
||||
"Div": "Div",
|
||||
"Pre": "Pre",
|
||||
"Code": "\u0631\u0645\u0632",
|
||||
"Paragraph": "\u0627\u0644\u0641\u0642\u0631\u0629",
|
||||
"Blockquote": "Blockquote",
|
||||
"Inline": "\u062f\u0627\u062e\u0644\u064a",
|
||||
"Blocks": "\u0627\u0644\u0643\u062a\u0644",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u064a\u062a\u0645 \u0627\u0644\u0644\u0635\u0642 \u062d\u0627\u0644\u064a\u0627\u064b \u0643\u0646\u0635 \u0639\u0627\u062f\u064a. \u0627\u0644\u0645\u062d\u062a\u0648\u0649 \u0633\u064a\u0628\u0642\u0649 \u0643\u0646\u0635 \u0639\u0627\u062f\u064a \u062d\u062a\u0649 \u062a\u0642\u0648\u0645 \u0628\u062a\u0639\u0637\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u062e\u064a\u0627\u0631.",
|
||||
"Fonts": "\u0627\u0644\u062e\u0637\u0648\u0637",
|
||||
"Font Sizes": "\u0623\u062d\u062c\u0627\u0645 \u0627\u0644\u062e\u0637\u0648\u0637",
|
||||
"Class": "\u0627\u0644\u0641\u0626\u0629",
|
||||
"Browse for an image": "\u0627\u0633\u062a\u0639\u0631\u0627\u0636 \u0635\u0648\u0631\u0629",
|
||||
"OR": "\u0623\u0648",
|
||||
"Drop an image here": "\u0625\u0641\u0644\u0627\u062a \u0635\u0648\u0631\u0629 \u0647\u0646\u0627",
|
||||
"Upload": "\u062a\u062d\u0645\u064a\u0644",
|
||||
"Block": "\u062d\u0638\u0631",
|
||||
"Align": "\u0645\u062d\u0627\u0630\u0627\u0629",
|
||||
"Default": "\u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a",
|
||||
"Circle": "\u062f\u0627\u0626\u0631\u0629",
|
||||
"Disc": "\u0642\u0631\u0635",
|
||||
"Square": "\u0645\u0631\u0628\u0639",
|
||||
"Lower Alpha": "\u062a\u0631\u0642\u064a\u0645 \u0623\u062e\u0631\u0641 \u0635\u063a\u064a\u0631\u0629",
|
||||
"Lower Greek": "\u062a\u0631\u0642\u064a\u0645 \u064a\u0648\u0646\u0627\u0646\u064a \u0635\u063a\u064a\u0631",
|
||||
"Lower Roman": "\u062a\u0631\u0642\u064a\u0645 \u0631\u0648\u0645\u0627\u0646\u064a \u0635\u063a\u064a\u0631",
|
||||
"Upper Alpha": "\u062a\u0631\u0642\u064a\u0645 \u0623\u062d\u0631\u0641 \u0643\u0628\u064a\u0631\u0629",
|
||||
"Upper Roman": "\u062a\u0631\u0642\u064a\u0645 \u0631\u0648\u0645\u0627\u0646\u064a \u0643\u0628\u064a\u0631",
|
||||
"Anchor...": "\u0645\u0631\u0633\u0627\u0629...",
|
||||
"Name": "\u0627\u0644\u0627\u0633\u0645",
|
||||
"Id": "\u0631\u0642\u0645 \u0627\u0644\u0645\u0639\u0631\u0641",
|
||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u0631\u0642\u0645 \u0627\u0644\u0645\u0639\u0631\u0641 \u064a\u062c\u0628 \u0623\u0646 \u062a\u0628\u062f\u0623 \u0628\u062d\u0631\u0641\u060c \u064a\u062a\u0628\u0639 \u0641\u0642\u0637 \u0628\u062d\u0631\u0648\u0641 \u0648\u0623\u0631\u0642\u0627\u0645\u060c \u0634\u0631\u0637\u0627\u062a\u060c \u0623\u0648 \u0627\u0644\u0646\u0642\u0627\u0637\u060c \u0627\u0644\u0646\u0642\u0637\u062a\u064a\u0646 \u0623\u0648 \u0627\u0644\u0634\u0631\u0637\u0627\u062a \u0627\u0644\u0633\u0641\u0644\u064a\u0629.",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "\u0644\u062f\u064a\u0643 \u062a\u063a\u064a\u064a\u0631\u0627\u062a \u0644\u0645 \u064a\u062a\u0645 \u062d\u0641\u0638\u0647\u0627 \u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0641\u064a \u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0628\u0639\u064a\u062f\u0627\u061f",
|
||||
"Restore last draft": "\u0627\u0633\u062a\u0639\u0627\u062f\u0629 \u0623\u062e\u0631 \u0645\u0633\u0648\u062f\u0629",
|
||||
"Special character...": "\u0631\u0645\u0632 \u062e\u0627\u0635...",
|
||||
"Source code": "\u0634\u0641\u0631\u0629 \u0627\u0644\u0645\u0635\u062f\u0631",
|
||||
"Insert\/Edit code sample": "\u0625\u062f\u0631\u0627\u062c\/\u062a\u062d\u0631\u064a\u0631 \u0627\u0644\u0643\u0648\u062f",
|
||||
"Language": "\u0627\u0644\u0644\u063a\u0629",
|
||||
"Code sample...": "\u0639\u064a\u0646\u0629 \u0627\u0644\u0631\u0645\u0632...",
|
||||
"Color Picker": "\u0645\u0646\u062a\u0642\u064a \u0627\u0644\u0623\u0644\u0648\u0627\u0646",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"B": "B",
|
||||
"Left to right": "\u0645\u0646 \u0627\u0644\u064a\u0633\u0627\u0631 \u0644\u0644\u064a\u0645\u064a\u0646",
|
||||
"Right to left": "\u0645\u0646 \u0627\u0644\u064a\u0645\u064a\u0646 \u0644\u0644\u064a\u0633\u0627\u0631",
|
||||
"Emoticons...": "\u0631\u0645\u0648\u0632 \u0627\u0644\u0645\u0634\u0627\u0639\u0631...",
|
||||
"Metadata and Document Properties": "\u062e\u0635\u0627\u0626\u0635 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062a\u0639\u0631\u064a\u0641 \u0648\u0627\u0644\u0645\u0633\u062a\u0646\u062f",
|
||||
"Title": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646",
|
||||
"Keywords": "\u0643\u0644\u0645\u0627\u062a \u0627\u0644\u0628\u062d\u062b",
|
||||
"Description": "\u0627\u0644\u0648\u0635\u0641",
|
||||
"Robots": "\u0627\u0644\u0631\u0648\u0628\u0648\u062a\u0627\u062a",
|
||||
"Author": "\u0627\u0644\u0643\u0627\u062a\u0628",
|
||||
"Encoding": "\u0627\u0644\u062a\u0631\u0645\u064a\u0632",
|
||||
"Fullscreen": "\u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
|
||||
"Action": "\u0627\u0644\u0639\u0645\u0644\u064a\u0629",
|
||||
"Shortcut": "\u0627\u0644\u0627\u062e\u062a\u0635\u0627\u0631",
|
||||
"Help": "\u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629",
|
||||
"Address": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646",
|
||||
"Focus to menubar": "\u0627\u0644\u062a\u0631\u0643\u064a\u0632 \u0639\u0644\u0649 \u0634\u0631\u064a\u0637 \u0627\u0644\u0642\u0648\u0627\u0626\u0645",
|
||||
"Focus to toolbar": "\u0627\u0644\u062a\u0631\u0643\u064a\u0632 \u0639\u0644\u0649 \u0634\u0631\u064a\u0637 \u0627\u0644\u0623\u062f\u0648\u0627\u062a",
|
||||
"Focus to element path": "\u0627\u0644\u062a\u0631\u0643\u064a\u0632 \u0639\u0644\u0649 \u0645\u0633\u0627\u0631 \u0627\u0644\u0639\u0646\u0635\u0631",
|
||||
"Focus to contextual toolbar": "\u0627\u0644\u062a\u0631\u0643\u064a\u0632 \u0639\u0644\u0649 \u0634\u0631\u064a\u0637 \u0623\u062f\u0648\u0627\u062a \u0627\u0644\u0633\u064a\u0627\u0642",
|
||||
"Insert link (if link plugin activated)": "\u0625\u0636\u0627\u0641\u0629 \u0631\u0627\u0628\u0637 (\u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0645\u0641\u0639\u0644\u0629)",
|
||||
"Save (if save plugin activated)": "\u062d\u0641\u0638 (\u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u062d\u0641\u0638 \u0645\u0641\u0639\u0644\u0629)",
|
||||
"Find (if searchreplace plugin activated)": "\u0627\u0644\u0628\u062d\u062b (\u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0628\u062d\u062b \u0645\u0641\u0639\u0644\u0629)",
|
||||
"Plugins installed ({0}):": "\u0627\u0644\u0625\u0636\u0627\u0641\u0627\u062a \u0627\u0644\u0645\u062b\u0628\u062a\u0629 ({0}):",
|
||||
"Premium plugins:": "\u0627\u0644\u0625\u0636\u0627\u0641\u0627\u062a \u0627\u0644\u0645\u0645\u064a\u0632\u0629:",
|
||||
"Learn more...": "\u0645\u0639\u0631\u0641\u0629 \u0627\u0644\u0645\u0632\u064a\u062f...",
|
||||
"You are using {0}": "\u0623\u0646\u062a \u062a\u0633\u062a\u062e\u062f\u0645 {0}",
|
||||
"Plugins": "\u0627\u0644\u0625\u0636\u0627\u0641\u0627\u062a",
|
||||
"Handy Shortcuts": "\u0627\u062e\u062a\u0635\u0627\u0631\u0627\u062a \u0645\u0633\u0627\u0639\u0650\u062f\u0629",
|
||||
"Horizontal line": "\u062e\u0637 \u0623\u0641\u0642\u064a",
|
||||
"Insert\/edit image": "\u0625\u062f\u0631\u0627\u062c\/\u062a\u062d\u0631\u064a\u0631 \u0635\u0648\u0631\u0629",
|
||||
"Image description": "\u0648\u0635\u0641 \u0627\u0644\u0635\u0648\u0631\u0629",
|
||||
"Source": "\u0627\u0644\u0645\u0635\u062f\u0631",
|
||||
"Dimensions": "\u0627\u0644\u0623\u0628\u0639\u0627\u062f",
|
||||
"Constrain proportions": "\u0627\u0644\u062a\u0646\u0627\u0633\u0628",
|
||||
"General": "\u0639\u0627\u0645",
|
||||
"Advanced": "\u062e\u0635\u0627\u0626\u0635 \u0645\u062a\u0642\u062f\u0645\u0647",
|
||||
"Style": "\u0627\u0644\u0646\u0645\u0637 \/ \u0627\u0644\u0634\u0643\u0644",
|
||||
"Vertical space": "\u0645\u0633\u0627\u0641\u0629 \u0639\u0645\u0648\u062f\u064a\u0629",
|
||||
"Horizontal space": "\u0645\u0633\u0627\u0641\u0629 \u0623\u0641\u0642\u064a\u0629",
|
||||
"Border": "\u062d\u062f\u0648\u062f",
|
||||
"Insert image": "\u0625\u062f\u0631\u0627\u062c \u0635\u0648\u0631\u0629",
|
||||
"Image...": "\u0635\u0648\u0631\u0629...",
|
||||
"Image list": "\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0635\u0648\u0631",
|
||||
"Rotate counterclockwise": "\u062a\u062f\u0648\u064a\u0631 \u0639\u0643\u0633 \u0627\u062a\u062c\u0627\u0647 \u0639\u0642\u0627\u0631\u0628 \u0627\u0644\u0633\u0627\u0639\u0629",
|
||||
"Rotate clockwise": "\u062a\u062f\u0648\u064a\u0631 \u0641\u064a \u0627\u062a\u062c\u0627\u0647 \u0639\u0642\u0627\u0631\u0628 \u0627\u0644\u0633\u0627\u0639\u0629",
|
||||
"Flip vertically": "\u0627\u0646\u0639\u0643\u0627\u0633 \u0639\u0627\u0645\u0648\u062f\u064a",
|
||||
"Flip horizontally": "\u0627\u0646\u0639\u0643\u0627\u0633 \u0623\u0641\u0642\u064a",
|
||||
"Edit image": "\u062a\u062d\u0631\u064a\u0631 \u0627\u0644\u0635\u0648\u0631\u0629",
|
||||
"Image options": "\u0627\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0635\u0648\u0631\u0629",
|
||||
"Zoom in": "\u062a\u0643\u0628\u064a\u0631",
|
||||
"Zoom out": "\u062a\u0635\u063a\u064a\u0631",
|
||||
"Crop": "\u0642\u0635",
|
||||
"Resize": "\u062a\u063a\u064a\u064a\u0631 \u062d\u062c\u0645",
|
||||
"Orientation": "\u0627\u0644\u0645\u062d\u0627\u0630\u0627\u0629",
|
||||
"Brightness": "\u0627\u0644\u0625\u0636\u0627\u0621\u0629",
|
||||
"Sharpen": "\u062d\u0627\u062f\u0629",
|
||||
"Contrast": "\u0627\u0644\u062a\u0628\u0627\u064a\u0646",
|
||||
"Color levels": "\u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0644\u0648\u0646",
|
||||
"Gamma": "\u063a\u0627\u0645\u0627",
|
||||
"Invert": "\u0639\u0643\u0633",
|
||||
"Apply": "\u062a\u0637\u0628\u064a\u0642",
|
||||
"Back": "\u0644\u0644\u062e\u0644\u0641",
|
||||
"Insert date\/time": "\u0625\u062f\u0631\u0627\u062c \u062a\u0627\u0631\u064a\u062e\/\u0648\u0642\u062a",
|
||||
"Date\/time": "\u0627\u0644\u062a\u0627\u0631\u064a\u062e\/\u0627\u0644\u0648\u0642\u062a",
|
||||
"Insert\/Edit Link": "\u0625\u062f\u0631\u0627\u062c\/\u062a\u062d\u0631\u064a\u0631 \u0627\u0631\u062a\u0628\u0627\u0637",
|
||||
"Insert\/edit link": "\u0625\u062f\u0631\u0627\u062c\/\u062a\u062d\u0631\u064a\u0631 \u0631\u0627\u0628\u0637",
|
||||
"Text to display": "\u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0637\u0644\u0648\u0628 \u0639\u0631\u0636\u0647",
|
||||
"Url": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646",
|
||||
"Open link in...": "\u062c\u0627\u0631\u064d \u0641\u062a\u062d \u0627\u0644\u0627\u0631\u062a\u0628\u0627\u0637.",
|
||||
"Current window": "\u0627\u0644\u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629",
|
||||
"None": "\u0628\u0644\u0627",
|
||||
"New window": "\u0646\u0627\u0641\u0630\u0629 \u062c\u062f\u064a\u062f\u0629",
|
||||
"Remove link": "\u062d\u0630\u0641 \u0627\u0644\u0631\u0627\u0628\u0637",
|
||||
"Anchors": "\u0627\u0644\u0645\u0631\u0633\u0627\u0629",
|
||||
"Link...": "\u0627\u0631\u062a\u0628\u0627\u0637...",
|
||||
"Paste or type a link": "\u0623\u062f\u062e\u0644 \u0623\u0648 \u0627\u0643\u062a\u0628 \u0627\u0644\u0631\u0627\u0628\u0637",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0630\u064a \u0642\u0645\u062a \u0628\u0625\u062f\u0631\u0627\u062c\u0647 \u064a\u0634\u0627\u0628\u0647 \u0627\u0644\u0628\u0631\u064a\u062f \u0627\u0644\u0627\u0644\u0643\u062a\u0631\u0648\u0646\u064a. \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0646 \u062a\u0636\u064a\u0641 \u0627\u0644\u0644\u0627\u062d\u0642\u0629 mailto: \u0645\u0639\u062a\u0628\u0631\u0627\u064b \u0647\u0630\u0627 \u0627\u0644\u0631\u0627\u0628\u0637 \u0628\u0631\u064a\u062f\u0627 \u0627\u0644\u0643\u062a\u0631\u0648\u0646\u064a\u0627\u064b\u061f",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0646\u062a\u0648\u0642\u0639 \u0627\u0646\u0643 \u0642\u0645\u062a \u0628\u0625\u062f\u0631\u0627\u062c \u0631\u0627\u0628\u0637 \u0644\u0645\u0648\u0642\u0639 \u062e\u0627\u0631\u062c\u064a. \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0646 \u0646\u0636\u064a\u0641 \u0627\u0644\u0644\u0627\u062d\u0642\u0629 http:\/\/ \u0644\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0630\u064a \u0627\u062f\u062e\u0644\u062a\u0647\u061f",
|
||||
"Link list": "\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0648\u0627\u0628\u0637",
|
||||
"Insert video": "\u0625\u062f\u0631\u0627\u062c \u0641\u064a\u062f\u064a\u0648",
|
||||
"Insert\/edit video": "\u0625\u062f\u0631\u0627\u062c\/\u062a\u062d\u0631\u064a\u0631 \u0641\u064a\u062f\u064a\u0648",
|
||||
"Insert\/edit media": "\u0625\u062f\u0631\u0627\u062c\/\u062a\u062d\u0631\u064a\u0631 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u062a\u0639\u062f\u062f\u0629",
|
||||
"Alternative source": "\u0645\u0635\u062f\u0631 \u0628\u062f\u064a\u0644",
|
||||
"Alternative source URL": "\u0639\u0646\u0648\u0627\u0646 URL \u0644\u0644\u0645\u0635\u062f\u0631 \u0627\u0644\u0628\u062f\u064a\u0644",
|
||||
"Media poster (Image URL)": "\u0645\u0644\u0635\u0642 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 (\u0639\u0646\u0648\u0627\u0646 URL \u0644\u0644\u0635\u0648\u0631\u0629)",
|
||||
"Paste your embed code below:": "\u0644\u0635\u0642 \u0643\u0648\u062f \u0627\u0644\u062a\u0636\u0645\u064a\u0646 \u0647\u0646\u0627:",
|
||||
"Embed": "\u062a\u0636\u0645\u064a\u0646",
|
||||
"Media...": "\u0627\u0644\u0648\u0633\u0627\u0626\u0637...",
|
||||
"Nonbreaking space": "\u0645\u0633\u0627\u0641\u0629 \u063a\u064a\u0631 \u0645\u0646\u0642\u0633\u0645\u0629",
|
||||
"Page break": "\u0641\u0627\u0635\u0644 \u0644\u0644\u0635\u0641\u062d\u0629",
|
||||
"Paste as text": "\u0644\u0635\u0642 \u0643\u0646\u0635",
|
||||
"Preview": "\u0645\u0639\u0627\u064a\u0646\u0629",
|
||||
"Print...": "\u0637\u0628\u0627\u0639\u0629...",
|
||||
"Save": "\u062d\u0641\u0638",
|
||||
"Find": "\u0628\u062d\u062b",
|
||||
"Replace with": "\u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u0628\u0640",
|
||||
"Replace": "\u0627\u0633\u062a\u0628\u062f\u0627\u0644",
|
||||
"Replace all": "\u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u0627\u0644\u0643\u0644",
|
||||
"Previous": "\u0627\u0644\u0633\u0627\u0628\u0642",
|
||||
"Next": "\u0627\u0644\u062a\u0627\u0644\u064a",
|
||||
"Find and replace...": "\u062c\u0627\u0631\u064d \u0627\u0644\u0628\u062d\u062b \u0648\u0627\u0644\u0627\u0633\u062a\u0628\u062f\u0627\u0644...",
|
||||
"Could not find the specified string.": "\u062a\u0639\u0630\u0631 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0627\u0644\u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u062d\u062f\u062f\u0629",
|
||||
"Match case": "\u0645\u0637\u0627\u0628\u0642\u0629 \u062d\u0627\u0644\u0629 \u0627\u0644\u0623\u062d\u0631\u0641",
|
||||
"Find whole words only": "\u0628\u062d\u062b \u0643\u0644\u0645\u0627\u062a \u0628\u0623\u0643\u0645\u0644\u0647\u0627 \u0641\u0642\u0637",
|
||||
"Spell check": "\u062a\u062f\u0642\u064a\u0642 \u0625\u0645\u0644\u0627\u0626\u064a",
|
||||
"Ignore": "\u062a\u062c\u0627\u0647\u0644",
|
||||
"Ignore all": "\u062a\u062c\u0627\u0647\u0644 \u0627\u0644\u0643\u0644",
|
||||
"Finish": "\u0627\u0646\u062a\u0647\u064a",
|
||||
"Add to Dictionary": "\u0627\u0636\u0641 \u0627\u0644\u064a \u0627\u0644\u0642\u0627\u0645\u0648\u0633",
|
||||
"Insert table": "\u0625\u062f\u0631\u0627\u062c \u062c\u062f\u0648\u0644",
|
||||
"Table properties": "\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u062c\u062f\u0648\u0644",
|
||||
"Delete table": "\u062d\u0630\u0641 \u062c\u062f\u0648\u0644",
|
||||
"Cell": "\u062e\u0644\u064a\u0629",
|
||||
"Row": "\u0635\u0641",
|
||||
"Column": "\u0639\u0645\u0648\u062f",
|
||||
"Cell properties": "\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u062e\u0644\u064a\u0629",
|
||||
"Merge cells": "\u062f\u0645\u062c \u062e\u0644\u0627\u064a\u0627",
|
||||
"Split cell": "\u062a\u0642\u0633\u064a\u0645 \u0627\u0644\u062e\u0644\u0627\u064a\u0627",
|
||||
"Insert row before": "\u0625\u062f\u0631\u0627\u062c \u0635\u0641 \u0644\u0644\u0623\u0639\u0644\u0649",
|
||||
"Insert row after": "\u0625\u062f\u0631\u0627\u062c \u0635\u0641 \u0644\u0644\u0623\u0633\u0641\u0644",
|
||||
"Delete row": "\u062d\u0630\u0641 \u0635\u0641",
|
||||
"Row properties": "\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0635\u0641",
|
||||
"Cut row": "\u0642\u0635 \u0627\u0644\u0635\u0641",
|
||||
"Copy row": "\u0646\u0633\u062e \u0627\u0644\u0635\u0641",
|
||||
"Paste row before": "\u0644\u0635\u0642 \u0627\u0644\u0635\u0641 \u0644\u0644\u0623\u0639\u0644\u0649",
|
||||
"Paste row after": "\u0644\u0635\u0642 \u0627\u0644\u0635\u0641 \u0644\u0644\u0623\u0633\u0641\u0644",
|
||||
"Insert column before": "\u0625\u062f\u0631\u0627\u062c \u0639\u0645\u0648\u062f \u0644\u0644\u064a\u0633\u0627\u0631",
|
||||
"Insert column after": "\u0625\u062f\u0631\u0627\u062c \u0639\u0645\u0648\u062f \u0644\u0644\u064a\u0645\u064a\u0646",
|
||||
"Delete column": "\u062d\u0630\u0641 \u0639\u0645\u0648\u062f",
|
||||
"Cols": "\u0639\u062f\u062f \u0627\u0644\u0623\u0639\u0645\u062f\u0629",
|
||||
"Rows": "\u0639\u062f\u062f \u0627\u0644\u0635\u0641\u0648\u0641",
|
||||
"Width": "\u0639\u0631\u0636",
|
||||
"Height": "\u0627\u0631\u062a\u0641\u0627\u0639",
|
||||
"Cell spacing": "\u0627\u0644\u0645\u0633\u0627\u0641\u0629 \u0628\u064a\u0646 \u0627\u0644\u062e\u0644\u0627\u064a\u0627",
|
||||
"Cell padding": "\u062a\u0628\u0627\u0639\u062f \u0627\u0644\u062e\u0644\u064a\u0629",
|
||||
"Show caption": "\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u062a\u0648\u0636\u064a\u062d\u064a\u0629",
|
||||
"Left": "\u064a\u0633\u0627\u0631",
|
||||
"Center": "\u062a\u0648\u0633\u064a\u0637",
|
||||
"Right": "\u064a\u0645\u064a\u0646",
|
||||
"Cell type": "\u0646\u0648\u0639 \u0627\u0644\u062e\u0644\u064a\u0629",
|
||||
"Scope": "\u0627\u0644\u0645\u062c\u0627\u0644",
|
||||
"Alignment": "\u0645\u062d\u0627\u0630\u0627\u0629",
|
||||
"H Align": "\u0645\u062d\u0627\u0630\u0627\u0629 \u0623\u0641\u0642\u064a\u0629",
|
||||
"V Align": "\u0645\u062d\u0627\u0630\u0627\u0629 \u0631\u0623\u0633\u064a\u0629",
|
||||
"Top": "\u0623\u0639\u0644\u064a",
|
||||
"Middle": "\u0627\u0644\u0648\u0633\u0637",
|
||||
"Bottom": "\u0627\u0644\u0623\u0633\u0641\u0644",
|
||||
"Header cell": "\u0631\u0623\u0633 \u0627\u0644\u062e\u0644\u064a\u0629",
|
||||
"Row group": "\u0645\u062c\u0645\u0648\u0639\u0629 \u0635\u0641",
|
||||
"Column group": "\u0645\u062c\u0645\u0648\u0639\u0629 \u0639\u0645\u0648\u062f",
|
||||
"Row type": "\u0646\u0648\u0639 \u0627\u0644\u0635\u0641",
|
||||
"Header": "\u0627\u0644\u0631\u0623\u0633",
|
||||
"Body": "\u0647\u064a\u0643\u0644",
|
||||
"Footer": "\u062a\u0630\u064a\u064a\u0644",
|
||||
"Border color": "\u0644\u0648\u0646 \u0627\u0644\u0625\u0637\u0627\u0631",
|
||||
"Insert template...": "\u062c\u0627\u0631\u064d \u0625\u062f\u0631\u0627\u062c \u0642\u0627\u0644\u0628...",
|
||||
"Templates": "\u0642\u0648\u0627\u0644\u0628",
|
||||
"Template": "\u0627\u0644\u0642\u0627\u0644\u0628",
|
||||
"Text color": "\u0644\u0648\u0646 \u0627\u0644\u0646\u0635",
|
||||
"Background color": "\u0644\u0648\u0646 \u0627\u0644\u062e\u0644\u0641\u064a\u0629",
|
||||
"Custom...": "\u062a\u062e\u0635\u064a\u0635 ...",
|
||||
"Custom color": "\u0644\u0648\u0646 \u0645\u062e\u0635\u0635",
|
||||
"No color": "\u0628\u062f\u0648\u0646 \u0644\u0648\u0646",
|
||||
"Remove color": "\u0625\u0632\u0627\u0644\u0629 \u0644\u0648\u0646",
|
||||
"Table of Contents": "\u062c\u062f\u0648\u0644 \u0627\u0644\u0645\u062d\u062a\u0648\u064a\u0627\u062a",
|
||||
"Show blocks": "\u0645\u0634\u0627\u0647\u062f\u0629 \u0627\u0644\u0643\u062a\u0644",
|
||||
"Show invisible characters": "\u0623\u0638\u0647\u0631 \u0627\u0644\u0623\u062d\u0631\u0641 \u0627\u0644\u063a\u064a\u0631 \u0645\u0631\u0626\u064a\u0629",
|
||||
"Word count": "\u0639\u062f\u062f \u0627\u0644\u0643\u0644\u0645\u0627\u062a",
|
||||
"Count": "\u0627\u0644\u0639\u062f\u062f",
|
||||
"Document": "\u0627\u0644\u0645\u0633\u062a\u0646\u062f",
|
||||
"Selection": "\u0627\u0644\u062a\u062d\u062f\u064a\u062f",
|
||||
"Words": "\u0627\u0644\u0643\u0644\u0645\u0627\u062a",
|
||||
"Words: {0}": "\u0627\u0644\u0643\u0644\u0645\u0627\u062a:{0}",
|
||||
"{0} words": "{0} \u0643\u0644\u0645\u0627\u062a",
|
||||
"File": "\u0645\u0644\u0641",
|
||||
"Edit": "\u062a\u062d\u0631\u064a\u0631",
|
||||
"Insert": "\u0625\u062f\u0631\u0627\u062c",
|
||||
"View": "\u0639\u0631\u0636",
|
||||
"Format": "\u062a\u0646\u0633\u064a\u0642",
|
||||
"Table": "\u062c\u062f\u0648\u0644",
|
||||
"Tools": "\u0623\u062f\u0627\u0648\u0627\u062a",
|
||||
"Powered by {0}": "\u0645\u062f\u0639\u0648\u0645 \u0645\u0646 {0}",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u0645\u0646\u0637\u0642\u0629 \u0646\u0635 \u0645\u0646\u0633\u0642. \u0627\u0636\u063a\u0637 ALT-F9 \u0644\u0644\u0642\u0627\u0626\u0645\u0629. \u0627\u0636\u063a\u0637 ALT-F10 \u0644\u0634\u0631\u064a\u0637 \u0627\u0644\u0623\u062f\u0648\u0627\u062a. \u0627\u0636\u063a\u0637 ALT-0 \u0644\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0633\u0627\u0639\u062f\u0629",
|
||||
"Image title": "\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0635\u0648\u0631\u0629",
|
||||
"Border width": "\u0639\u0631\u0636 \u0627\u0644\u062d\u062f",
|
||||
"Border style": "\u0646\u0645\u0637 \u0627\u0644\u062d\u062f",
|
||||
"Error": "\u062e\u0637\u0623",
|
||||
"Warn": "\u062a\u062d\u0630\u064a\u0631",
|
||||
"Valid": "\u0635\u062d\u064a\u062d",
|
||||
"To open the popup, press Shift+Enter": "\u0644\u0641\u062a\u062d \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0646\u0628\u062b\u0642\u0629\u060c \u0627\u0636\u063a\u0637 \u0639\u0644\u0649 Shift\u200f+Enter",
|
||||
"Rich Text Area. Press ALT-0 for help.": "\u0645\u0646\u0637\u0642\u0629 \u0646\u0635 \u0645\u0646\u0633\u0642. \u0627\u0636\u063a\u0637 ALT-0 \u0644\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629.",
|
||||
"System Font": "\u062e\u0637 \u0627\u0644\u0646\u0638\u0627\u0645",
|
||||
"Failed to upload image: {0}": "\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0635\u0648\u0631\u0629: {0}",
|
||||
"Failed to load plugin: {0} from url {1}": "\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0645\u0643\u0648\u0651\u0650\u0646 \u0627\u0644\u0625\u0636\u0627\u0641\u064a: {0} \u0645\u0646 url \u200f{1}",
|
||||
"Failed to load plugin url: {0}": "\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 url \u0644\u0644\u0645\u0643\u0648\u0651\u0650\u0646 \u0627\u0644\u0625\u0636\u0627\u0641\u064a: {0}",
|
||||
"Failed to initialize plugin: {0}": "\u0641\u0634\u0644\u062a \u062a\u0647\u064a\u0626\u0629 \u0627\u0644\u0645\u0643\u0648\u0651\u0650\u0646 \u0627\u0644\u0625\u0636\u0627\u0641\u064a: {0}",
|
||||
"example": "\u0645\u062b\u0627\u0644",
|
||||
"Search": "\u0628\u062d\u062b",
|
||||
"All": "\u0627\u0644\u0643\u0644",
|
||||
"Currency": "\u0627\u0644\u0639\u0645\u0644\u0629",
|
||||
"Text": "\u0627\u0644\u0646\u0635",
|
||||
"Quotations": "\u0639\u0631\u0648\u0636 \u0627\u0644\u0623\u0633\u0639\u0627\u0631",
|
||||
"Mathematical": "\u0631\u064a\u0627\u0636\u064a\u0629",
|
||||
"Extended Latin": "\u0627\u0644\u0644\u0627\u062a\u064a\u0646\u064a\u0629 \u0627\u0644\u0645\u0648\u0633\u0639\u0629",
|
||||
"Symbols": "\u0627\u0644\u0631\u0645\u0648\u0632",
|
||||
"Arrows": "\u0627\u0644\u0623\u0633\u0647\u0645",
|
||||
"User Defined": "\u0645\u0639\u0631\u0651\u064e\u0641 \u0645\u0646 \u0642\u0628\u0644 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645",
|
||||
"dollar sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062f\u0648\u0644\u0627\u0631",
|
||||
"currency sign": "\u0639\u0644\u0627\u0645\u0629 \u0639\u0645\u0644\u0629",
|
||||
"euro-currency sign": "\u0639\u0644\u0627\u0645\u0629 \u0639\u0645\u0644\u0629 \u0627\u0644\u064a\u0648\u0631\u0648",
|
||||
"colon sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0646\u0642\u0637\u062a\u064a\u0646",
|
||||
"cruzeiro sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0643\u0631\u0648\u0632\u064a\u0631\u0648",
|
||||
"french franc sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0641\u0631\u0646\u0643 \u0627\u0644\u0641\u0631\u0646\u0633\u064a",
|
||||
"lira sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0644\u064a\u0631\u0629",
|
||||
"mill sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0644",
|
||||
"naira sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0646\u064a\u0631\u0629",
|
||||
"peseta sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0628\u064a\u0632\u064a\u062a\u0627",
|
||||
"rupee sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0631\u0648\u0628\u064a\u0629",
|
||||
"won sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0648\u0646",
|
||||
"new sheqel sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0634\u064a\u0643\u0644 \u0627\u0644\u062c\u062f\u064a\u062f",
|
||||
"dong sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062f\u0648\u0646\u062c",
|
||||
"kip sign": "\u0639\u0645\u0644\u0629 \u0627\u0644\u0643\u064a\u0628",
|
||||
"tugrik sign": "\u0639\u0645\u0644\u0629 \u0627\u0644\u062a\u0648\u063a\u0631\u064a\u0643",
|
||||
"drachma sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062f\u0631\u0627\u062e\u0645\u0627",
|
||||
"german penny symbol": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0628\u0646\u0633 \u0627\u0644\u0623\u0644\u0645\u0627\u0646\u064a",
|
||||
"peso sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0628\u064a\u0632\u0648",
|
||||
"guarani sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062c\u0648\u0627\u0631\u0627\u0646\u064a",
|
||||
"austral sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0623\u0648\u0633\u062a\u0631\u0627\u0644",
|
||||
"hryvnia sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0647\u0631\u064a\u0641\u0646\u064a\u0627",
|
||||
"cedi sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0633\u064a\u062f\u064a",
|
||||
"livre tournois sign": "\u0639\u0644\u0627\u0645\u0629 \u0644\u064a\u0641\u0631 \u062a\u0648\u0631\u0646\u0648\u064a\u0632",
|
||||
"spesmilo sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0627\u0633\u0628\u064a\u0632\u0645\u0627\u064a\u0644\u0648",
|
||||
"tenge sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062a\u064a\u0646\u062c",
|
||||
"indian rupee sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0631\u0648\u0628\u064a\u0629 \u0627\u0644\u0647\u0646\u062f\u064a\u0629",
|
||||
"turkish lira sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0644\u064a\u0631\u0629 \u0627\u0644\u062a\u0631\u0643\u064a\u0629",
|
||||
"nordic mark sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0646\u0648\u0631\u062f\u0643",
|
||||
"manat sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0627\u0646\u0627\u062a",
|
||||
"ruble sign": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0631\u0648\u0628\u0644",
|
||||
"yen character": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u064a\u0646",
|
||||
"yuan character": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u064a\u0648\u0627\u0646",
|
||||
"yuan character, in hong kong and taiwan": "\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u064a\u0648\u0627\u0646 \u0641\u064a \u0647\u0648\u0646\u062c \u0643\u0648\u0646\u062c \u0648\u062a\u0627\u064a\u0648\u0627\u0646",
|
||||
"yen\/yuan character variant one": "\u0627\u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0628\u062f\u064a\u0644\u0629 \u0644\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u064a\u0646\/\u0627\u0644\u064a\u0648\u0627\u0646",
|
||||
"Loading emoticons...": "\u062c\u0627\u0631\u064d \u062a\u062d\u0645\u064a\u0644 \u0631\u0645\u0648\u0632 \u0627\u0644\u0645\u0634\u0627\u0639\u0631...",
|
||||
"Could not load emoticons": "\u062c\u0627\u0631\u064d \u062a\u062d\u0645\u064a\u0644 \u0631\u0645\u0648\u0632 \u0627\u0644\u0645\u0634\u0627\u0639\u0631",
|
||||
"People": "\u0623\u0634\u062e\u0627\u0635",
|
||||
"Animals and Nature": "\u0627\u0644\u062d\u064a\u0648\u0627\u0646\u0627\u062a \u0648\u0627\u0644\u0637\u0628\u064a\u0639\u0629",
|
||||
"Food and Drink": "\u0627\u0644\u0623\u0637\u0639\u0645\u0629 \u0648\u0627\u0644\u0645\u0634\u0631\u0648\u0628\u0627\u062a",
|
||||
"Activity": "\u0627\u0644\u0646\u0634\u0627\u0637",
|
||||
"Travel and Places": "\u0627\u0644\u0633\u0641\u0631 \u0648\u0627\u0644\u0623\u0645\u0627\u0643\u0646 \u0633\u064a\u0627\u062d\u064a\u0629",
|
||||
"Objects": "\u0643\u0627\u0626\u0646\u0627\u062a",
|
||||
"Flags": "\u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062a",
|
||||
"Characters": "\u0627\u0644\u0623\u062d\u0631\u0641",
|
||||
"Characters (no spaces)": "\u0627\u0644\u0623\u062d\u0631\u0641 (\u062f\u0648\u0646 \u0627\u0644\u0645\u0633\u0627\u0641\u0627\u062a)",
|
||||
"{0} characters": "{0} \u0631\u0645\u0648\u0632",
|
||||
"Error: Form submit field collision.": "\u062e\u0637\u0623: \u062a\u0636\u0627\u0631\u0628 \u0641\u064a \u062d\u0642\u0644 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c.",
|
||||
"Error: No form element found.": "\u0627\u0644\u062e\u0637\u0623: \u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0639\u0646\u0635\u0631 \u0646\u0645\u0648\u0630\u062c.",
|
||||
"Update": "\u062a\u062d\u062f\u064a\u062b",
|
||||
"Color swatch": "\u0639\u064a\u0646\u0627\u062a \u0627\u0644\u0623\u0644\u0648\u0627\u0646",
|
||||
"Turquoise": "\u0641\u064a\u0631\u0648\u0632\u064a",
|
||||
"Green": "\u0623\u062e\u0636\u0631",
|
||||
"Blue": "\u0623\u0632\u0631\u0642",
|
||||
"Purple": "\u0628\u0646\u0641\u0633\u062c\u064a",
|
||||
"Navy Blue": "\u0623\u0632\u0631\u0642 \u0646\u064a\u0644\u064a",
|
||||
"Dark Turquoise": "\u0641\u064a\u0631\u0648\u0632\u064a \u062f\u0627\u0643\u0646",
|
||||
"Dark Green": "\u0623\u062e\u0636\u0631 \u062f\u0627\u0643\u0646",
|
||||
"Medium Blue": "\u0623\u0632\u0631\u0642 \u0645\u062a\u0648\u0633\u0637",
|
||||
"Medium Purple": "\u0628\u0646\u0641\u0633\u062c\u064a \u0645\u062a\u0648\u0633\u0637",
|
||||
"Midnight Blue": "\u0623\u0632\u0631\u0642 \u062f\u0627\u0643\u0646 \u062c\u062f\u0627\u064b",
|
||||
"Yellow": "\u0623\u0635\u0641\u0631",
|
||||
"Orange": "\u0628\u0631\u062a\u0642\u0627\u0644\u064a",
|
||||
"Red": "\u0623\u062d\u0645\u0631",
|
||||
"Light Gray": "\u0631\u0645\u0627\u062f\u064a \u0641\u0627\u062a\u062d",
|
||||
"Gray": "\u0631\u0645\u0627\u062f\u064a",
|
||||
"Dark Yellow": "\u0623\u0635\u0641\u0631 \u062f\u0627\u0643\u0646",
|
||||
"Dark Orange": "\u0628\u0631\u062a\u0642\u0627\u0644\u064a \u062f\u0627\u0643\u0646",
|
||||
"Dark Red": "\u0623\u062d\u0645\u0631 \u062f\u0627\u0643\u0646",
|
||||
"Medium Gray": "\u0631\u0645\u0627\u062f\u064a \u0645\u062a\u0648\u0633\u0637",
|
||||
"Dark Gray": "\u0631\u0645\u0627\u062f\u064a \u062f\u0627\u0643\u0646",
|
||||
"Light Green": "\u0623\u062e\u0636\u0631 \u0641\u0627\u062a\u062d",
|
||||
"Light Yellow": "\u0623\u0635\u0641\u0631 \u0641\u0627\u062a\u062d",
|
||||
"Light Red": "\u0623\u062d\u0645\u0631 \u0641\u0627\u062a\u062d",
|
||||
"Light Purple": "\u0628\u0646\u0641\u0633\u062c\u064a \u0641\u0627\u062a\u062d",
|
||||
"Light Blue": "\u0623\u0632\u0631\u0642 \u0641\u0627\u062a\u062d",
|
||||
"Dark Purple": "\u0623\u0631\u062c\u0648\u0627\u0646\u064a \u062f\u0627\u0643\u0646",
|
||||
"Dark Blue": "\u0623\u0632\u0631\u0642 \u062f\u0627\u0643\u0646",
|
||||
"Black": "\u0623\u0633\u0648\u062f",
|
||||
"White": "\u0623\u0628\u064a\u0636",
|
||||
"Switch to or from fullscreen mode": "\u0627\u0644\u062a\u0628\u062f\u064a\u0644 \u0625\u0644\u0649 \u0623\u0648 \u0645\u0646 \u0648\u0636\u0639 \u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
|
||||
"Open help dialog": "\u0627\u0641\u062a\u062d \u062d\u0648\u0627\u0631 \u0627\u0644\u062a\u0639\u0644\u064a\u0645\u0627\u062a",
|
||||
"history": "\u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a",
|
||||
"styles": "\u0627\u0644\u0623\u0646\u0645\u0627\u0637",
|
||||
"formatting": "\u062a\u0646\u0633\u064a\u0642",
|
||||
"alignment": "\u0645\u062d\u0627\u0630\u0627\u0629",
|
||||
"indentation": "\u0645\u0633\u0627\u0641\u0629 \u0628\u0627\u062f\u0626\u0629",
|
||||
"permanent pen": "\u0642\u0644\u0645 \u062b\u0627\u0628\u062a",
|
||||
"comments": "\u0627\u0644\u062a\u0639\u0644\u064a\u0642\u0627\u062a",
|
||||
"Format Painter": "\u0646\u0627\u0633\u062e \u0627\u0644\u062a\u0646\u0633\u064a\u0642",
|
||||
"Insert\/edit iframe": "\u0625\u062f\u0631\u0627\u062c\/\u062a\u062d\u0631\u064a\u0631 \u0625\u0637\u0627\u0631 \u0645\u062f\u0645\u062c",
|
||||
"Capitalization": "\u0643\u062a\u0627\u0628\u0629 \u0628\u0627\u0644\u0623\u062d\u0631\u0641 \u0627\u0644\u0643\u0628\u064a\u0631\u0629",
|
||||
"lowercase": "\u0623\u062d\u0631\u0641 \u0635\u063a\u064a\u0631\u0629",
|
||||
"UPPERCASE": "\u0623\u062d\u0631\u0641 \u0643\u0628\u064a\u0631\u0629",
|
||||
"Title Case": "\u062d\u0627\u0644\u0629 \u0623\u062d\u0631\u0641 \u0627\u0644\u0639\u0646\u0648\u0627\u0646",
|
||||
"Permanent Pen Properties": "\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0642\u0644\u0645 \u0627\u0644\u062b\u0627\u0628\u062a",
|
||||
"Permanent pen properties...": "\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0642\u0644\u0645 \u0627\u0644\u062b\u0627\u0628\u062a...",
|
||||
"Font": "\u0627\u0644\u062e\u0637",
|
||||
"Size": "\u0627\u0644\u062d\u062c\u0645",
|
||||
"More...": "\u0627\u0644\u0645\u0632\u064a\u062f...",
|
||||
"Spellcheck Language": "\u0644\u063a\u0629 \u0627\u0644\u062a\u062f\u0642\u064a\u0642 \u0627\u0644\u0625\u0645\u0644\u0627\u0626\u064a",
|
||||
"Select...": "\u062a\u062d\u062f\u064a\u062f...",
|
||||
"Preferences": "\u0627\u0644\u062a\u0641\u0636\u064a\u0644\u0627\u062a",
|
||||
"Yes": "\u0646\u0639\u0645",
|
||||
"No": "\u0644\u0627",
|
||||
"Keyboard Navigation": "\u0627\u0644\u062a\u0646\u0642\u0644 \u0628\u0648\u0627\u0633\u0637\u0629 \u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d",
|
||||
"Version": "\u0627\u0644\u0625\u0635\u062f\u0627\u0631",
|
||||
"Anchor": "\u0645\u0631\u0633\u0627\u0629",
|
||||
"Special character": "\u0631\u0645\u0632",
|
||||
"Code sample": "\u0639\u064a\u0651\u0646\u0629 \u0639\u0646 \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0628\u0631\u0645\u062c\u064a",
|
||||
"Color": "\u0627\u0644\u0644\u0648\u0646",
|
||||
"Emoticons": "\u0627\u0644\u0631\u0645\u0648\u0632",
|
||||
"Document properties": "\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0645\u0633\u062a\u0646\u062f",
|
||||
"Image": "\u0627\u0644\u0635\u0648\u0631\u0629",
|
||||
"Insert link": "\u0625\u062f\u0631\u0627\u062c \u0631\u0627\u0628\u0637",
|
||||
"Target": "\u0627\u0644\u0625\u0637\u0627\u0631 \u0627\u0644\u0647\u062f\u0641",
|
||||
"Link": "\u0627\u0644\u0631\u0627\u0628\u0637",
|
||||
"Poster": "\u0645\u0644\u0635\u0642",
|
||||
"Media": "\u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u062a\u0639\u062f\u062f\u0629",
|
||||
"Print": "\u0637\u0628\u0627\u0639\u0629",
|
||||
"Prev": "\u0627\u0644\u0633\u0627\u0628\u0642",
|
||||
"Find and replace": "\u0628\u062d\u062b \u0648\u0627\u0633\u062a\u0628\u062f\u0627\u0644",
|
||||
"Whole words": "\u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0644\u0643\u0644\u0645\u0627\u062a \u0628\u0627\u0644\u0643\u0627\u0645\u0644",
|
||||
"Spellcheck": "\u062a\u062f\u0642\u064a\u0642 \u0625\u0645\u0644\u0627\u0626\u064a",
|
||||
"Caption": "\u0634\u0631\u062d",
|
||||
"Insert template": "\u0625\u062f\u0631\u0627\u062c \u0642\u0627\u0644\u0628",
|
||||
"_dir": "rtl"
|
||||
});
|
||||
@@ -0,0 +1,419 @@
|
||||
tinymce.addI18n('bg_BG',{
|
||||
"Redo": "\u041e\u0442\u043c\u0435\u043d\u044f\u043d\u0435",
|
||||
"Undo": "\u0412\u0440\u044a\u0449\u0430\u043d\u0435",
|
||||
"Cut": "\u0418\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435",
|
||||
"Copy": "\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435",
|
||||
"Paste": "\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435",
|
||||
"Select all": "\u041c\u0430\u0440\u043a\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0446\u044f\u043b\u043e\u0442\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435",
|
||||
"New document": "\u041d\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442",
|
||||
"Ok": "\u0414\u043e\u0431\u0440\u0435",
|
||||
"Cancel": "\u041e\u0442\u043a\u0430\u0437",
|
||||
"Visual aids": "\u0412\u0438\u0437\u0443\u0430\u043b\u043d\u043e \u043e\u0442\u043a\u0440\u043e\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0438 \u0431\u0435\u0437 \u043a\u0430\u043d\u0442\u043e\u0432\u0435 (\u0440\u0430\u043c\u043a\u0438)",
|
||||
"Bold": "\u0423\u0434\u0435\u0431\u0435\u043b\u0435\u043d (\u043f\u043e\u043b\u0443\u0447\u0435\u0440)",
|
||||
"Italic": "\u041d\u0430\u043a\u043b\u043e\u043d\u0435\u043d (\u043a\u0443\u0440\u0441\u0438\u0432)",
|
||||
"Underline": "\u041f\u043e\u0434\u0447\u0435\u0440\u0442\u0430\u0432\u0430\u043d\u0435",
|
||||
"Strikethrough": "\u0417\u0430\u0447\u0435\u0440\u0442\u0430\u0432\u0430\u043d\u0435",
|
||||
"Superscript": "\u0413\u043e\u0440\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441",
|
||||
"Subscript": "\u0414\u043e\u043b\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441",
|
||||
"Clear formatting": "\u0418\u0437\u0447\u0438\u0441\u0442\u0432\u0430\u043d\u0435 \u043d\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435\u0442\u043e",
|
||||
"Align left": "\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435 \u043e\u0442\u043b\u044f\u0432\u043e",
|
||||
"Align center": "\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u0430\u043d\u0435",
|
||||
"Align right": "\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435 \u043e\u0442\u0434\u044f\u0441\u043d\u043e",
|
||||
"Justify": "\u0414\u0432\u0443\u0441\u0442\u0440\u0430\u043d\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",
|
||||
"Bullet list": "\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u0432\u043e\u0434\u0430\u0447\u0438",
|
||||
"Numbered list": "\u041d\u043e\u043c\u0435\u0440\u0438\u0440\u0430\u043d \u0441\u043f\u0438\u0441\u044a\u043a",
|
||||
"Decrease indent": "\u041d\u0430\u043c\u0430\u043b\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043e\u0442\u0441\u0442\u044a\u043f\u0430",
|
||||
"Increase indent": "\u0423\u0432\u0435\u043b\u0438\u0447\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u043e\u0442\u0441\u0442\u044a\u043f\u0430",
|
||||
"Close": "\u0417\u0430\u0442\u0432\u0430\u0440\u044f\u043d\u0435",
|
||||
"Formats": "\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0412\u0430\u0448\u0438\u044f\u0442 \u0431\u0440\u0430\u0443\u0437\u044a\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u044a\u0440\u0436\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u0435\u043d \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e \u043a\u043b\u0438\u043f\u0431\u043e\u0440\u0434\u0430. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0432\u0430 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u043d\u0438\u0442\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 Ctrl+X (\u0437\u0430 \u0438\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435), Ctrl+C (\u0437\u0430 \u043a\u043e\u043f\u0438\u0440\u0430\u043d\u0435) \u0438 Ctrl+V (\u0437\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435).",
|
||||
"Headers": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u044f",
|
||||
"Header 1": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 1",
|
||||
"Header 2": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 2",
|
||||
"Header 3": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 3",
|
||||
"Header 4": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 4",
|
||||
"Header 5": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 5",
|
||||
"Header 6": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 6",
|
||||
"Headings": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u044f",
|
||||
"Heading 1": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 1",
|
||||
"Heading 2": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 2",
|
||||
"Heading 3": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 3",
|
||||
"Heading 4": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 4",
|
||||
"Heading 5": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 5",
|
||||
"Heading 6": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 6",
|
||||
"Preformatted": "\u041f\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d",
|
||||
"Div": "\u0411\u043b\u043e\u043a",
|
||||
"Pre": "\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u043d\u043e \u043e\u0444\u043e\u0440\u043c\u0435\u043d \u0442\u0435\u043a\u0441\u0442",
|
||||
"Code": "\u041a\u043e\u0434",
|
||||
"Paragraph": "\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444",
|
||||
"Blockquote": "\u0426\u0438\u0442\u0430\u0442",
|
||||
"Inline": "\u041d\u0430 \u0435\u0434\u0438\u043d \u0440\u0435\u0434",
|
||||
"Blocks": "\u0411\u043b\u043e\u043a\u043e\u0432\u0435",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0435 \u0432 \u043e\u0431\u0438\u043a\u043d\u043e\u0432\u0435\u043d \u0440\u0435\u0436\u0438\u043c. \u0421\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e \u0449\u0435 \u0431\u044a\u0434\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0435\u043d\u043e \u043a\u0430\u0442\u043e \u043d\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d \u0442\u0435\u043a\u0441\u0442, \u0434\u043e\u043a\u0430\u0442\u043e \u0438\u0437\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0442\u0430\u0437\u0438 \u043e\u043f\u0446\u0438\u044f.",
|
||||
"Fonts": "\u0428\u0440\u0438\u0444\u0442\u043e\u0432\u0435",
|
||||
"Font Sizes": "\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u0448\u0440\u0438\u0444\u0442\u0430",
|
||||
"Class": "\u041a\u043b\u0430\u0441",
|
||||
"Browse for an image": "\u041f\u043e\u0442\u044a\u0440\u0441\u0435\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",
|
||||
"OR": "\u0418\u041b\u0418",
|
||||
"Drop an image here": "\u041f\u0443\u0441\u043d\u0435\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u0442\u0443\u043a",
|
||||
"Upload": "\u041a\u0430\u0447\u0432\u0430\u043d\u0435",
|
||||
"Block": "\u0411\u043b\u043e\u043a",
|
||||
"Align": "\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",
|
||||
"Default": "\u041f\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043d\u0435",
|
||||
"Circle": "\u041e\u043a\u0440\u044a\u0436\u043d\u043e\u0441\u0442\u0438",
|
||||
"Disc": "\u041a\u0440\u044a\u0433\u0447\u0435\u0442\u0430",
|
||||
"Square": "\u0417\u0430\u043f\u044a\u043b\u043d\u0435\u043d\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438",
|
||||
"Lower Alpha": "\u041c\u0430\u043b\u043a\u0438 \u0431\u0443\u043a\u0432\u0438",
|
||||
"Lower Greek": "\u041c\u0430\u043b\u043a\u0438 \u0433\u0440\u044a\u0446\u043a\u0438 \u0431\u0443\u043a\u0432\u0438",
|
||||
"Lower Roman": "\u0420\u0438\u043c\u0441\u043a\u0438 \u0447\u0438\u0441\u043b\u0430 \u0441 \u043c\u0430\u043b\u043a\u0438 \u0431\u0443\u043a\u0432\u0438",
|
||||
"Upper Alpha": "\u0413\u043b\u0430\u0432\u043d\u0438 \u0431\u0443\u043a\u0432\u0438",
|
||||
"Upper Roman": "\u0420\u0438\u043c\u0441\u043a\u0438 \u0447\u0438\u0441\u043b\u0430 \u0441 \u0433\u043b\u0430\u0432\u043d\u0438 \u0431\u0443\u043a\u0432\u0438",
|
||||
"Anchor...": "\u041a\u043e\u0442\u0432\u0430...",
|
||||
"Name": "\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435",
|
||||
"Id": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (id)",
|
||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 (id) \u0442\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0437\u0430\u043f\u043e\u0447\u0432\u0430 \u0441 \u0431\u0443\u043a\u0432\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u0432\u0430\u043d \u043e\u0442 \u0431\u0443\u043a\u0432\u0438, \u0447\u0438\u0444\u0440\u0438, \u0442\u0438\u0440\u0435\u0442\u0430, \u0442\u043e\u0447\u043a\u0438, \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435 \u0438 \u0434\u043e\u043b\u043d\u043e \u0442\u0438\u0440\u0435.",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "\u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u043c\u0430 \u043d\u0435\u0437\u0430\u043f\u0430\u0437\u0435\u043d\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438. \u0429\u0435 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u043b\u0438?",
|
||||
"Restore last draft": "\u0412\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0430\u0442\u0430 \u0447\u0435\u0440\u043d\u043e\u0432\u0430",
|
||||
"Special character...": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0435\u043d \u0441\u0438\u043c\u0432\u043e\u043b...",
|
||||
"Source code": "\u0418\u0437\u0445\u043e\u0434\u0435\u043d \u043a\u043e\u0434 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 HTML",
|
||||
"Insert\/Edit code sample": "\u0412\u043c\u044a\u043a\u043d\u0438\/ \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u0435\u043d \u043a\u043e\u0434",
|
||||
"Language": "\u0415\u0437\u0438\u043a",
|
||||
"Code sample...": "\u041f\u0440\u0438\u043c\u0435\u0440\u0435\u043d \u043a\u043e\u0434...",
|
||||
"Color Picker": "\u0418\u0437\u0431\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0446\u0432\u044f\u0442",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"B": "B",
|
||||
"Left to right": "\u041e\u0442\u043b\u044f\u0432\u043e \u043d\u0430\u0434\u044f\u0441\u043d\u043e",
|
||||
"Right to left": "\u041e\u0442\u0434\u044f\u0441\u043d\u043e \u043d\u0430\u043b\u044f\u0432\u043e",
|
||||
"Emoticons...": "\u0415\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438...",
|
||||
"Metadata and Document Properties": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u0438 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430",
|
||||
"Title": "\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435",
|
||||
"Keywords": "\u041a\u043b\u044e\u0447\u043e\u0432\u0438 \u0434\u0443\u043c\u0438",
|
||||
"Description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",
|
||||
"Robots": "\u0420\u043e\u0431\u043e\u0442\u0438 \u043d\u0430 \u0443\u0435\u0431 \u0442\u044a\u0440\u0441\u0430\u0447\u043a\u0438",
|
||||
"Author": "\u0410\u0432\u0442\u043e\u0440",
|
||||
"Encoding": "\u041a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0437\u043d\u0430\u0446\u0438\u0442\u0435",
|
||||
"Fullscreen": "\u041d\u0430 \u0446\u044f\u043b \u0435\u043a\u0440\u0430\u043d",
|
||||
"Action": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435",
|
||||
"Shortcut": "\u0411\u044a\u0440\u0437 \u043a\u043b\u0430\u0432\u0438\u0448",
|
||||
"Help": "\u041f\u043e\u043c\u043e\u0449",
|
||||
"Address": "\u0410\u0434\u0440\u0435\u0441",
|
||||
"Focus to menubar": "Focus to menubar",
|
||||
"Focus to toolbar": "Focus to toolbar",
|
||||
"Focus to element path": "Focus to element path",
|
||||
"Focus to contextual toolbar": "Focus to contextual toolbar",
|
||||
"Insert link (if link plugin activated)": "\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0432\u0440\u044a\u0437\u043a\u0430 (\u0430\u043a\u043e \u043f\u043b\u044a\u0433\u0438\u043d\u0430 \u0437\u0430 \u0432\u0440\u044a\u0437\u043a\u0438 \u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d)",
|
||||
"Save (if save plugin activated)": "\u0417\u0430\u043f\u0438\u0448\u0438 (\u0430\u043a\u043e \u043f\u043b\u044a\u0433\u0438\u043d\u0430 \u0437\u0430 \u0437\u0430\u043f\u0438\u0441 \u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d)",
|
||||
"Find (if searchreplace plugin activated)": "\u041d\u0430\u043c\u0435\u0440\u0438 (\u0430\u043a\u043e \u043f\u043b\u044a\u0433\u0438\u043d\u0430 \u0437\u0430 \u0442\u044a\u0440\u0441\u0435\u043d\u0435\/\u0437\u0430\u043c\u044f\u043d\u0430 \u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d)",
|
||||
"Plugins installed ({0}):": "\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0438 \u043f\u043b\u044a\u0433\u0438\u043d\u0438 ({0}):",
|
||||
"Premium plugins:": "\u041f\u0440\u0435\u043c\u0438\u0439\u043d\u0438 \u043f\u043b\u044a\u0433\u0438\u043d\u0438:",
|
||||
"Learn more...": "\u041d\u0430\u0443\u0447\u0435\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435...",
|
||||
"You are using {0}": "\u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 {0}",
|
||||
"Plugins": "Plugins",
|
||||
"Handy Shortcuts": "Handy Shortcuts",
|
||||
"Horizontal line": "\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u0430 \u0447\u0435\u0440\u0442\u0430",
|
||||
"Insert\/edit image": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u043a\u043e\u0440\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",
|
||||
"Image description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e",
|
||||
"Source": "\u0410\u0434\u0440\u0435\u0441",
|
||||
"Dimensions": "\u0420\u0430\u0437\u043c\u0435\u0440",
|
||||
"Constrain proportions": "\u0417\u0430\u0432\u0430\u0437\u043d\u0430\u0432\u0435 \u043d\u0430 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438\u0442\u0435",
|
||||
"General": "\u041e\u0431\u0449\u043e",
|
||||
"Advanced": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e",
|
||||
"Style": "\u0421\u0442\u0438\u043b",
|
||||
"Vertical space": "\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e",
|
||||
"Horizontal space": "\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e",
|
||||
"Border": "\u041a\u0430\u043d\u0442 (\u0440\u0430\u043c\u043a\u0430)",
|
||||
"Insert image": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",
|
||||
"Image...": "\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435...",
|
||||
"Image list": "\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438",
|
||||
"Rotate counterclockwise": "\u0417\u0430\u0432\u044a\u0440\u0442\u0430\u043d\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u043d\u0438\u043a\u0430",
|
||||
"Rotate clockwise": "\u0417\u0430\u0432\u044a\u0440\u0442\u0430\u043d\u0435 \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043d\u0438\u043a\u0430",
|
||||
"Flip vertically": "\u041e\u0431\u044a\u0440\u043d\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e",
|
||||
"Flip horizontally": "\u041e\u0431\u044a\u0440\u043d\u0438 \u0445\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e",
|
||||
"Edit image": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e",
|
||||
"Image options": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e",
|
||||
"Zoom in": "\u041f\u0440\u0438\u0431\u043b\u0438\u0436\u0438",
|
||||
"Zoom out": "\u041e\u0442\u0434\u0430\u043b\u0435\u0447\u0438",
|
||||
"Crop": "\u0418\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435",
|
||||
"Resize": "\u041f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435",
|
||||
"Orientation": "\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f",
|
||||
"Brightness": "\u042f\u0440\u043a\u043e\u0441\u0442",
|
||||
"Sharpen": "\u0418\u0437\u043e\u0441\u0442\u0440\u044f\u043d\u0435",
|
||||
"Contrast": "\u041a\u043e\u043d\u0442\u0440\u0430\u0441\u0442",
|
||||
"Color levels": "\u0426\u0432\u0435\u0442\u043d\u0438 \u043d\u0438\u0432\u0430",
|
||||
"Gamma": "\u0413\u0430\u043c\u0430",
|
||||
"Invert": "\u0418\u043d\u0432\u0435\u0440\u0441\u0438\u044f",
|
||||
"Apply": "\u041f\u0440\u0438\u043b\u043e\u0436\u0438",
|
||||
"Back": "\u041d\u0430\u0437\u0430\u0434",
|
||||
"Insert date\/time": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0434\u0430\u0442\u0430\/\u0447\u0430\u0441",
|
||||
"Date\/time": "\u0414\u0430\u0442\u0430\/\u0447\u0430\u0441",
|
||||
"Insert\/Edit Link": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 (\u043b\u0438\u043d\u043a)",
|
||||
"Insert\/edit link": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u043a\u043e\u0440\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 (\u043b\u0438\u043d\u043a)",
|
||||
"Text to display": "\u0422\u0435\u043a\u0441\u0442",
|
||||
"Url": "\u0410\u0434\u0440\u0435\u0441 (URL)",
|
||||
"Open link in...": "\u041e\u0442\u0432\u0430\u0440\u044f\u043d\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 \u0432...",
|
||||
"Current window": "\u0422\u0435\u043a\u0443\u0449 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446",
|
||||
"None": "\u0411\u0435\u0437",
|
||||
"New window": "\u0412 \u043d\u043e\u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 (\u043f\u043e\u0434\u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446)",
|
||||
"Remove link": "\u041f\u0440\u0435\u043c\u0430\u0445\u0432\u0430\u043d\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430",
|
||||
"Anchors": "\u041a\u043e\u0442\u0432\u0438",
|
||||
"Link...": "\u0425\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430...",
|
||||
"Paste or type a link": "\u041f\u043e\u0441\u0442\u0430\u0432\u0435\u0442\u0435 \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u0442\u0435 \u0432\u0440\u044a\u0437\u043a\u0430(\u043b\u0438\u043d\u043a)",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "URL \u0430\u0434\u0440\u0435\u0441\u044a\u0442, \u043a\u043e\u0439\u0442\u043e \u0432\u044a\u0432\u0434\u043e\u0445\u0442\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u0430 \u043d\u0430 \u0435-\u043c\u0435\u0439\u043b \u0430\u0434\u0440\u0435\u0441. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0438\u044f mailto: \u043f\u0440\u0435\u0444\u0438\u043a\u0441?",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "URL \u0430\u0434\u0440\u0435\u0441\u044a\u0442, \u043a\u043e\u0439\u0442\u043e \u0432\u044a\u0432\u0434\u043e\u0445\u0442\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u0430 \u0432\u044a\u043d\u0448\u0435\u043d \u0430\u0434\u0440\u0435\u0441. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0438\u044f http:\/\/ \u043f\u0440\u0435\u0444\u0438\u043a\u0441?",
|
||||
"Link list": "\u0421\u043f\u0438\u0441\u044a\u043a \u0441 \u0432\u0440\u044a\u0437\u043a\u0438",
|
||||
"Insert video": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e",
|
||||
"Insert\/edit video": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u043a\u043e\u0440\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u0432\u0438\u0434\u0435\u043e",
|
||||
"Insert\/edit media": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043c\u0435\u0434\u0438\u044f",
|
||||
"Alternative source": "\u0410\u043b\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0435\u043d \u0430\u0434\u0440\u0435\u0441",
|
||||
"Alternative source URL": "\u0410\u043b\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0435\u043d \u0430\u0434\u0440\u0435\u0441 URL",
|
||||
"Media poster (Image URL)": "\u041c\u0435\u0434\u0438\u0435\u043d \u043f\u043b\u0430\u043a\u0430\u0442 (\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 URL)",
|
||||
"Paste your embed code below:": "\u041f\u043e\u0441\u0442\u0430\u0432\u0435\u0442\u0435 \u043a\u043e\u0434\u0430 \u0437\u0430 \u0432\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435 \u0432 \u043f\u043e\u043b\u0435\u0442\u043e \u043f\u043e-\u0434\u043e\u043b\u0443:",
|
||||
"Embed": "\u0412\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435",
|
||||
"Media...": "\u041c\u0435\u0434\u0438\u044f...",
|
||||
"Nonbreaking space": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b",
|
||||
"Page break": "\u041d\u043e\u0432\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430",
|
||||
"Paste as text": "\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043a\u0430\u0442\u043e \u0442\u0435\u043a\u0441\u0442",
|
||||
"Preview": "\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u0435\u043d \u0438\u0437\u0433\u043b\u0435\u0434",
|
||||
"Print...": "\u041e\u0442\u043f\u0435\u0447\u0430\u0442\u0432\u0430\u043d\u0435...",
|
||||
"Save": "\u0421\u044a\u0445\u0440\u0430\u043d\u044f\u0432\u0430\u043d\u0435",
|
||||
"Find": "\u0422\u044a\u0440\u0441\u0435\u043d\u0435 \u0437\u0430",
|
||||
"Replace with": "\u0417\u0430\u043c\u044f\u043d\u0430 \u0441",
|
||||
"Replace": "\u0417\u0430\u043c\u044f\u043d\u0430",
|
||||
"Replace all": "\u0417\u0430\u043c\u044f\u043d\u0430 \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u0438 \u0441\u0440\u0435\u0449\u0430\u043d\u0438\u044f",
|
||||
"Previous": "\u041f\u0440\u0435\u0434\u0438\u0448\u0435\u043d",
|
||||
"Next": "\u0421\u043b\u0435\u0434\u0432\u0430\u0449",
|
||||
"Find and replace...": "\u041d\u0430\u043c\u0438\u0440\u0430\u043d\u0435 \u0438 \u0437\u0430\u043c\u044f\u043d\u0430...",
|
||||
"Could not find the specified string.": "\u0422\u044a\u0440\u0441\u0435\u043d\u0438\u044f\u0442 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d.",
|
||||
"Match case": "\u0421\u044a\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u044a\u0440\u0430 (\u043c\u0430\u043b\u043a\u0438\/\u0433\u043b\u0430\u0432\u043d\u0438 \u0431\u0443\u043a\u0432\u0438)",
|
||||
"Find whole words only": "\u0422\u044a\u0440\u0441\u0435\u043d\u0435 \u0441\u0430\u043c\u043e \u043d\u0430 \u0446\u0435\u043b\u0438 \u0434\u0443\u043c\u0438",
|
||||
"Spell check": "\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430",
|
||||
"Ignore": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0430\u043d\u0435",
|
||||
"Ignore all": "\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u043e",
|
||||
"Finish": "\u041a\u0440\u0430\u0439",
|
||||
"Add to Dictionary": "\u0414\u043e\u0431\u0430\u0432\u0438 \u0432 \u0440\u0435\u0447\u043d\u0438\u043a\u0430",
|
||||
"Insert table": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430",
|
||||
"Table properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",
|
||||
"Delete table": "\u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",
|
||||
"Cell": "\u041a\u043b\u0435\u0442\u043a\u0430",
|
||||
"Row": "\u0420\u0435\u0434",
|
||||
"Column": "\u041a\u043e\u043b\u043e\u043d\u0430",
|
||||
"Cell properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430",
|
||||
"Merge cells": "\u0421\u043b\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435",
|
||||
"Split cell": "\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u043d\u0435 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430",
|
||||
"Insert row before": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434 \u043f\u0440\u0435\u0434\u0438",
|
||||
"Insert row after": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434 \u0441\u043b\u0435\u0434",
|
||||
"Delete row": "\u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434\u0430",
|
||||
"Row properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0440\u0435\u0434\u0430",
|
||||
"Cut row": "\u0418\u0437\u0440\u044f\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434",
|
||||
"Copy row": "\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434",
|
||||
"Paste row before": "\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434 \u043f\u0440\u0435\u0434\u0438",
|
||||
"Paste row after": "\u041f\u043e\u0441\u0442\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0440\u0435\u0434 \u0441\u043b\u0435\u0434",
|
||||
"Insert column before": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0438",
|
||||
"Insert column after": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u0430 \u0441\u043b\u0435\u0434",
|
||||
"Delete column": "\u0418\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u0430\u0442\u0430",
|
||||
"Cols": "\u041a\u043e\u043b\u043e\u043d\u0438",
|
||||
"Rows": "\u0420\u0435\u0434\u043e\u0432\u0435",
|
||||
"Width": "\u0428\u0438\u0440\u0438\u043d\u0430",
|
||||
"Height": "\u0412\u0438\u0441\u043e\u0447\u0438\u043d\u0430",
|
||||
"Cell spacing": "\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0435\u0442\u043a\u0438\u0442\u0435",
|
||||
"Cell padding": "\u0420\u0430\u0437\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435\u0442\u043e",
|
||||
"Show caption": "\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u043d\u0430\u0434\u043f\u0438\u0441",
|
||||
"Left": "\u041b\u044f\u0432\u043e",
|
||||
"Center": "\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u0430\u043d\u043e",
|
||||
"Right": "\u0414\u044f\u0441\u043d\u043e",
|
||||
"Cell type": "\u0422\u0438\u043f \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430\u0442\u0430",
|
||||
"Scope": "\u041e\u0431\u0445\u0432\u0430\u0442",
|
||||
"Alignment": "\u041f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",
|
||||
"H Align": "\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",
|
||||
"V Align": "\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",
|
||||
"Top": "\u0413\u043e\u0440\u0435",
|
||||
"Middle": "\u041f\u043e \u0441\u0440\u0435\u0434\u0430\u0442\u0430",
|
||||
"Bottom": "\u0414\u043e\u043b\u0443",
|
||||
"Header cell": "\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0430 (\u0430\u043d\u0442\u0435\u0442\u043a\u0430)",
|
||||
"Row group": "Row group",
|
||||
"Column group": "Column group",
|
||||
"Row type": "\u0422\u0438\u043f \u043d\u0430 \u0440\u0435\u0434\u0430",
|
||||
"Header": "\u0413\u043e\u0440\u0435\u043d \u043a\u043e\u043b\u043e\u043d\u0442\u0438\u0442\u0443\u043b (header)",
|
||||
"Body": "\u0421\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435 (body)",
|
||||
"Footer": "\u0414\u043e\u043b\u0435\u043d \u043a\u043e\u043b\u043e\u043d\u0442\u0438\u0442\u0443\u043b (footer)",
|
||||
"Border color": "\u0426\u0432\u044f\u0442 \u043d\u0430 \u0440\u0430\u043c\u043a\u0430\u0442\u0430",
|
||||
"Insert template...": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d...",
|
||||
"Templates": "\u0428\u0430\u0431\u043b\u043e\u043d\u0438",
|
||||
"Template": "\u0428\u0430\u0431\u043b\u043e\u043d",
|
||||
"Text color": "\u0426\u0432\u044f\u0442 \u043d\u0430 \u0448\u0440\u0438\u0444\u0442\u0430",
|
||||
"Background color": "\u0424\u043e\u043d\u043e\u0432 \u0446\u0432\u044f\u0442",
|
||||
"Custom...": "\u0418\u0437\u0431\u0440\u0430\u043d...",
|
||||
"Custom color": "\u0426\u0432\u044f\u0442 \u043f\u043e \u0438\u0437\u0431\u043e\u0440",
|
||||
"No color": "\u0411\u0435\u0437 \u0446\u0432\u044f\u0442",
|
||||
"Remove color": "\u041f\u0440\u0435\u043c\u0430\u0445\u0432\u0430\u043d\u0435 \u043d\u0430 \u0446\u0432\u0435\u0442\u0430",
|
||||
"Table of Contents": "\u0421\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435",
|
||||
"Show blocks": "\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0431\u043b\u043e\u043a\u043e\u0432\u0435\u0442\u0435",
|
||||
"Show invisible characters": "\u041f\u043e\u043a\u0430\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u043d\u0435\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u043c\u0438 \u0437\u043d\u0430\u0446\u0438",
|
||||
"Word count": "\u0411\u0440\u043e\u0435\u043d\u0435 \u043d\u0430 \u0434\u0443\u043c\u0438",
|
||||
"Count": "\u0411\u0440\u043e\u0439",
|
||||
"Document": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442",
|
||||
"Selection": "\u0418\u0437\u0431\u0440\u0430\u043d\u043e",
|
||||
"Words": "\u0414\u0443\u043c\u0438",
|
||||
"Words: {0}": "\u0411\u0440\u043e\u0439 \u0434\u0443\u043c\u0438: {0}",
|
||||
"{0} words": "{0} \u0431\u0440\u043e\u0439 \u0434\u0443\u043c\u0438",
|
||||
"File": "\u0424\u0430\u0439\u043b",
|
||||
"Edit": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0430\u043d\u0435",
|
||||
"Insert": "\u0412\u043c\u044a\u043a\u0432\u0430\u043d\u0435",
|
||||
"View": "\u0418\u0437\u0433\u043b\u0435\u0434",
|
||||
"Format": "\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435",
|
||||
"Table": "\u0422\u0430\u0431\u043b\u0438\u0446\u0430",
|
||||
"Tools": "\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438",
|
||||
"Powered by {0}": "\u0421\u044a\u0437\u0434\u0430\u0434\u0435\u043d\u043e \u0441 {0}",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u041f\u043e\u043b\u0435 \u0437\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d \u0442\u0435\u043a\u0441\u0442. \u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 Alt+F9 \u0437\u0430 \u043c\u0435\u043d\u044e; Alt+F10 \u0437\u0430 \u043b\u0435\u043d\u0442\u0430 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438; Alt+0 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449.",
|
||||
"Image title": "\u0417\u0430\u0433\u043b\u0430\u0432\u0438\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e",
|
||||
"Border width": "\u0428\u0438\u0440\u0438\u043d\u0430 \u043d\u0430 \u0440\u0430\u043c\u043a\u0430\u0442\u0430",
|
||||
"Border style": "\u0421\u0442\u0438\u043b \u043d\u0430 \u0440\u0430\u043c\u043a\u0430\u0442\u0430",
|
||||
"Error": "\u0413\u0440\u0435\u0448\u043a\u0430",
|
||||
"Warn": "\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435",
|
||||
"Valid": "\u0412\u0430\u043b\u0438\u0434\u043d\u043e",
|
||||
"To open the popup, press Shift+Enter": "\u0417\u0430 \u0434\u0430 \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0435 \u0438\u0437\u0441\u043a\u0430\u0447\u0430\u0449\u0438\u044f \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446, \u043d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 Shift+Enter",
|
||||
"Rich Text Area. Press ALT-0 for help.": "\u041f\u043e\u043b\u0435 \u0437\u0430 \u043e\u0431\u043e\u0433\u0430\u0442\u0435\u043d \u0442\u0435\u043a\u0441\u0442. \u041d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 ALT+0 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449.",
|
||||
"System Font": "\u0421\u0438\u0441\u0442\u0435\u043c\u0435\u043d \u0448\u0440\u0438\u0444\u0442",
|
||||
"Failed to upload image: {0}": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u0430\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435: {0}",
|
||||
"Failed to load plugin: {0} from url {1}": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u043f\u043b\u044a\u0433\u0438\u043d {0} \u043e\u0442 URL {1}",
|
||||
"Failed to load plugin url: {0}": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 URL \u043d\u0430 \u043f\u043b\u044a\u0433\u0438\u043d: {0}",
|
||||
"Failed to initialize plugin: {0}": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043f\u043b\u044a\u0433\u0438\u043d: {0}",
|
||||
"example": "\u043f\u0440\u0438\u043c\u0435\u0440",
|
||||
"Search": "\u0422\u044a\u0440\u0441\u0435\u043d\u0435",
|
||||
"All": "\u0412\u0441\u0438\u0447\u043a\u0438",
|
||||
"Currency": "\u0412\u0430\u043b\u0443\u0442\u0430",
|
||||
"Text": "\u0422\u0435\u043a\u0441\u0442",
|
||||
"Quotations": "\u0426\u0438\u0442\u0430\u0442\u0438",
|
||||
"Mathematical": "\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438",
|
||||
"Extended Latin": "\u0420\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438 \u0431\u0443\u043a\u0432\u0438",
|
||||
"Symbols": "\u0421\u0438\u043c\u0432\u043e\u043b\u0438",
|
||||
"Arrows": "\u0421\u0442\u0440\u0435\u043b\u043a\u0438",
|
||||
"User Defined": "\u0417\u0430\u0434\u0430\u0434\u0435\u043d\u0438 \u043e\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f",
|
||||
"dollar sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0434\u043e\u043b\u0430\u0440",
|
||||
"currency sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0432\u0430\u043b\u0443\u0442\u0430",
|
||||
"euro-currency sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0435\u0432\u0440\u043e \u0432\u0430\u043b\u0443\u0442\u0430",
|
||||
"colon sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043a\u043e\u043b\u043e\u043d",
|
||||
"cruzeiro sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e",
|
||||
"french franc sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0444\u0440\u0435\u043d\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a",
|
||||
"lira sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043b\u0438\u0440\u0430",
|
||||
"mill sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043c\u0438\u043b",
|
||||
"naira sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043d\u0430\u0439\u0440\u0430",
|
||||
"peseta sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043f\u0435\u0441\u0435\u0442\u0430",
|
||||
"rupee sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0440\u0443\u043f\u0438\u044f",
|
||||
"won sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0438 \u0432\u043e\u043d",
|
||||
"new sheqel sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043d\u043e\u0432 \u0448\u0435\u043a\u0435\u043b",
|
||||
"dong sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0432\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u0434\u043e\u043d\u0433",
|
||||
"kip sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043b\u0430\u043e\u0441\u043a\u0438 \u043a\u0438\u043f",
|
||||
"tugrik sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043c\u043e\u043d\u0433\u043e\u043b\u0441\u043a\u0438 \u0442\u0443\u0433\u0440\u0438\u043a",
|
||||
"drachma sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0434\u0440\u0430\u0445\u043c\u0430",
|
||||
"german penny symbol": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u0433\u0435\u0440\u043c\u0430\u043d\u0441\u043a\u043e \u043f\u0435\u043d\u0438",
|
||||
"peso sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043f\u0435\u0441\u043e",
|
||||
"guarani sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0433\u0443\u0430\u0440\u0430\u043d\u0438",
|
||||
"austral sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0430\u0443\u0441\u0442\u0440\u0430\u043b",
|
||||
"hryvnia sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0433\u0440\u0438\u0432\u043d\u044f",
|
||||
"cedi sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0441\u0435\u0434\u0438",
|
||||
"livre tournois sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043b\u0438\u0432\u0440 \u0442\u0443\u0440\u043d\u0443\u0430",
|
||||
"spesmilo sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0441\u043f\u0435\u0441\u043c\u0438\u043b\u043e",
|
||||
"tenge sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0442\u0435\u043d\u0433\u0435",
|
||||
"indian rupee sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f",
|
||||
"turkish lira sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0442\u0443\u0440\u0441\u043a\u0430 \u043b\u0438\u0440\u0430",
|
||||
"nordic mark sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043d\u043e\u0440\u0434\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0430",
|
||||
"manat sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u043c\u0430\u043d\u0430\u0442",
|
||||
"ruble sign": "\u0437\u043d\u0430\u043a \u0437\u0430 \u0440\u0443\u0431\u043b\u0430",
|
||||
"yen character": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u0439\u0435\u043d\u0430",
|
||||
"yuan character": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u044e\u0430\u043d",
|
||||
"yuan character, in hong kong and taiwan": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u044e\u0430\u043d \u0432 \u0425\u043e\u043d\u043a\u043e\u043d\u0433 \u0438 \u0422\u0430\u0439\u0432\u0430\u043d",
|
||||
"yen\/yuan character variant one": "\u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u0439\u0435\u043d\u0430\/\u044e\u0430\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0435\u0434\u043d\u043e",
|
||||
"Loading emoticons...": "\u0417\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0435\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438...",
|
||||
"Could not load emoticons": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0435\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438",
|
||||
"People": "\u0425\u043e\u0440\u0430",
|
||||
"Animals and Nature": "\u0416\u0438\u0432\u043e\u0442\u043d\u0438 \u0438 \u043f\u0440\u0438\u0440\u043e\u0434\u0430",
|
||||
"Food and Drink": "\u0425\u0440\u0430\u043d\u0430 \u0438 \u043d\u0430\u043f\u0438\u0442\u043a\u0438",
|
||||
"Activity": "\u0414\u0435\u0439\u043d\u043e\u0441\u0442\u0438",
|
||||
"Travel and Places": "\u041f\u044a\u0442\u0443\u0432\u0430\u043d\u0435 \u0438 \u043c\u0435\u0441\u0442\u0430",
|
||||
"Objects": "\u041f\u0440\u0435\u0434\u043c\u0435\u0442\u0438",
|
||||
"Flags": "\u0417\u043d\u0430\u043c\u0435\u043d\u0430",
|
||||
"Characters": "\u0421\u0438\u043c\u0432\u043e\u043b\u0438",
|
||||
"Characters (no spaces)": "\u0421\u0438\u043c\u0432\u043e\u043b\u0438 (\u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0438)",
|
||||
"{0} characters": "{0} \u0441\u0438\u043c\u0432\u043e\u043b\u0430",
|
||||
"Error: Form submit field collision.": "\u0413\u0440\u0435\u0448\u043a\u0430: \u041d\u0435\u0441\u044a\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u043f\u043e\u043b\u0435 \u043f\u0440\u0438 \u0438\u0437\u043f\u0440\u0430\u0449\u0430\u043d\u0435 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u044f\u0440.",
|
||||
"Error: No form element found.": "\u0413\u0440\u0435\u0448\u043a\u0430: \u041d\u0435 \u0435 \u043e\u0442\u043a\u0440\u0438\u0442 \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u044f\u0440\u0430.",
|
||||
"Update": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435",
|
||||
"Color swatch": "\u0426\u0432\u0435\u0442\u043d\u0430 \u043c\u043e\u0441\u0442\u0440\u0430",
|
||||
"Turquoise": "\u0422\u044e\u0440\u043a\u043e\u0430\u0437\u0435\u043d\u043e",
|
||||
"Green": "\u0417\u0435\u043b\u0435\u043d\u043e",
|
||||
"Blue": "\u0421\u0438\u043d\u044c\u043e",
|
||||
"Purple": "\u041b\u0438\u043b\u0430\u0432\u043e",
|
||||
"Navy Blue": "\u041c\u043e\u0440\u0441\u043a\u043e\u0441\u0438\u043d\u044c\u043e",
|
||||
"Dark Turquoise": "\u0422\u044a\u043c\u043d\u043e\u0442\u044e\u0440\u043a\u043e\u0430\u0437\u0435\u043d\u043e",
|
||||
"Dark Green": "\u0422\u044a\u043c\u043d\u043e\u0437\u0435\u043b\u0435\u043d\u043e",
|
||||
"Medium Blue": "\u0421\u0440\u0435\u0434\u043d\u043e\u0441\u0438\u043d\u044c\u043e",
|
||||
"Medium Purple": "\u0421\u0440\u0435\u0434\u043d\u043e\u043b\u0438\u043b\u0430\u0432\u043e",
|
||||
"Midnight Blue": "\u0421\u0440\u0435\u0434\u043d\u043e\u0449\u043d\u043e \u0441\u0438\u043d\u044c\u043e",
|
||||
"Yellow": "\u0416\u044a\u043b\u0442\u043e",
|
||||
"Orange": "\u041e\u0440\u0430\u043d\u0436\u0435\u0432\u043e",
|
||||
"Red": "\u0427\u0435\u0440\u0432\u0435\u043d\u043e",
|
||||
"Light Gray": "\u0421\u0432\u0435\u0442\u043b\u043e\u0441\u0438\u0432\u043e",
|
||||
"Gray": "\u0421\u0438\u0432\u043e",
|
||||
"Dark Yellow": "\u0422\u044a\u043c\u043d\u043e\u0436\u044a\u043b\u0442\u043e",
|
||||
"Dark Orange": "\u0422\u044a\u043c\u043d\u043e\u043e\u0440\u0430\u043d\u0436\u0435\u0432\u043e",
|
||||
"Dark Red": "\u0422\u044a\u043c\u043d\u043e\u0447\u0435\u0440\u0432\u0435\u043d\u043e",
|
||||
"Medium Gray": "\u0421\u0440\u0435\u0434\u043d\u043e\u0441\u0438\u0432\u043e",
|
||||
"Dark Gray": "\u0422\u044a\u043c\u043d\u043e\u0441\u0438\u0432\u043e",
|
||||
"Light Green": "\u0421\u0432\u0435\u0442\u043b\u043e\u0437\u0435\u043b\u0435\u043d",
|
||||
"Light Yellow": "\u0421\u0432\u0435\u0442\u043b\u043e\u0436\u044a\u043b\u0442",
|
||||
"Light Red": "\u0421\u0432\u0435\u0442\u043b\u043e\u0447\u0435\u0440\u0432\u0435\u043d",
|
||||
"Light Purple": "\u0421\u0432\u0435\u0442\u043b\u043e\u043b\u0438\u043b\u0430\u0432",
|
||||
"Light Blue": "\u0421\u0432\u0435\u0442\u043b\u043e\u0441\u0438\u043d",
|
||||
"Dark Purple": "\u0422\u044a\u043c\u043d\u043e\u043b\u0438\u043b\u0430\u0432",
|
||||
"Dark Blue": "\u0422\u044a\u043c\u043d\u043e\u0441\u0438\u043d",
|
||||
"Black": "\u0427\u0435\u0440\u043d\u043e",
|
||||
"White": "\u0411\u044f\u043b\u043e",
|
||||
"Switch to or from fullscreen mode": "\u041f\u0440\u0435\u0432\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043a\u044a\u043c \u0438\u043b\u0438 \u043e\u0442 \u0440\u0435\u0436\u0438\u043c \u043d\u0430 \u0446\u044f\u043b \u0435\u043a\u0440\u0430\u043d",
|
||||
"Open help dialog": "\u041e\u0442\u0432\u0430\u0440\u044f\u043d\u0435 \u043d\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0437\u043e\u0440\u0435\u0446 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449",
|
||||
"history": "\u0438\u0441\u0442\u043e\u0440\u0438\u044f",
|
||||
"styles": "\u0441\u0442\u0438\u043b\u043e\u0432\u0435",
|
||||
"formatting": "\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435",
|
||||
"alignment": "\u043f\u043e\u0434\u0440\u0430\u0432\u043d\u044f\u0432\u0430\u043d\u0435",
|
||||
"indentation": "\u043e\u0442\u0441\u0442\u044a\u043f",
|
||||
"permanent pen": "\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430 \u0445\u0438\u043c\u0438\u043a\u0430\u043b\u043a\u0430",
|
||||
"comments": "\u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438",
|
||||
"Format Painter": "\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u043d\u0435\u0442\u043e",
|
||||
"Insert\/edit iframe": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043d\u0435 \u043d\u0430 iframe",
|
||||
"Capitalization": "\u0413\u043b\u0430\u0432\u043d\u0430 \u0431\u0443\u043a\u0432\u0430",
|
||||
"lowercase": "\u043c\u0430\u043b\u043a\u0438 \u0431\u0443\u043a\u0432\u0438",
|
||||
"UPPERCASE": "\u0413\u041e\u041b\u0415\u041c\u0418 \u0411\u0423\u041a\u0412\u0418",
|
||||
"Title Case": "\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u0438 \u0411\u0443\u043a\u0432\u0438",
|
||||
"Permanent Pen Properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u041f\u0435\u0440\u043c\u0430\u043d\u0435\u043d\u0442\u043d\u0438\u044f \u041c\u0430\u0440\u043a\u0435\u0440",
|
||||
"Permanent pen properties...": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u043f\u0435\u0440\u043c\u0430\u043d\u0435\u043d\u0442\u043d\u0438\u044f \u043c\u0430\u0440\u043a\u0435\u0440...",
|
||||
"Font": "\u0428\u0440\u0438\u0444\u0442",
|
||||
"Size": "\u0420\u0430\u0437\u043c\u0435\u0440",
|
||||
"More...": "\u041e\u0449\u0435...",
|
||||
"Spellcheck Language": "\u041f\u0440\u043e\u0432\u0435\u0440\u0438 \u041f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430",
|
||||
"Select...": "\u0418\u0437\u0431\u0435\u0440\u0438...",
|
||||
"Preferences": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u043d\u0438\u044f",
|
||||
"Yes": "\u0414\u0430",
|
||||
"No": "\u041d\u0435",
|
||||
"Keyboard Navigation": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430",
|
||||
"Version": "\u0412\u0435\u0440\u0441\u0438\u044f",
|
||||
"Anchor": "\u041a\u043e\u0442\u0432\u0430 (\u0432\u0440\u044a\u0437\u043a\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430)",
|
||||
"Special character": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0435\u043d \u0437\u043d\u0430\u043a",
|
||||
"Code sample": "\u041f\u0440\u0438\u043c\u0435\u0440\u0435\u043d \u043a\u043e\u0434",
|
||||
"Color": "\u0426\u0432\u044f\u0442",
|
||||
"Emoticons": "\u0415\u043c\u043e\u0442\u0438\u043a\u043e\u043d\u0438",
|
||||
"Document properties": "\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430",
|
||||
"Image": "\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430",
|
||||
"Insert link": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0445\u0438\u043f\u0435\u0440\u0432\u0440\u044a\u0437\u043a\u0430 (\u043b\u0438\u043d\u043a)",
|
||||
"Target": "\u0426\u0435\u043b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430",
|
||||
"Link": "\u0412\u0440\u044a\u0437\u043a\u0430(\u043b\u0438\u043d\u043a)",
|
||||
"Poster": "\u041f\u043e\u0441\u0442\u0435\u0440",
|
||||
"Media": "\u041c\u0435\u0434\u0438\u044f",
|
||||
"Print": "\u041f\u0435\u0447\u0430\u0442",
|
||||
"Prev": "\u041f\u0440\u0435\u0434\u0438\u0448\u0435\u043d",
|
||||
"Find and replace": "\u0422\u044a\u0440\u0441\u0435\u043d\u0435 \u0438 \u0437\u0430\u043c\u044f\u043d\u0430",
|
||||
"Whole words": "\u0421\u0430\u043c\u043e \u0446\u0435\u043b\u0438 \u0434\u0443\u043c\u0438",
|
||||
"Spellcheck": "\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430",
|
||||
"Caption": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435 \u043f\u0440\u0435\u0434\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0442\u0430",
|
||||
"Insert template": "\u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d"
|
||||
});
|
||||
@@ -0,0 +1,419 @@
|
||||
tinymce.addI18n('bn_BD',{
|
||||
"Redo": "\u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u0995\u09b0\u09c1\u09a8",
|
||||
"Undo": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09ac\u09b8\u09cd\u09a5\u09be\u09af\u09bc \u09ab\u09bf\u09b0\u09c1\u09a8",
|
||||
"Cut": "\u0995\u09b0\u09cd\u09a4\u09a8",
|
||||
"Copy": "\u0985\u09a8\u09c1\u0995\u09b0\u09a3",
|
||||
"Paste": "\u09aa\u09cd\u09b0\u09a4\u09bf\u09b2\u09c7\u09aa\u09a8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Select all": "\u09b8\u09ac \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 \u0995\u09b0\u09c1\u09a8",
|
||||
"New document": "\u09a8\u09a4\u09c1\u09a8 \u09a6\u09b8\u09cd\u09a4\u09be\u09ac\u09c7\u099c",
|
||||
"Ok": "\u09a0\u09bf\u0995 \u0986\u099b\u09c7",
|
||||
"Cancel": "\u09ac\u09be\u09a4\u09bf\u09b2",
|
||||
"Visual aids": "\u09ac\u09cd\u09af\u09be\u0996\u09cd\u09af\u09be\u09ae\u09c2\u09b2\u0995 \u09b8\u09be\u09b9\u09be\u09af\u09cd\u09af",
|
||||
"Bold": "\u09b8\u09cd\u09a5\u09c2\u09b2",
|
||||
"Italic": "\u09a4\u09bf\u09b0\u09cd\u09af\u0995",
|
||||
"Underline": "\u09a8\u09bf\u09ae\u09cd\u09a8\u09b0\u09c7\u0996\u09be",
|
||||
"Strikethrough": "\u09b8\u09cd\u099f\u09cd\u09b0\u09be\u0987\u0995\u09a5\u09cd\u09b0\u09c1",
|
||||
"Superscript": "\u098a\u09b0\u09cd\u09a7\u09cd\u09ac\u09b2\u09bf\u09aa\u09bf",
|
||||
"Subscript": "\u09a8\u09bf\u09ae\u09cd\u09a8\u09b2\u09bf\u09aa\u09bf",
|
||||
"Clear formatting": "\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8 \u0985\u09aa\u09b8\u09be\u09b0\u09a3",
|
||||
"Align left": "\u09ac\u09be\u09ae\u09c7 \u09b8\u09be\u09b0\u09bf\u0995\u09b0\u09a3",
|
||||
"Align center": "\u09ae\u09a7\u09cd\u09af\u09b8\u09cd\u09a5\u09be\u09a8\u09c7 \u09b8\u09be\u09b0\u09bf\u0995\u09b0\u09a3",
|
||||
"Align right": "\u09a1\u09be\u09a8\u09c7 \u09b8\u09be\u09b0\u09bf\u0995\u09b0\u09a3",
|
||||
"Justify": "\u0989\u09ad\u09af\u09bc\u09aa\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u09c7 \u09b8\u09ae\u09be\u09a8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Bullet list": "\u09ac\u09c1\u09b2\u09c7\u099f \u09a4\u09be\u09b2\u09bf\u0995\u09be",
|
||||
"Numbered list": "\u09b8\u0982\u0996\u09cd\u09af\u09be\u09af\u09c1\u0995\u09cd\u09a4 \u09a4\u09be\u09b2\u09bf\u0995\u09be",
|
||||
"Decrease indent": "\u0987\u09a8\u09cd\u09a1\u09c7\u09a8\u09cd\u099f \u0995\u09ae\u09be\u09a8",
|
||||
"Increase indent": "\u0987\u09a8\u09cd\u09a1\u09c7\u09a8\u09cd\u099f \u09ac\u09be\u09a1\u09bc\u09be\u09a8",
|
||||
"Close": "\u09ac\u09a8\u09cd\u09a7",
|
||||
"Formats": "\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09cd\u09b0\u09be\u0989\u099c\u09be\u09b0 \u0995\u09cd\u09b2\u09bf\u09aa\u09ac\u09cb\u09b0\u09cd\u09a1 \u09a5\u09c7\u0995\u09c7 \u09b8\u09b0\u09be\u09b8\u09b0\u09bf \u09aa\u09cd\u09b0\u09ac\u09c7\u09b6\u09be\u09a7\u09bf\u0995\u09be\u09b0 \u09b8\u09ae\u09b0\u09cd\u09a5\u09a8 \u0995\u09b0\u09c7 \u09a8\u09be\u0964 \u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u0995\u09c0\u09ac\u09cb\u09b0\u09cd\u09a1 \u09b6\u09b0\u09cd\u099f\u0995\u09be\u099f Ctrl +X\/C\/V \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c1\u09a8\u0964",
|
||||
"Headers": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09b8\u09ae\u09c1\u09b9",
|
||||
"Header 1": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09e7",
|
||||
"Header 2": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09e8",
|
||||
"Header 3": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09e9",
|
||||
"Header 4": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09ea",
|
||||
"Header 5": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09eb",
|
||||
"Header 6": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09ec",
|
||||
"Headings": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae",
|
||||
"Heading 1": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09e7",
|
||||
"Heading 2": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09e8",
|
||||
"Heading 3": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09e9",
|
||||
"Heading 4": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09ea",
|
||||
"Heading 5": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09eb",
|
||||
"Heading 6": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u09ec",
|
||||
"Preformatted": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8\u09bf\u09a4",
|
||||
"Div": "\u09a1\u09bf\u09ad",
|
||||
"Pre": "\u09aa\u09cd\u09b0\u09be\u0995",
|
||||
"Code": "\u09b8\u0982\u0995\u09c7\u09a4\u09b2\u09bf\u09aa\u09bf",
|
||||
"Paragraph": "\u09aa\u09cd\u09af\u09be\u09b0\u09be\u0997\u09cd\u09b0\u09be\u09ab",
|
||||
"Blockquote": "\u09ac\u09cd\u09b2\u0995\u0995\u09cb\u099f",
|
||||
"Inline": "\u09b8\u0999\u09cd\u0997\u09a4\u09bf\u09aa\u09c2\u09b0\u09cd\u09a3\u09ad\u09be\u09ac\u09c7",
|
||||
"Blocks": "\u09b8\u09cd\u09a5\u09c2\u09b2 ",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u09aa\u09c7\u09b8\u09cd\u099f \u098f\u0996\u09a8 \u09aa\u09cd\u09b2\u09c7\u0987\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f \u09ae\u09cb\u09a1\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u098f\u0996\u09a8 \u098f\u0987 \u09ac\u09bf\u0995\u09b2\u09cd\u09aa \u09ac\u09a8\u09cd\u09a7 \u099f\u0997\u09b2 \u09aa\u09b0\u09cd\u09af\u09a8\u09cd\u09a4 \u09ac\u09bf\u09b7\u09af\u09bc\u09ac\u09b8\u09cd\u09a4\u09c1 \u098f\u0996\u09a8 \u09aa\u09cd\u09b2\u09c7\u0987\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f \u09b9\u09bf\u09b8\u09be\u09ac\u09c7 \u0986\u099f\u0995\u09be\u09a8\u09cb \u09b9\u09ac\u09c7\u0964",
|
||||
"Fonts": "\u09ab\u09a8\u09cd\u099f\u09b8",
|
||||
"Font Sizes": "\u09ab\u09a8\u09cd\u099f \u09ae\u09be\u09aa",
|
||||
"Class": "\u0995\u09cd\u09b2\u09be\u09b8",
|
||||
"Browse for an image": "\u098f\u0995\u099f\u09bf \u099b\u09ac\u09bf \u09ac\u09cd\u09b0\u09be\u0989\u099c \u0995\u09b0\u09c1\u09a8",
|
||||
"OR": "\u0985\u09a5\u09ac\u09be",
|
||||
"Drop an image here": "\u098f\u0996\u09be\u09a8\u09c7 \u098f\u0995\u099f\u09bf \u099b\u09ac\u09bf \u09a1\u09cd\u09b0\u09aa \u0995\u09b0\u09c1\u09a8",
|
||||
"Upload": "\u0986\u09aa\u09b2\u09cb\u09a1",
|
||||
"Block": "\u09ac\u09cd\u09b2\u0995",
|
||||
"Align": "\u09ac\u09bf\u09a8\u09cd\u09af\u09b8\u09cd\u09a4\u0995\u09b0\u09c1\u09a8",
|
||||
"Default": "\u09a1\u09bf\u09ab\u09b2\u09cd\u099f",
|
||||
"Circle": "\u09ac\u09c3\u09a4\u09cd\u09a4",
|
||||
"Disc": "\u09a1\u09bf\u09b8\u09cd\u0995",
|
||||
"Square": "\u09ac\u09b0\u09cd\u0997\u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0",
|
||||
"Lower Alpha": "\u09a8\u09bf\u09ae\u09cd\u09a8 \u0986\u09b2\u09ab\u09be",
|
||||
"Lower Greek": "\u09a8\u09bf\u09ae\u09cd\u09a8 \u0997\u09cd\u09b0\u09bf\u0995",
|
||||
"Lower Roman": "\u09a8\u09bf\u09ae\u09cd\u09a8 \u09b0\u09cb\u09ae\u09be\u09a8",
|
||||
"Upper Alpha": "\u0989\u099a\u09cd\u099a\u09a4\u09b0 \u0986\u09b2\u09ab\u09be",
|
||||
"Upper Roman": "\u098a\u09b0\u09cd\u09a7\u09cd\u09ac \u09b0\u09cb\u09ae\u09be\u09a8",
|
||||
"Anchor...": "\u098f\u0999\u09cd\u0995\u09b0...",
|
||||
"Name": "\u09a8\u09be\u09ae",
|
||||
"Id": "\u0986\u0987\u09a1\u09bf",
|
||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u0986\u0987\u09a1\u09bf\u099f\u09bf \u0985\u0995\u09cd\u09b7\u09b0, \u09b8\u0982\u0996\u09cd\u09af\u09be, \u09a1\u09cd\u09af\u09be\u09b6, \u09a1\u099f\u09b8, \u0995\u09b2\u09cb\u09a8 \u09ac\u09be \u0986\u09a8\u09cd\u09a1\u09be\u09b0\u09b8\u09cd\u0995\u09cb\u09b0 \u09a6\u09cd\u09ac\u09be\u09b0\u09be \u0985\u09a8\u09c1\u09b8\u09b0\u09a3 \u0995\u09b0\u09be \u098f\u0995\u099f\u09bf \u099a\u09bf\u09a0\u09bf \u09a6\u09bf\u09af\u09bc\u09c7 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09be \u0989\u099a\u09bf\u09a4\u0964",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "\u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8\u0997\u09c1\u09b2\u09bf \u0986\u09aa\u09a8\u09bf \u0995\u09bf \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u09af\u09c7 \u0986\u09aa\u09a8\u09bf \u09a8\u09c7\u09ad\u09bf\u0997\u09c7\u099f \u0995\u09b0\u09a4\u09c7 \u099a\u09be\u09a8?",
|
||||
"Restore last draft": "\u09b6\u09c7\u09b7 \u0996\u09b8\u09a1\u09bc\u09be\u099f\u09bf \u09aa\u09c1\u09a8\u09b0\u09c1\u09a6\u09cd\u09a7\u09be\u09b0 \u0995\u09b0\u09c1\u09a8",
|
||||
"Special character...": "\u09ac\u09bf\u09b6\u09c7\u09b7 \u09ac\u09b0\u09cd\u09a3...",
|
||||
"Source code": "\u09b8\u09cb\u09b0\u09cd\u09b8 \u0995\u09cb\u09a1",
|
||||
"Insert\/Edit code sample": "\u0995\u09cb\u09a1 \u09a8\u09ae\u09c1\u09a8\u09be \u09a2\u09cb\u0995\u09be\u09a8 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8",
|
||||
"Language": "\u09ad\u09be\u09b7\u09be",
|
||||
"Code sample...": "\u09a8\u09ae\u09c1\u09a8\u09be \u0995\u09cb\u09a1",
|
||||
"Color Picker": "\u09b0\u0999 \u099a\u09af\u09bc\u09a8\u0995\u09be\u09b0\u09c0",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"B": "B",
|
||||
"Left to right": "\u09ac\u09be\u09ae \u09a5\u09c7\u0995\u09c7 \u09a1\u09be\u09a8",
|
||||
"Right to left": "\u09a1\u09be\u09a8 \u09a5\u09c7\u0995\u09c7 \u09ac\u09be\u09ae",
|
||||
"Emoticons...": "\u0987\u09ae\u09cb\u099f\u09bf\u0995\u09a8",
|
||||
"Metadata and Document Properties": "\u09ae\u09c7\u099f\u09be\u09a1\u09c7\u099f\u09be \u098f\u09ac\u0982 \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f\u09c7\u09b0 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af",
|
||||
"Title": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae",
|
||||
"Keywords": "\u0995\u09c0\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1",
|
||||
"Description": "\u09ac\u09bf\u09ac\u09b0\u09a3",
|
||||
"Robots": "\u09b0\u09cb\u09ac\u099f",
|
||||
"Author": "\u09b2\u09c7\u0996\u0995",
|
||||
"Encoding": "\u098f\u09a8\u0995\u09cb\u09a1\u09bf\u0982",
|
||||
"Fullscreen": "\u09aa\u09c2\u09b0\u09cd\u09a3 \u09aa\u09b0\u09cd\u09a6\u09be",
|
||||
"Action": "\u0995\u09b0\u09cd\u09ae",
|
||||
"Shortcut": "\u09b6\u09b0\u09cd\u099f\u0995\u09be\u099f",
|
||||
"Help": "\u09b8\u09be\u09b9\u09be\u09af\u09cd\u09af \u0995\u09b0\u09c1\u09a8",
|
||||
"Address": "\u09a0\u09bf\u0995\u09be\u09a8\u09be",
|
||||
"Focus to menubar": "\u09ae\u09c7\u09a8\u09c1\u09ac\u09be\u09b0\u09c7 \u09ab\u09cb\u0995\u09be\u09b8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Focus to toolbar": "\u099f\u09c1\u09b2\u09ac\u09be\u09b0\u09c7 \u09ab\u09cb\u0995\u09be\u09b8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Focus to element path": "\u0989\u09aa\u09be\u09a6\u09be\u09a8 \u09aa\u09be\u09a5 \u09ab\u09cb\u0995\u09be\u09b8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Focus to contextual toolbar": "\u09aa\u09cd\u09b0\u09be\u09b8\u0999\u09cd\u0997\u09bf\u0995 \u099f\u09c1\u09b2\u09ac\u09be\u09b0\u09c7 \u09ab\u09cb\u0995\u09be\u09b8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Insert link (if link plugin activated)": "\u09b2\u09bf\u0999\u09cd\u0995 \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8 (\u09af\u09a6\u09bf \u09b2\u09bf\u0999\u09cd\u0995 \u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09cd\u099f\u09bf\u09ad\u09c7\u099f \u0995\u09b0\u09be \u09b9\u09af\u09bc)",
|
||||
"Save (if save plugin activated)": "\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3 \u0995\u09b0\u09c1\u09a8 (\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09cd\u099f\u09bf\u09ad\u09c7\u099f \u09b9\u09b2\u09c7)",
|
||||
"Find (if searchreplace plugin activated)": "\u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u0995\u09b0\u09c1\u09a8 (\u09af\u09a6\u09bf \u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09af\u09cb\u0997\u09cd\u09af \u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u09b8\u0995\u09cd\u09b0\u09bf\u09af\u09bc \u0995\u09b0\u09be \u09b9\u09af\u09bc)",
|
||||
"Plugins installed ({0}):": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u0987\u09a8\u09b8\u09cd\u099f\u09b2 ({0}):",
|
||||
"Premium plugins:": "\u09aa\u09cd\u09b0\u09bf\u09ae\u09bf\u09af\u09bc\u09be\u09ae \u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8:",
|
||||
"Learn more...": "\u0986\u09b0\u0993 \u099c\u09be\u09a8\u09c1\u09a8...",
|
||||
"You are using {0}": "\u0986\u09aa\u09a8\u09bf \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u099b\u09c7\u09a8 {0}",
|
||||
"Plugins": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8",
|
||||
"Handy Shortcuts": "\u09b8\u09b9\u099c \u09b6\u09b0\u09cd\u099f\u0995\u09be\u099f ",
|
||||
"Horizontal line": "\u0985\u09a8\u09c1\u09ad\u09c2\u09ae\u09bf\u0995 \u09b0\u09c7\u0996\u09be",
|
||||
"Insert\/edit image": "\u0987\u09ae\u09c7\u099c \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8",
|
||||
"Image description": "\u099b\u09ac\u09bf\u09b0 \u09ac\u09b0\u09cd\u09a3\u09a8\u09be",
|
||||
"Source": "\u0989\u09ce\u09b8",
|
||||
"Dimensions": "\u09ae\u09be\u09a4\u09cd\u09b0\u09be",
|
||||
"Constrain proportions": "\u0985\u09a8\u09c1\u09aa\u09be\u09a4 \u09b8\u09c0\u09ae\u09be\u09ac\u09a6\u09cd\u09a7",
|
||||
"General": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3",
|
||||
"Advanced": "\u0985\u0997\u09cd\u09b0\u09b8\u09b0",
|
||||
"Style": "\u09b6\u09c8\u09b2\u09c0",
|
||||
"Vertical space": "\u0989\u09b2\u09cd\u09b2\u09ae\u09cd\u09ac \u09b8\u09cd\u09a5\u09be\u09a8",
|
||||
"Horizontal space": "\u0985\u09a8\u09c1\u09ad\u09c2\u09ae\u09bf\u0995 \u09b8\u09cd\u09a5\u09be\u09a8",
|
||||
"Border": "\u09b8\u09c0\u09ae\u09be\u09a8\u09cd\u09a4",
|
||||
"Insert image": "\u099a\u09bf\u09a4\u09cd\u09b0 \u09a2\u09cb\u0995\u09be\u09a8",
|
||||
"Image...": "\u0987\u09ae\u09c7\u099c...",
|
||||
"Image list": "\u099a\u09bf\u09a4\u09cd\u09b0 \u09a4\u09be\u09b2\u09bf\u0995\u09be",
|
||||
"Rotate counterclockwise": "\u09ac\u09be\u09ae\u09be\u09ac\u09b0\u09cd\u09a4\u09c7 \u0998\u09cb\u09b0\u09be\u09a4\u09c7",
|
||||
"Rotate clockwise": "\u0998\u09a1\u09bc\u09bf\u09b0 \u0995\u09be\u0981\u099f\u09be\u09b0 \u09a6\u09bf\u0995\u09c7 \u0998\u09cb\u09b0\u09be\u09a8",
|
||||
"Flip vertically": "\u0989\u09b2\u09cd\u09b2\u09ae\u09cd\u09ac\u09ad\u09be\u09ac\u09c7 \u09ab\u09cd\u09b2\u09bf\u09aa \u0995\u09b0\u09c1\u09a8",
|
||||
"Flip horizontally": "\u0985\u09a8\u09c1\u09ad\u09c2\u09ae\u09bf\u0995\u09ad\u09be\u09ac\u09c7 \u09ab\u09cd\u09b2\u09bf\u09aa \u0995\u09b0\u09c1\u09a8",
|
||||
"Edit image": "\u099a\u09bf\u09a4\u09cd\u09b0 \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8",
|
||||
"Image options": "\u099a\u09bf\u09a4\u09cd\u09b0 \u09ac\u09bf\u0995\u09b2\u09cd\u09aa\u0997\u09c1\u09b2\u09bf",
|
||||
"Zoom in": "\u09aa\u09cd\u09b0\u09b8\u09be\u09b0\u09bf\u09a4 \u0995\u09b0\u09cb",
|
||||
"Zoom out": "\u099b\u09cb\u099f \u0995\u09b0\u09be",
|
||||
"Crop": "\u0995\u09be\u099f\u09be",
|
||||
"Resize": "\u09ae\u09be\u09aa \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Orientation": "\u099d\u09cb\u0981\u0995",
|
||||
"Brightness": "\u0989\u099c\u09cd\u099c\u09cd\u09ac\u09b2\u09a4\u09be",
|
||||
"Sharpen": "\u09a7\u09be\u09b0 \u0995\u09b0\u09be",
|
||||
"Contrast": "\u09ac\u09bf\u09aa\u09b0\u09c0\u09a4 \u09b9\u09a4\u09cd\u09a4\u09af\u09bc\u09be",
|
||||
"Color levels": "\u09b0\u0999\u09c7\u09b0 \u09ae\u09be\u09a4\u09cd\u09b0\u09be",
|
||||
"Gamma": "Gamma",
|
||||
"Invert": "\u09ac\u09bf\u09a8\u09b7\u09cd\u099f \u0995\u09b0\u09be",
|
||||
"Apply": "\u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u0997 \u0995\u09b0\u09be",
|
||||
"Back": "\u09aa\u09bf\u099b\u09a8\u09c7",
|
||||
"Insert date\/time": "\u09a4\u09be\u09b0\u09bf\u0996 \/ \u09b8\u09ae\u09af\u09bc \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8",
|
||||
"Date\/time": "\u09a4\u09be\u09b0\u09bf\u0996 \/ \u09b8\u09ae\u09af\u09bc",
|
||||
"Insert\/Edit Link": "\u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6\/\u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u09b2\u09bf\u0999\u09cd\u0995",
|
||||
"Insert\/edit link": "\u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u09b2\u09bf\u0999\u09cd\u0995",
|
||||
"Text to display": "\u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09a8 \u099f\u09c7\u0995\u09cd\u09b8\u099f",
|
||||
"Url": "URL",
|
||||
"Open link in...": "\u09b2\u09bf\u0999\u09cd\u0995\u099f\u09bf \u0996\u09c1\u09b2\u09c1\u09a8...",
|
||||
"Current window": "\u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u0989\u0987\u09a8\u09cd\u09a1\u09cb",
|
||||
"None": "\u09a8\u09be",
|
||||
"New window": "\u09a8\u09a4\u09c1\u09a8 \u0989\u0987\u09a8\u09cd\u09a1\u09cb",
|
||||
"Remove link": "\u09b2\u09bf\u0999\u09cd\u0995 \u09b8\u09b0\u09be\u09a8",
|
||||
"Anchors": "\u09a8\u09cb\u0999\u09cd\u0997\u09b0",
|
||||
"Link...": "\u09b2\u09bf\u0982\u0995...",
|
||||
"Paste or type a link": "\u098f\u0995\u099f\u09bf \u09b2\u09bf\u0999\u09cd\u0995 \u0986\u099f\u0995\u09be\u09a8 \u09ac\u09be \u099f\u09be\u0987\u09aa \u0995\u09b0\u09c1\u09a8",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09ac\u09c7\u09b6 \u0995\u09b0\u09be URL\u099f\u09bf \u098f\u0995\u099f\u09bf \u0987\u09ae\u09c7\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be \u09ac\u09b2\u09c7 \u09ae\u09a8\u09c7 \u09b9\u099a\u09cd\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u09ae\u09c7\u0987\u09b2\u099f\u09cb \u09af\u09cb\u0997 \u0995\u09b0\u09a4\u09c7 \u099a\u09be\u09a8: \u0989\u09aa\u09b8\u09b0\u09cd\u0997?",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09ac\u09c7\u09b6 \u0995\u09b0\u09be URL\u099f\u09bf \u098f\u0995\u099f\u09bf \u09ac\u09b9\u09bf\u09b0\u09be\u0997\u09a4 \u09b2\u09bf\u0999\u09cd\u0995 \u09ac\u09b2\u09c7 \u09ae\u09a8\u09c7 \u09b9\u099a\u09cd\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u0995\u09bf \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc http:\/\/ \u09aa\u09cd\u09b0\u09bf\u09ab\u09bf\u0995\u09cd\u09b8 \u09af\u09cb\u0997 \u0995\u09b0\u09a4\u09c7 \u099a\u09be\u09a8?",
|
||||
"Link list": "\u09b2\u09bf\u0999\u09cd\u0995 \u09a4\u09be\u09b2\u09bf\u0995\u09be",
|
||||
"Insert video": "\u09ad\u09bf\u09a1\u09bf\u0993 \u09a2\u09cb\u0995\u09be\u09a8",
|
||||
"Insert\/edit video": "\u09ad\u09bf\u09a1\u09bf\u0993 \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8",
|
||||
"Insert\/edit media": "\u09ae\u09bf\u09a1\u09bf\u09af\u09bc\u09be \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8 \/ \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8",
|
||||
"Alternative source": "\u09ac\u09bf\u0995\u09b2\u09cd\u09aa \u0989\u09ce\u09b8",
|
||||
"Alternative source URL": "\u09ac\u09bf\u0995\u09b2\u09cd\u09aa \u0989\u09ce\u09b8 \u0987\u0986\u09b0\u098f\u09b2",
|
||||
"Media poster (Image URL)": "\u09ae\u09bf\u09a1\u09bf\u09af\u09bc\u09be \u09aa\u09cb\u09b8\u09cd\u099f\u09be\u09b0 (\u0987\u09ae\u09c7\u099c \u0987\u0989\u0986\u09b0\u098f\u09b2)",
|
||||
"Paste your embed code below:": "\u09a8\u09c0\u099a\u09c7\u09b0 \u0986\u09aa\u09a8\u09be\u09b0 \u098f\u09ae\u09cd\u09ac\u09c7\u09a1 \u0995\u09cb\u09a1 \u0986\u099f\u0995\u09be\u09a8:",
|
||||
"Embed": "\u098f\u09ae\u09cd\u09ac\u09c7\u09a1",
|
||||
"Media...": "\u09ae\u09bf\u09a1\u09bf\u09af\u09bc\u09be...",
|
||||
"Nonbreaking space": "\u0985\u09ac\u09bf\u099a\u09cd\u099b\u09bf\u09a8\u09cd\u09a8 \u09b8\u09cd\u09a5\u09be\u09a8",
|
||||
"Page break": "\u09aa\u09c3\u09b7\u09cd\u09a0\u09be \u09ac\u09bf\u09b0\u09a4\u09bf",
|
||||
"Paste as text": "\u09aa\u09be\u09a0\u09cd\u09af \u09b9\u09bf\u09b8\u09be\u09ac\u09c7 \u09aa\u09c7\u09b8\u09cd\u099f \u0995\u09b0\u09c1\u09a8",
|
||||
"Preview": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09b0\u09c2\u09aa",
|
||||
"Print...": "\u09ae\u09c1\u09a6\u09cd\u09b0\u09a8...",
|
||||
"Save": "\u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3",
|
||||
"Find": "\u0986\u09ac\u09bf\u09b7\u09cd\u0995\u09be\u09b0",
|
||||
"Replace with": "\u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8",
|
||||
"Replace": "\u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09be",
|
||||
"Replace all": "\u09b8\u09ae\u09b8\u09cd\u09a4 \u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8",
|
||||
"Previous": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0",
|
||||
"Next": "\u09aa\u09b0\u09ac\u09b0\u09cd\u09a4\u09c0",
|
||||
"Find and replace...": "\u0996\u09c1\u0981\u099c\u09c1\u09a8 \u0993 \u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09c1\u09a8...",
|
||||
"Could not find the specified string.": "\u09a8\u09bf\u09b0\u09cd\u09a6\u09bf\u09b7\u09cd\u099f \u09b8\u09cd\u099f\u09cd\u09b0\u09bf\u0982\u099f\u09bf \u0996\u09c1\u0981\u099c\u09c7 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf\u0964",
|
||||
"Match case": "\u09ae\u09cd\u09af\u09be\u099a \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0\u09c7",
|
||||
"Find whole words only": "\u09b6\u09c1\u09a7\u09c1\u09ae\u09be\u09a4\u09cd\u09b0 \u09aa\u09c1\u09b0\u09cb \u09b6\u09ac\u09cd\u09a6\u0997\u09c1\u09b2\u09bf \u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Spell check": "\u09ac\u09be\u09a8\u09be\u09a8 \u09af\u09be\u099a\u09be\u0987",
|
||||
"Ignore": "\u0989\u09aa\u09c7\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09be",
|
||||
"Ignore all": "\u09b8\u09ac\u0997\u09c1\u09b2\u09cb \u0989\u09aa\u09c7\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09c1\u09a8",
|
||||
"Finish": "\u09b6\u09c7\u09b7",
|
||||
"Add to Dictionary": "\u0985\u09ad\u09bf\u09a7\u09be\u09a8 \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8",
|
||||
"Insert table": "\u099f\u09c7\u09ac\u09bf\u09b2 \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8",
|
||||
"Table properties": "\u099f\u09c7\u09ac\u09bf\u09b2 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af",
|
||||
"Delete table": "\u09b8\u09be\u09b0\u09a3\u09bf \u09ae\u09c1\u099b\u09c1\u09a8",
|
||||
"Cell": "\u09b8\u09c7\u09b2",
|
||||
"Row": "\u09b8\u09be\u09b0\u09bf",
|
||||
"Column": "\u0995\u09b2\u09be\u09ae",
|
||||
"Cell properties": "\u09b8\u09c7\u09b2 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af",
|
||||
"Merge cells": "\u09b8\u09c7\u09b2 \u09ae\u09be\u09b0\u09cd\u099c \u0995\u09b0\u09c1\u09a8",
|
||||
"Split cell": "\u09b8\u09cd\u09aa\u09cd\u09b2\u09bf\u099f \u09b8\u09c7\u09b2",
|
||||
"Insert row before": "\u0986\u0997\u09c7 \u09b8\u09be\u09b0\u09bf \u09a2\u09cb\u0995\u09be\u09a8",
|
||||
"Insert row after": "\u09aa\u09b0\u09c7 \u09b8\u09be\u09b0\u09bf \u09a2\u09cb\u0995\u09be\u09a8",
|
||||
"Delete row": "\u09b8\u09be\u09b0\u09bf \u09ae\u09c1\u099b\u09c1\u09a8",
|
||||
"Row properties": "\u09b8\u09be\u09b0\u09bf \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af",
|
||||
"Cut row": "\u09b8\u09be\u09b0\u09bf \u0995\u09be\u099f\u09c1\u09a8",
|
||||
"Copy row": "\u09b8\u09be\u09b0\u09bf \u0985\u09a8\u09c1\u09b2\u09bf\u09aa\u09bf \u0995\u09b0\u09c1\u09a8",
|
||||
"Paste row before": "\u0986\u0997\u09c7 \u09b8\u09be\u09b0\u09bf \u09aa\u09c7\u09b8\u09cd\u099f \u0995\u09b0\u09c1\u09a8",
|
||||
"Paste row after": "\u09aa\u09b0\u09c7 \u09b8\u09be\u09b0\u09bf \u09aa\u09c7\u09b8\u09cd\u099f \u0995\u09b0\u09c1\u09a8",
|
||||
"Insert column before": "\u0986\u0997\u09c7 \u0995\u09b2\u09be\u09ae \u09a2\u09cb\u0995\u09be\u09a8",
|
||||
"Insert column after": "\u09aa\u09b0\u09c7 \u0995\u09b2\u09be\u09ae \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8",
|
||||
"Delete column": "\u0995\u09b2\u09be\u09ae \u09ae\u09c1\u099b\u09c1\u09a8",
|
||||
"Cols": "\u0995\u09b2\u09be\u09ae \u0997\u09c1\u09b2\u09cb",
|
||||
"Rows": "\u09b8\u09be\u09b0\u09bf\u0997\u09c1\u09b2\u09cb",
|
||||
"Width": "\u09aa\u09cd\u09b0\u09b8\u09cd\u09a5",
|
||||
"Height": "\u0989\u099a\u09cd\u099a\u09a4\u09be",
|
||||
"Cell spacing": "\u09b8\u09c7\u09b2 \u09ab\u09be\u0981\u0995\u09be",
|
||||
"Cell padding": "\u09b8\u09c7\u09b2 \u09aa\u09cd\u09af\u09be\u09a1\u09bf\u0982",
|
||||
"Show caption": "\u0995\u09cd\u09af\u09be\u09aa\u09b6\u09a8 \u09a6\u09c7\u0996\u09be\u09a8",
|
||||
"Left": "\u09ac\u09be\u09ae",
|
||||
"Center": "\u0995\u09c7\u09a8\u09cd\u09a6\u09cd\u09b0",
|
||||
"Right": "\u09a1\u09be\u09a8",
|
||||
"Cell type": "\u09b8\u09c7\u09b2 \u099f\u09be\u0987\u09aa",
|
||||
"Scope": "\u09ac\u09cd\u09af\u09be\u09aa\u09cd\u09a4\u09bf",
|
||||
"Alignment": "\u09b6\u09cd\u09b0\u09c7\u09a3\u09c0\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8",
|
||||
"H Align": "H \u09b8\u09be\u09b0\u09bf\u09ac\u09a6\u09cd\u09a7",
|
||||
"V Align": "V \u09b8\u09be\u09b0\u09bf\u09ac\u09a6\u09cd\u09a7",
|
||||
"Top": "\u0989\u09aa\u09b0",
|
||||
"Middle": "\u09ae\u09a7\u09cd\u09af\u09ae",
|
||||
"Bottom": "\u09a8\u09bf\u099a\u09c7",
|
||||
"Header cell": "\u09b9\u09c7\u09a1\u09be\u09b0 \u09b8\u09c7\u09b2",
|
||||
"Row group": "\u09b8\u09be\u09b0\u09bf \u0997\u09cd\u09b0\u09c1\u09aa",
|
||||
"Column group": "\u0995\u09b2\u09be\u09ae \u0997\u09cd\u09b0\u09c1\u09aa",
|
||||
"Row type": "\u09b8\u09be\u09b0\u09bf\u09b0 \u09a7\u09b0\u09a8",
|
||||
"Header": "\u09b9\u09c7\u09a1\u09be\u09b0",
|
||||
"Body": "\u09ac\u09a1\u09bf",
|
||||
"Footer": "\u09ab\u09c1\u099f\u09be\u09b0",
|
||||
"Border color": "\u09b8\u09c0\u09ae\u09be\u09a8\u09cd\u09a4 \u09b0\u0999",
|
||||
"Insert template...": "\u099f\u09c7\u09ae\u09aa\u09cd\u09b2\u09c7\u099f \u09a2\u09cb\u0995\u09be\u09a8...",
|
||||
"Templates": "\u099f\u09c7\u09ae\u09aa\u09cd\u09b2\u09c7\u099f",
|
||||
"Template": "\u099f\u09c7\u09ae\u09aa\u09cd\u09b2\u09c7\u099f",
|
||||
"Text color": "\u09b2\u09c7\u0996\u09be\u09b0 \u09b0\u0999",
|
||||
"Background color": "\u09aa\u09c7\u099b\u09a8\u09c7\u09b0 \u09b0\u0982",
|
||||
"Custom...": "\u0995\u09be\u09b8\u09cd\u099f\u09ae...",
|
||||
"Custom color": "\u0995\u09be\u09b8\u09cd\u099f\u09ae \u09b0\u0982",
|
||||
"No color": "\u0995\u09cb\u09a8 \u09b0\u0982 \u09a8\u09c7\u0987",
|
||||
"Remove color": "\u09b0\u0999 \u09b8\u09b0\u09be\u09a8",
|
||||
"Table of Contents": "\u09b8\u09c1\u099a\u09bf\u09aa\u09a4\u09cd\u09b0",
|
||||
"Show blocks": "\u09ac\u09cd\u09b2\u0995 \u09a6\u09c7\u0996\u09be\u09a8",
|
||||
"Show invisible characters": "\u0985\u09a6\u09c3\u09b6\u09cd\u09af \u0985\u0995\u09cd\u09b7\u09b0 \u09a6\u09c7\u0996\u09be\u09a8",
|
||||
"Word count": "\u09b6\u09ac\u09cd\u09a6 \u0997\u09a3\u09a8\u09be",
|
||||
"Count": "\u0997\u09a3\u09a8\u09be",
|
||||
"Document": "\u09a6\u09b2\u09bf\u09b2",
|
||||
"Selection": "\u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8",
|
||||
"Words": "\u09b6\u09ac\u09cd\u09a6\u09b8\u09ae\u09c2\u09b9",
|
||||
"Words: {0}": "\u09b6\u09ac\u09cd\u09a6: {0}",
|
||||
"{0} words": "{0} \u09b6\u09ac\u09cd\u09a6",
|
||||
"File": "\u09ab\u09be\u0987\u09b2",
|
||||
"Edit": "\u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8 \u0995\u09b0\u09be",
|
||||
"Insert": "\u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6",
|
||||
"View": "\u09a6\u09c3\u09b6\u09cd\u09af",
|
||||
"Format": "\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8",
|
||||
"Table": "\u099f\u09c7\u09ac\u09bf\u09b2",
|
||||
"Tools": "\u09b8\u09b0\u099e\u09cd\u099c\u09be\u09ae\u09b8\u09ae\u09c2\u09b9",
|
||||
"Powered by {0}": "{0} \u09a6\u09cd\u09ac\u09be\u09b0\u09be \u099a\u09be\u09b2\u09bf\u09a4",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u09b0\u09bf\u099a \u099f\u09c7\u0995\u09cd\u09b8\u099f \u098f\u09b0\u09bf\u09af\u09bc\u09be \u09ae\u09c7\u09a8\u09c1 \u099c\u09a8\u09cd\u09af ALT-F9 \u099a\u09be\u09aa\u09c1\u09a8 \u099f\u09c1\u09b2\u09ac\u09be\u09b0\u09c7\u09b0 \u099c\u09a8\u09cd\u09af ALT-F10 \u099f\u09bf\u09aa\u09c1\u09a8 \u09b8\u09be\u09b9\u09be\u09af\u09cd\u09af\u09c7\u09b0 \u099c\u09a8\u09cd\u09af ALT-0 \u099a\u09be\u09aa\u09c1\u09a8",
|
||||
"Image title": "\u0987\u09ae\u09c7\u099c\u09c7\u09b0 \u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae",
|
||||
"Border width": "\u09b8\u09c0\u09ae\u09be\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09b6\u09b8\u09cd\u09a5\u09a4\u09be",
|
||||
"Border style": "\u09b8\u09c0\u09ae\u09be\u09a8\u09be \u09b6\u09c8\u09b2\u09c0",
|
||||
"Error": "\u09a4\u09cd\u09b0\u09c1\u099f\u09bf",
|
||||
"Warn": "\u09b8\u09be\u09ac\u09a7\u09be\u09a8",
|
||||
"Valid": "\u09ac\u09c8\u09a7",
|
||||
"To open the popup, press Shift+Enter": "\u09aa\u09aa\u0986\u09aa \u0996\u09c1\u09b2\u09a4\u09c7, \u09b6\u09bf\u09ab\u099f + \u098f\u09a8\u09cd\u099f\u09be\u09b0 \u099f\u09bf\u09aa\u09c1\u09a8",
|
||||
"Rich Text Area. Press ALT-0 for help.": "\u09b8\u09ae\u09c3\u09a6\u09cd\u09a7 \u09aa\u09be\u09a0\u09cd\u09af \u0985\u099e\u09cd\u099a\u09b2\u0964 \u09b8\u09b9\u09be\u09af\u09bc\u09a4\u09be\u09b0 \u099c\u09a8\u09cd\u09af ALT-0 \u099f\u09bf\u09aa\u09c1\u09a8\u0964",
|
||||
"System Font": "\u09b8\u09bf\u09b8\u09cd\u099f\u09c7\u09ae \u09ab\u09a8\u09cd\u099f",
|
||||
"Failed to upload image: {0}": "\u099a\u09bf\u09a4\u09cd\u09b0 \u0986\u09aa\u09b2\u09cb\u09a1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09df\u09c7\u099b\u09c7: {0}",
|
||||
"Failed to load plugin: {0} from url {1}": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u09b2\u09cb\u09a1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5: {0} \u0987\u0989\u0986\u09b0\u098f\u09b2 \u09a5\u09c7\u0995\u09c7 {1}",
|
||||
"Failed to load plugin url: {0}": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u0987\u0989\u0986\u09b0\u098f\u09b2 \u09b2\u09cb\u09a1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5: {0}",
|
||||
"Failed to initialize plugin: {0}": "\u09aa\u09cd\u09b2\u09be\u0997\u0987\u09a8 \u099a\u09be\u09b2\u09c1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09df\u09c7\u099b\u09c7: {0}",
|
||||
"example": "\u0989\u09a6\u09be\u09b9\u09b0\u09a3",
|
||||
"Search": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u0995\u09b0\u09c1\u09a8",
|
||||
"All": "\u09b8\u0995\u09b2",
|
||||
"Currency": "\u09ae\u09c1\u09a6\u09cd\u09b0\u09be",
|
||||
"Text": "\u099f\u09c7\u0995\u09cd\u09b8\u099f",
|
||||
"Quotations": "\u0989\u09a6\u09cd\u09a7\u09c3\u09a4\u09bf",
|
||||
"Mathematical": "\u0997\u09be\u09a3\u09bf\u09a4\u09bf\u0995",
|
||||
"Extended Latin": "\u09ac\u09b0\u09cd\u09a7\u09bf\u09a4 \u09b2\u09be\u09a4\u09bf\u09a8",
|
||||
"Symbols": "\u09aa\u09cd\u09b0\u09a4\u09c0\u0995",
|
||||
"Arrows": "\u09a4\u09c0\u09b0",
|
||||
"User Defined": "\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0\u0995\u09be\u09b0\u09c0 \u09b8\u0982\u099c\u09cd\u099e\u09be\u09af\u09bc\u09bf\u09a4",
|
||||
"dollar sign": "\u09a1\u09b2\u09be\u09b0 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"currency sign": "\u09ae\u09c1\u09a6\u09cd\u09b0\u09be\u09b0 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"euro-currency sign": "\u0987\u0989\u09b0\u09cb-\u09ae\u09c1\u09a6\u09cd\u09b0\u09be \u09b8\u09be\u0987\u09a8",
|
||||
"colon sign": "\u0995\u09cb\u09b2\u09a8 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"cruzeiro sign": "\u0995\u09cd\u09b0\u09c1\u099c\u09c1\u0987\u09b0\u09cb \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"french franc sign": "\u09ab\u09cd\u09b0\u09c7\u099e\u09cd\u099a \u09ab\u09cd\u09b0\u09cd\u09af\u09be\u0999\u09cd\u0995 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"lira sign": "\u09b2\u09bf\u09b0\u09be \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"mill sign": "\u09ae\u09bf\u09b2 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"naira sign": "\u09a8\u09be\u09df\u09b0\u09be \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"peseta sign": "\u09aa\u09c7\u09b8\u09c7\u099f\u09be \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"rupee sign": "\u09b0\u09c1\u09aa\u09bf \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"won sign": "\u0989\u09a8 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"new sheqel sign": "\u09a8\u09a4\u09c1\u09a8 \u09b6\u09bf\u0995\u09c7\u09b2 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"dong sign": "\u09a1\u0982 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"kip sign": "\u0995\u09bf\u09aa \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"tugrik sign": "\u09a4\u09c1\u0997\u09b0\u09bf\u0995 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"drachma sign": "\u09a1\u09cd\u09b0\u09be\u099a\u09ae\u09be \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"german penny symbol": "\u099c\u09be\u09b0\u09cd\u09ae\u09be\u09a8 \u09aa\u09c7\u09a8\u09bf \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"peso sign": "\u09aa\u09c7\u09b8\u09cb \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"guarani sign": "\u0997\u09c1\u09df\u09be\u09b0\u09be\u09a8\u09c0 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"austral sign": "\u0993\u09b8\u09cd\u099f\u09cd\u09b0\u09be\u09b2 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"hryvnia sign": "\u09b9\u09be\u09b0\u09ad\u09a8\u09bf\u09df\u09be \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"cedi sign": "\u09b8\u09c7\u09a1\u09bf \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"livre tournois sign": "\u09b2\u09bf\u09ad\u09cd\u09b0\u09c7 \u099f\u09c1\u09b0\u09a8\u0987\u09b8 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"spesmilo sign": "\u09b8\u09cd\u09aa\u09c7\u09b8\u09ae\u09bf\u09b2\u09cb \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"tenge sign": "\u099f\u09bf\u09a8\u0997\u09c7 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"indian rupee sign": "\u0987\u09a8\u09cd\u09a1\u09bf\u09df\u09be\u09a8 \u09b0\u09c1\u09aa\u09bf \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"turkish lira sign": "\u09a4\u09c1\u0995\u09bf\u09b8\u09cd\u09a4\u09be\u09a8 \u09b2\u09bf\u09b0\u09be \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"nordic mark sign": "\u09a8\u09b0\u09a1\u09bf\u0995 \u09ae\u09be\u09b0\u09cd\u0995 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"manat sign": "\u09ae\u09be\u09a8\u09be\u099f \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"ruble sign": "\u09b0\u09c1\u09ac\u09c7\u09b2 \u099a\u09bf\u09b9\u09cd\u09a8",
|
||||
"yen character": "\u0987\u09df\u09c7\u09a8 \u0985\u0995\u09cd\u09b7\u09b0",
|
||||
"yuan character": "\u0987\u0989\u09af\u09bc\u09be\u09a8 \u0985\u0995\u09cd\u09b7\u09b0",
|
||||
"yuan character, in hong kong and taiwan": "\u09b9\u0982\u0995\u0982 \u098f\u09ac\u0982 \u09a4\u09be\u0987\u0993\u09af\u09bc\u09be\u09a8\u09c7 \u0987\u0989\u09af\u09bc\u09be\u09a8 \u0985\u0995\u09cd\u09b7\u09b0",
|
||||
"yen\/yuan character variant one": "\u0987\u09af\u09bc\u09c7\u09a8\/\u0987\u0989\u09af\u09bc\u09be\u09a8 \u0985\u0995\u09cd\u09b7\u09b0\u09c7\u09b0 \u098f\u0995\u099f\u09bf \u09ac\u09c8\u0995\u09b2\u09cd\u09aa\u09bf\u0995",
|
||||
"Loading emoticons...": "\u0987\u09ae\u09cb\u099f\u09bf\u0995\u09a8 \u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...",
|
||||
"Could not load emoticons": "\u0987\u09ae\u09cb\u099f\u09bf\u0995\u09a8 \u09b2\u09cb\u09a1 \u0995\u09b0\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf",
|
||||
"People": "\u099c\u09a8\u09b8\u09be\u09a7\u09be\u09b0\u09a3",
|
||||
"Animals and Nature": "\u09aa\u09cd\u09b0\u09be\u09a3\u09c0 \u098f\u09ac\u0982 \u09aa\u09cd\u09b0\u0995\u09c3\u09a4\u09bf",
|
||||
"Food and Drink": "\u0996\u09be\u09a6\u09cd\u09af \u0993 \u09aa\u09be\u09a8\u09c0\u09af\u09bc",
|
||||
"Activity": "\u0995\u09be\u09b0\u09cd\u09af\u0995\u09b2\u09be\u09aa",
|
||||
"Travel and Places": "\u09ad\u09cd\u09b0\u09ae\u09a3 \u098f\u09ac\u0982 \u09b8\u09cd\u09a5\u09be\u09a8",
|
||||
"Objects": "\u0989\u09a6\u09cd\u09a6\u09c7\u09b6\u09cd\u09af",
|
||||
"Flags": "\u09aa\u09a4\u09be\u0995\u09be",
|
||||
"Characters": "\u0985\u0995\u09cd\u09b7\u09b0",
|
||||
"Characters (no spaces)": "\u0985\u0995\u09cd\u09b7\u09b0 (\u0995\u09cb\u09a8\u0993 \u09b8\u09cd\u09aa\u09c7\u09b8 \u09a8\u09c7\u0987)",
|
||||
"{0} characters": "{0} \u0985\u0995\u09cd\u09b7\u09b0",
|
||||
"Error: Form submit field collision.": "\u09a4\u09cd\u09b0\u09c1\u099f\u09bf: \u09ab\u09b0\u09cd\u09ae \u099c\u09ae\u09be \u09a6\u09c7\u0993\u09af\u09bc\u09be\u09b0 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0\u09c7 \u09b8\u0982\u0998\u09b0\u09cd\u09b7\u0964",
|
||||
"Error: No form element found.": "\u09a4\u09cd\u09b0\u09c1\u099f\u09bf: \u0995\u09cb\u09a8\u0993 \u09ab\u09b0\u09cd\u09ae \u0989\u09aa\u09be\u09a6\u09be\u09a8 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc \u09a8\u09bf\u0964",
|
||||
"Update": "\u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6",
|
||||
"Color swatch": "\u09b0\u0999\u09cd\u0997\u09c7\u09b0 \u09aa\u09cd\u09b2\u09c7\u099f",
|
||||
"Turquoise": "\u09ab\u09bf\u09b0\u09cb\u099c\u09be",
|
||||
"Green": "\u09b8\u09ac\u09c1\u099c",
|
||||
"Blue": "\u09a8\u09c0\u09b2",
|
||||
"Purple": "\u09ac\u09c7\u0997\u09c1\u09a8\u09c0",
|
||||
"Navy Blue": "\u0986\u0995\u09be\u09b6\u09c0",
|
||||
"Dark Turquoise": "\u0997\u09be\u09a2\u09bc \u09ab\u09bf\u09b0\u09cb\u099c\u09be",
|
||||
"Dark Green": "\u0997\u09be\u09a2\u09bc \u09b8\u09ac\u09c1\u099c",
|
||||
"Medium Blue": "\u09ae\u09be\u099d\u09be\u09b0\u09bf \u09a8\u09c0\u09b2",
|
||||
"Medium Purple": "\u09ae\u09be\u099d\u09be\u09b0\u09bf \u09ac\u09c7\u0997\u09c1\u09a8\u09bf",
|
||||
"Midnight Blue": "\u09ae\u09be\u099d\u09b0\u09be\u09a4\u09c7\u09b0 \u09a8\u09c0\u09b2",
|
||||
"Yellow": "\u09b9\u09b2\u09c1\u09a6",
|
||||
"Orange": "\u0995\u09ae\u09b2\u09be",
|
||||
"Red": "\u09b2\u09be\u09b2",
|
||||
"Light Gray": "\u09b9\u09be\u09b2\u0995\u09be \u09a7\u09c2\u09b8\u09b0",
|
||||
"Gray": "\u09a7\u09c2\u09b8\u09b0",
|
||||
"Dark Yellow": "\u0997\u09be\u09a2\u09bc \u09b9\u09b2\u09c1\u09a6",
|
||||
"Dark Orange": "\u0997\u09be\u09a2\u09bc \u0995\u09ae\u09b2\u09be",
|
||||
"Dark Red": "\u0997\u09be\u09a2\u09bc \u09b2\u09be\u09b2",
|
||||
"Medium Gray": "\u09ae\u09cb\u099f\u09be\u09ae\u09c1\u099f\u09bf \u09a7\u09c2\u09b8\u09b0",
|
||||
"Dark Gray": "\u0997\u09be\u09a2\u09bc \u09a7\u09c2\u09b8\u09b0",
|
||||
"Light Green": "\u09b9\u09be\u09b2\u0995\u09be \u09b8\u09ac\u09c1\u099c",
|
||||
"Light Yellow": "\u09b9\u09be\u09b2\u0995\u09be \u09b9\u09b2\u09c1\u09a6",
|
||||
"Light Red": "\u09b9\u09be\u09b2\u0995\u09be \u09b2\u09be\u09b2",
|
||||
"Light Purple": "\u09b9\u09be\u09b2\u0995\u09be \u09b0\u0995\u09cd\u09a4\u09ac\u09b0\u09cd\u09a3",
|
||||
"Light Blue": "\u09b9\u09be\u09b2\u0995\u09be \u09a8\u09c0\u09b2",
|
||||
"Dark Purple": "\u0997\u09be\u09a2\u09bc \u09b0\u0995\u09cd\u09a4\u09ac\u09b0\u09cd\u09a3",
|
||||
"Dark Blue": "\u0997\u09be\u09a2\u09bc \u09a8\u09c0\u09b2",
|
||||
"Black": "\u0995\u09be\u09b2\u09cb",
|
||||
"White": "\u09b8\u09be\u09a6\u09be",
|
||||
"Switch to or from fullscreen mode": "\u09aa\u09c2\u09b0\u09cd\u09a3\u09b8\u09cd\u0995\u09cd\u09b0\u09bf\u09a8 \u09ae\u09cb\u09a1\u09c7 \u09ac\u09be \u09a5\u09c7\u0995\u09c7 \u09b8\u09cd\u09af\u09c1\u0987\u099a \u0995\u09b0\u09c1\u09a8",
|
||||
"Open help dialog": "\u09b8\u09b9\u09be\u09af\u09bc\u09a4\u09be \u09a1\u09be\u09af\u09bc\u09be\u09b2\u0997 \u0996\u09c1\u09b2\u09c1\u09a8",
|
||||
"history": "\u0987\u09a4\u09bf\u09b9\u09be\u09b8",
|
||||
"styles": "\u09b6\u09c8\u09b2\u09c0",
|
||||
"formatting": "\u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8",
|
||||
"alignment": "\u09b8\u09ae\u09a4\u09b2\u09a4\u09be",
|
||||
"indentation": "\u0996\u09be\u0981\u099c",
|
||||
"permanent pen": "\u09b8\u09cd\u09a5\u09be\u09af\u09bc\u09c0 \u0995\u09b2\u09ae",
|
||||
"comments": "\u09ae\u09a8\u09cd\u09a4\u09ac\u09cd\u09af",
|
||||
"Format Painter": "\u099a\u09bf\u09a4\u09cd\u09b0\u0995\u09b0 \u09ac\u09bf\u09a8\u09cd\u09af\u09be\u09b8",
|
||||
"Insert\/edit iframe": "\u0986\u0987\u09ab\u09cd\u09b0\u09c7\u09ae \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6\/\u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8",
|
||||
"Capitalization": "\u09aa\u09cd\u09b0\u09a5\u09ae \u0985\u0995\u09cd\u09b7\u09b0 \u09ac\u09dc \u09b9\u09be\u09a4\u09c7\u09b0",
|
||||
"lowercase": "\u099a\u09cb\u099f \u09b9\u09be\u09a4\u09c7\u09b0",
|
||||
"UPPERCASE": "\u09ac\u09dc \u09b9\u09be\u09a4\u09c7\u09b0",
|
||||
"Title Case": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae \u0995\u09c7\u09b8",
|
||||
"Permanent Pen Properties": "\u09b8\u09cd\u09a5\u09be\u09af\u09bc\u09c0 \u0995\u09b2\u09ae\u09c7\u09b0 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af",
|
||||
"Permanent pen properties...": "\u09b8\u09cd\u09a5\u09be\u09af\u09bc\u09c0 \u0995\u09b2\u09ae\u09c7\u09b0 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af...",
|
||||
"Font": "\u09ab\u09a8\u09cd\u099f",
|
||||
"Size": "\u0986\u09df\u09a4\u09a8",
|
||||
"More...": "\u0986\u09b0\u09cb...",
|
||||
"Spellcheck Language": "\u09ad\u09be\u09b7\u09be\u09b0 \u09ac\u09be\u09a8\u09be\u09a8 \u099a\u09c7\u0995",
|
||||
"Select...": "\u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8...",
|
||||
"Preferences": "\u09aa\u099b\u09a8\u09cd\u09a6\u09b8\u09ae\u09c2\u09b9",
|
||||
"Yes": "\u09b9\u09cd\u09af\u09be\u0981",
|
||||
"No": "\u09a8\u09be",
|
||||
"Keyboard Navigation": "\u0995\u09c0\u09ac\u09cb\u09b0\u09cd\u09a1 \u09a8\u09c7\u09ad\u09bf\u0997\u09c7\u09b6\u09a8",
|
||||
"Version": "\u09b8\u0982\u09b8\u09cd\u0995\u09b0\u09a3",
|
||||
"Anchor": "\u09a8\u09cb\u0999\u09cd\u0997\u09b0",
|
||||
"Special character": "\u09ac\u09bf\u09b6\u09c7\u09b7 \u099a\u09b0\u09bf\u09a4\u09cd\u09b0",
|
||||
"Code sample": "\u09a8\u09ae\u09c1\u09a8\u09be \u0995\u09cb\u09a1",
|
||||
"Color": "\u09b0\u0999",
|
||||
"Emoticons": "\u0987\u09ae\u09cb\u099f\u09bf\u0995\u09a8",
|
||||
"Document properties": "\u09a8\u09a5\u09bf\u09b0 \u09ac\u09c8\u09b6\u09bf\u09b7\u09cd\u099f\u09cd\u09af",
|
||||
"Image": "\u099b\u09ac\u09bf",
|
||||
"Insert link": "\u09b2\u09bf\u0999\u09cd\u0995 \u09b8\u09a8\u09cd\u09a8\u09bf\u09ac\u09c7\u09b6 \u0995\u09b0\u09c1\u09a8",
|
||||
"Target": "\u09b2\u0995\u09cd\u09b7\u09cd\u09af",
|
||||
"Link": "\u09b2\u09bf\u0982\u0995",
|
||||
"Poster": "\u09aa\u09cb\u09b8\u09cd\u099f\u09be\u09b0",
|
||||
"Media": "\u09ae\u09bf\u09a1\u09bf\u09af\u09bc\u09be",
|
||||
"Print": "\u099b\u09be\u09aa\u09be",
|
||||
"Prev": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0",
|
||||
"Find and replace": "\u0996\u09c1\u0981\u099c\u09c1\u09a8 \u0993 \u09aa\u09cd\u09b0\u09a4\u09bf\u09b8\u09cd\u09a5\u09be\u09aa\u09a8 \u0995\u09b0\u09c1\u09a8",
|
||||
"Whole words": "\u09b8\u09ae\u09cd\u09aa\u09c2\u09b0\u09cd\u09a3 \u09b6\u09ac\u09cd\u09a6\u09c7\u09b0",
|
||||
"Spellcheck": "\u09ac\u09be\u09a8\u09be\u09a8 \u09af\u09be\u099a\u09be\u0987",
|
||||
"Caption": "\u0995\u09cd\u09af\u09be\u09aa\u09b6\u09a8",
|
||||
"Insert template": "\u099f\u09c7\u09ae\u09aa\u09cd\u09b2\u09c7\u099f \u09a2\u09cb\u0995\u09be\u09a8"
|
||||
});
|
||||
@@ -0,0 +1,419 @@
|
||||
tinymce.addI18n('ca',{
|
||||
"Redo": "Refer",
|
||||
"Undo": "Desfer",
|
||||
"Cut": "Retalla",
|
||||
"Copy": "Copia",
|
||||
"Paste": "Enganxa",
|
||||
"Select all": "Seleccionar-ho tot",
|
||||
"New document": "Nou document",
|
||||
"Ok": "Acceptar",
|
||||
"Cancel": "Cancel\u00b7la",
|
||||
"Visual aids": "Assist\u00e8ncia visual",
|
||||
"Bold": "Negreta",
|
||||
"Italic": "Cursiva",
|
||||
"Underline": "Subratllat",
|
||||
"Strikethrough": "Barrat",
|
||||
"Superscript": "Super\u00edndex",
|
||||
"Subscript": "Sub\u00edndex",
|
||||
"Clear formatting": "Eliminar format",
|
||||
"Align left": "Alinea a l'esquerra",
|
||||
"Align center": "Alinea al centre",
|
||||
"Align right": "Alinea a la dreta",
|
||||
"Justify": "Justificat",
|
||||
"Bullet list": "Llista no ordenada",
|
||||
"Numbered list": "Llista enumerada",
|
||||
"Decrease indent": "Disminuir sagnat",
|
||||
"Increase indent": "Augmentar sagnat",
|
||||
"Close": "Tancar",
|
||||
"Formats": "Formats",
|
||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "El vostre navegador no suporta l'acc\u00e9s directe al portaobjectes. Si us plau, feu servir les dreceres de teclat Ctrl+X\/C\/V.",
|
||||
"Headers": "Encap\u00e7alaments",
|
||||
"Header 1": "Encap\u00e7alament 1",
|
||||
"Header 2": "Encap\u00e7alament 2",
|
||||
"Header 3": "Encap\u00e7alament 3",
|
||||
"Header 4": "Encap\u00e7alament 4",
|
||||
"Header 5": "Encap\u00e7alament 5",
|
||||
"Header 6": "Encap\u00e7alament 6",
|
||||
"Headings": "Encap\u00e7alaments",
|
||||
"Heading 1": "Encap\u00e7alament 1",
|
||||
"Heading 2": "Encap\u00e7alament 2",
|
||||
"Heading 3": "Encap\u00e7alament 3",
|
||||
"Heading 4": "Encap\u00e7alament 4",
|
||||
"Heading 5": "Encap\u00e7alament 5",
|
||||
"Heading 6": "Encap\u00e7alament 6",
|
||||
"Preformatted": "Preformatat",
|
||||
"Div": "Div",
|
||||
"Pre": "Pre",
|
||||
"Code": "Codi",
|
||||
"Paragraph": "Par\u00e0graf",
|
||||
"Blockquote": "Cita",
|
||||
"Inline": "En l\u00ednia",
|
||||
"Blocks": "Blocs",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Enganxar ara est\u00e0 en mode text pla. Els continguts s'enganxaran com a text pla fins que desactivis aquesta opci\u00f3. ",
|
||||
"Fonts": "Fonts",
|
||||
"Font Sizes": "Mides de la font",
|
||||
"Class": "Classe",
|
||||
"Browse for an image": "Explorar per cercar una imatge",
|
||||
"OR": "O",
|
||||
"Drop an image here": "Deixar anar una imatge aqu\u00ed",
|
||||
"Upload": "Pujar",
|
||||
"Block": "Bloc",
|
||||
"Align": "Alinea",
|
||||
"Default": "Per defecte",
|
||||
"Circle": "Cercle",
|
||||
"Disc": "Disc",
|
||||
"Square": "Quadrat",
|
||||
"Lower Alpha": "Alfa menor",
|
||||
"Lower Greek": "Grec menor",
|
||||
"Lower Roman": "Roman menor",
|
||||
"Upper Alpha": "Alfa major",
|
||||
"Upper Roman": "Roman major",
|
||||
"Anchor...": "Ancoratge...",
|
||||
"Name": "Nom",
|
||||
"Id": "Id",
|
||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "La Id ha de comen\u00e7ar amb una lletra, seguida d'altres lletres, n\u00fameros, punts, ratlles, comes, o guions baixos",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "Teniu canvis sense desar, esteu segur que voleu deixar-ho ara?",
|
||||
"Restore last draft": "Restaurar l'\u00faltim esborrany",
|
||||
"Special character...": "Car\u00e0cters especials\u2026",
|
||||
"Source code": "Codi font",
|
||||
"Insert\/Edit code sample": "Inserir\/Editar tros de codi",
|
||||
"Language": "Idioma",
|
||||
"Code sample...": "Mostra de codi...",
|
||||
"Color Picker": "Selector de colors",
|
||||
"R": "R",
|
||||
"G": "G",
|
||||
"B": "B",
|
||||
"Left to right": "D'esquerra a dreta",
|
||||
"Right to left": "De dreta a esquerra",
|
||||
"Emoticons...": "Emoticones...",
|
||||
"Metadata and Document Properties": "Metadades i propietats del document",
|
||||
"Title": "T\u00edtol",
|
||||
"Keywords": "Paraules clau",
|
||||
"Description": "Descripci\u00f3",
|
||||
"Robots": "Robots",
|
||||
"Author": "Autor",
|
||||
"Encoding": "Codificaci\u00f3",
|
||||
"Fullscreen": "Pantalla completa",
|
||||
"Action": "Acci\u00f3",
|
||||
"Shortcut": "Drecera",
|
||||
"Help": "Ajuda",
|
||||
"Address": "Adre\u00e7a",
|
||||
"Focus to menubar": "Enfocar la barra de men\u00fa",
|
||||
"Focus to toolbar": "Enfocar la barra d'eines",
|
||||
"Focus to element path": "Enfocar la ruta d'elements",
|
||||
"Focus to contextual toolbar": "Enfocar la barra d'eines contextual",
|
||||
"Insert link (if link plugin activated)": "Inserir enlla\u00e7 (si el complement d'enlla\u00e7 est\u00e0 activat)",
|
||||
"Save (if save plugin activated)": "Desar (si el complement desar est\u00e0 activat)",
|
||||
"Find (if searchreplace plugin activated)": "Cercar (si el complement cercar-reempla\u00e7ar est\u00e0 activat)",
|
||||
"Plugins installed ({0}):": "Complements instal\u00b7lats ({0}):",
|
||||
"Premium plugins:": "Complements premium",
|
||||
"Learn more...": "Apr\u00e8n m\u00e9s...",
|
||||
"You are using {0}": "Est\u00e0s utilitzant {0}",
|
||||
"Plugins": "Complements",
|
||||
"Handy Shortcuts": "Dreceres a m\u00e0",
|
||||
"Horizontal line": "L\u00ednia horitzontal",
|
||||
"Insert\/edit image": "Inserir\/editar imatge",
|
||||
"Image description": "Descripci\u00f3 de la imatge",
|
||||
"Source": "Font",
|
||||
"Dimensions": "Dimensions",
|
||||
"Constrain proportions": "Mantenir proporcions",
|
||||
"General": "General",
|
||||
"Advanced": "Avan\u00e7at",
|
||||
"Style": "Estil",
|
||||
"Vertical space": "Espai vertical",
|
||||
"Horizontal space": "Espai horitzontal",
|
||||
"Border": "Vora",
|
||||
"Insert image": "Inserir imatge",
|
||||
"Image...": "Imatge...",
|
||||
"Image list": "Llista d'imatges",
|
||||
"Rotate counterclockwise": "Girar a l'esquerra",
|
||||
"Rotate clockwise": "Girar a la dreta",
|
||||
"Flip vertically": "Capgirar verticalment",
|
||||
"Flip horizontally": "Capgirar horitzontalment",
|
||||
"Edit image": "Editar imatge",
|
||||
"Image options": "Opcions d'imatge",
|
||||
"Zoom in": "Ampliar",
|
||||
"Zoom out": "Empetitir",
|
||||
"Crop": "Escap\u00e7ar",
|
||||
"Resize": "Canviar mida",
|
||||
"Orientation": "Orientaci\u00f3",
|
||||
"Brightness": "Brillantor",
|
||||
"Sharpen": "Remarcar vores",
|
||||
"Contrast": "Contrast",
|
||||
"Color levels": "Nivells de color",
|
||||
"Gamma": "Gamma",
|
||||
"Invert": "Invertir",
|
||||
"Apply": "Aplicar",
|
||||
"Back": "Tornar",
|
||||
"Insert date\/time": "Inserir data\/hora",
|
||||
"Date\/time": "Data\/hora",
|
||||
"Insert\/Edit Link": "Inserir\/editar l'enlla\u00e7",
|
||||
"Insert\/edit link": "Inserir\/editar enlla\u00e7",
|
||||
"Text to display": "Text per mostrar",
|
||||
"Url": "URL",
|
||||
"Open link in...": "Obrir l'enlla\u00e7 a...",
|
||||
"Current window": "Finestra actual",
|
||||
"None": "Cap",
|
||||
"New window": "Finestra nova",
|
||||
"Remove link": "Treure enlla\u00e7",
|
||||
"Anchors": "\u00c0ncores",
|
||||
"Link...": "Enlla\u00e7...",
|
||||
"Paste or type a link": "Enganxa o escriu un enlla\u00e7",
|
||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL que has escrit sembla una adre\u00e7a de correu electr\u00f2nic. Vols afegir-li el prefix obligatori mailto: ?",
|
||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL que has escrit sembla un enlla\u00e7 extern. Vols afegir-li el prefix obligatori http:\/\/ ?",
|
||||
"Link list": "Llista d'enlla\u00e7os",
|
||||
"Insert video": "Inserir v\u00eddeo",
|
||||
"Insert\/edit video": "Inserir\/editar v\u00eddeo",
|
||||
"Insert\/edit media": "Inserir\/editar mitj\u00e0",
|
||||
"Alternative source": "Font alternativa",
|
||||
"Alternative source URL": "URL de font alternativa",
|
||||
"Media poster (Image URL)": "Cartell de multim\u00e8dia (URL d'imatge)",
|
||||
"Paste your embed code below:": "Enganxau el codi a sota:",
|
||||
"Embed": "Incloure",
|
||||
"Media...": "Multim\u00e8dia...",
|
||||
"Nonbreaking space": "Espai fixe",
|
||||
"Page break": "Salt de p\u00e0gina",
|
||||
"Paste as text": "Enganxar com a text",
|
||||
"Preview": "Previsualitzaci\u00f3",
|
||||
"Print...": "Imprimir...",
|
||||
"Save": "Desa",
|
||||
"Find": "Buscar",
|
||||
"Replace with": "Rempla\u00e7ar amb",
|
||||
"Replace": "Rempla\u00e7ar",
|
||||
"Replace all": "Rempla\u00e7ar-ho tot",
|
||||
"Previous": "Anterior",
|
||||
"Next": "Seg\u00fcent",
|
||||
"Find and replace...": "Cercar i reempla\u00e7ar...",
|
||||
"Could not find the specified string.": "No es pot trobar el text especificat.",
|
||||
"Match case": "Coincidir maj\u00fascules",
|
||||
"Find whole words only": "Cercar nom\u00e9s paraules completes",
|
||||
"Spell check": "Corrector ortogr\u00e0fic",
|
||||
"Ignore": "Ignorar",
|
||||
"Ignore all": "Ignorar tots",
|
||||
"Finish": "Finalitzar",
|
||||
"Add to Dictionary": "Afegir al diccionari",
|
||||
"Insert table": "Inserir taula",
|
||||
"Table properties": "Propietats de taula",
|
||||
"Delete table": "Esborrar taula",
|
||||
"Cell": "Cel\u00b7la",
|
||||
"Row": "Fila",
|
||||
"Column": "Columna",
|
||||
"Cell properties": "Propietats de cel\u00b7la",
|
||||
"Merge cells": "Fusionar cel\u00b7les",
|
||||
"Split cell": "Dividir cel\u00b7les",
|
||||
"Insert row before": "Inserir fila a sobre",
|
||||
"Insert row after": "Inserir fila a sota",
|
||||
"Delete row": "Esborrar fila",
|
||||
"Row properties": "Propietats de fila",
|
||||
"Cut row": "Retallar fila",
|
||||
"Copy row": "Copiar fila",
|
||||
"Paste row before": "Enganxar fila a sobre",
|
||||
"Paste row after": "Enganxar fila a sota",
|
||||
"Insert column before": "Inserir columna abans",
|
||||
"Insert column after": "Inserir columna despr\u00e9s",
|
||||
"Delete column": "Esborrar columna",
|
||||
"Cols": "Cols",
|
||||
"Rows": "Files",
|
||||
"Width": "Amplada",
|
||||
"Height": "Al\u00e7ada",
|
||||
"Cell spacing": "Espai entre cel\u00b7les",
|
||||
"Cell padding": "Marge intern",
|
||||
"Show caption": "Mostrar encap\u00e7alament",
|
||||
"Left": "A l'esquerra",
|
||||
"Center": "Centrat",
|
||||
"Right": "A la dreta",
|
||||
"Cell type": "Tipus de cel\u00b7la",
|
||||
"Scope": "\u00c0mbit",
|
||||
"Alignment": "Aliniament",
|
||||
"H Align": "Al\u00edniament H",
|
||||
"V Align": "Al\u00edniament V",
|
||||
"Top": "Superior",
|
||||
"Middle": "Mitj\u00e0",
|
||||
"Bottom": "Inferior",
|
||||
"Header cell": "Cel\u00b7la de cap\u00e7alera",
|
||||
"Row group": "Grup de fila",
|
||||
"Column group": "Grup de columna",
|
||||
"Row type": "Tipus de fila",
|
||||
"Header": "Cap\u00e7alera",
|
||||
"Body": "Cos",
|
||||
"Footer": "Peu",
|
||||
"Border color": "Color de vora",
|
||||
"Insert template...": "Inserir plantilla...",
|
||||
"Templates": "Plantilles",
|
||||
"Template": "Plantilla",
|
||||
"Text color": "Color del text",
|
||||
"Background color": "Color del fons",
|
||||
"Custom...": "Personalitzar...",
|
||||
"Custom color": "Personalitzar el color",
|
||||
"No color": "Sense color",
|
||||
"Remove color": "Eliminar el color",
|
||||
"Table of Contents": "Taula de continguts",
|
||||
"Show blocks": "Mostrar blocs",
|
||||
"Show invisible characters": "Mostrar car\u00e0cters invisibles",
|
||||
"Word count": "Recompte de paraules",
|
||||
"Count": "Compta",
|
||||
"Document": "Document",
|
||||
"Selection": "Selecci\u00f3",
|
||||
"Words": "Paraules",
|
||||
"Words: {0}": "Paraules: {0}",
|
||||
"{0} words": "{0} paraules",
|
||||
"File": "Arxiu",
|
||||
"Edit": "Edici\u00f3",
|
||||
"Insert": "Inserir",
|
||||
"View": "Veure",
|
||||
"Format": "Format",
|
||||
"Table": "Taula",
|
||||
"Tools": "Eines",
|
||||
"Powered by {0}": "Impulsat per {0}",
|
||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u00c0rea de text amb format. Premeu ALT-F9 per mostrar el men\u00fa, ALT F10 per la barra d'eines i ALT-0 per ajuda.",
|
||||
"Image title": "T\u00edtol de la imatge",
|
||||
"Border width": "Amplada de la vora",
|
||||
"Border style": "Estil de la vora",
|
||||
"Error": "Error",
|
||||
"Warn": "Alerta",
|
||||
"Valid": "V\u00e0lid",
|
||||
"To open the popup, press Shift+Enter": "Per obrir la finestra emergent, premeu Maj.+Retorn",
|
||||
"Rich Text Area. Press ALT-0 for help.": "\u00c0rea de Text enriquit. Premeu ALT-0 per obtenir ajuda.",
|
||||
"System Font": "Font del sistema",
|
||||
"Failed to upload image: {0}": "No s'ha pogut carregar la imatge: {0}",
|
||||
"Failed to load plugin: {0} from url {1}": "No s'ha pogut carregar el complement: {0} de l\u2019URL {1}",
|
||||
"Failed to load plugin url: {0}": "No s'ha pogut carregar l\u2019URL del complement: {0}",
|
||||
"Failed to initialize plugin: {0}": "No s'ha pogut inicialitzar el complement: {0}",
|
||||
"example": "exemple",
|
||||
"Search": "Cerca",
|
||||
"All": "Tot",
|
||||
"Currency": "Moneda",
|
||||
"Text": "Text",
|
||||
"Quotations": "Cites",
|
||||
"Mathematical": "S\u00edmbols matem\u00e0tics",
|
||||
"Extended Latin": "Llat\u00ed ampliat",
|
||||
"Symbols": "S\u00edmbols",
|
||||
"Arrows": "Fletxes",
|
||||
"User Defined": "Definit per l'usuari",
|
||||
"dollar sign": "signe del d\u00f2lar",
|
||||
"currency sign": "signe de la moneda",
|
||||
"euro-currency sign": "signe de l'euro",
|
||||
"colon sign": "signe del col\u00f3n",
|
||||
"cruzeiro sign": "signe del cruzeiro",
|
||||
"french franc sign": "signe del franc franc\u00e8s",
|
||||
"lira sign": "signe de la lira",
|
||||
"mill sign": "signe del mill",
|
||||
"naira sign": "signe de la naira",
|
||||
"peseta sign": "signe de la pesseta",
|
||||
"rupee sign": "signe de la rupia",
|
||||
"won sign": "signe del won",
|
||||
"new sheqel sign": "signe del nou x\u00e9quel",
|
||||
"dong sign": "signe del dong",
|
||||
"kip sign": "signe del kip",
|
||||
"tugrik sign": "signe del t\u00f6gr\u00f6g",
|
||||
"drachma sign": "signe del dracma",
|
||||
"german penny symbol": "signe del penic alemany",
|
||||
"peso sign": "signe del peso",
|
||||
"guarani sign": "signe del guaran\u00ed",
|
||||
"austral sign": "signe de l\u2019austral",
|
||||
"hryvnia sign": "signe de la hr\u00edvnia",
|
||||
"cedi sign": "signe del cedi",
|
||||
"livre tournois sign": "signe de la lliura tornesa",
|
||||
"spesmilo sign": "signe de l\u2019spesmilo",
|
||||
"tenge sign": "signe del tenge",
|
||||
"indian rupee sign": "signe de la rupia \u00edndia",
|
||||
"turkish lira sign": "signe de la lira turca",
|
||||
"nordic mark sign": "signe del marc n\u00f2rdic",
|
||||
"manat sign": "signe del manat",
|
||||
"ruble sign": "signe del ruble",
|
||||
"yen character": "signe del ien",
|
||||
"yuan character": "signe del iuan",
|
||||
"yuan character, in hong kong and taiwan": "signe del iuan en Hong Kong i Taiwan",
|
||||
"yen\/yuan character variant one": "variaci\u00f3 1 del signe del ien\/iuan",
|
||||
"Loading emoticons...": "Carregant les emoticones...",
|
||||
"Could not load emoticons": "No s'han pogut carregar les emoticones",
|
||||
"People": "Gent",
|
||||
"Animals and Nature": "Animals i natura",
|
||||
"Food and Drink": "Menjar i beure",
|
||||
"Activity": "Activitat",
|
||||
"Travel and Places": "Viatges i llocs",
|
||||
"Objects": "Objectes",
|
||||
"Flags": "Banderes",
|
||||
"Characters": "Car\u00e0cters",
|
||||
"Characters (no spaces)": "Car\u00e0cters (sense espais)",
|
||||
"{0} characters": "{0} car\u00e0cters",
|
||||
"Error: Form submit field collision.": "Error: error en el camp d\u2019enviament del formulari.",
|
||||
"Error: No form element found.": "Error: no s'ha trobat l'element del formulari.",
|
||||
"Update": "Actualitzar",
|
||||
"Color swatch": "Mostra de color",
|
||||
"Turquoise": "Turquesa",
|
||||
"Green": "Verd",
|
||||
"Blue": "Blau",
|
||||
"Purple": "Violeta",
|
||||
"Navy Blue": "Blau mar\u00ed",
|
||||
"Dark Turquoise": "Turquesa fosc",
|
||||
"Dark Green": "Verd fosc",
|
||||
"Medium Blue": "Blau mitj\u00e0",
|
||||
"Medium Purple": "Violeta mitj\u00e0",
|
||||
"Midnight Blue": "Blau mitjanit",
|
||||
"Yellow": "Groc",
|
||||
"Orange": "Taronja",
|
||||
"Red": "Vermell",
|
||||
"Light Gray": "Gris clar",
|
||||
"Gray": "Gris",
|
||||
"Dark Yellow": "Groc fosc",
|
||||
"Dark Orange": "Taronja fosc",
|
||||
"Dark Red": "Vermell fosc",
|
||||
"Medium Gray": "Gris mitj\u00e0",
|
||||
"Dark Gray": "Gris fosc",
|
||||
"Light Green": "Verd clar",
|
||||
"Light Yellow": "Groc clar",
|
||||
"Light Red": "Vermell clar",
|
||||
"Light Purple": "Porpra clar",
|
||||
"Light Blue": "Blau clar",
|
||||
"Dark Purple": "Porpra fosc",
|
||||
"Dark Blue": "Blau fosc",
|
||||
"Black": "Negre",
|
||||
"White": "Blanc",
|
||||
"Switch to or from fullscreen mode": "Canviar a o del mode de pantalla completa",
|
||||
"Open help dialog": "Obrir el quadre de di\u00e0leg d'ajuda",
|
||||
"history": "historial",
|
||||
"styles": "estils",
|
||||
"formatting": "format",
|
||||
"alignment": "alineaci\u00f3",
|
||||
"indentation": "sagnat",
|
||||
"permanent pen": "retolador permanent",
|
||||
"comments": "comentaris",
|
||||
"Format Painter": "Formata el Painter",
|
||||
"Insert\/edit iframe": "Insereix\/edita iframe",
|
||||
"Capitalization": "Capitalitzaci\u00f3",
|
||||
"lowercase": "min\u00fascules",
|
||||
"UPPERCASE": "MAJ\u00daSCULES",
|
||||
"Title Case": "Caixa del t\u00edtol",
|
||||
"Permanent Pen Properties": "Par\u00e0metres permanents del llapis",
|
||||
"Permanent pen properties...": "Par\u00e0metres permanents del llapis\u2026",
|
||||
"Font": "Font",
|
||||
"Size": "Mida",
|
||||
"More...": "M\u00e9s\u2026",
|
||||
"Spellcheck Language": "Idioma de la comprovaci\u00f3 d'ortografia",
|
||||
"Select...": "Selecciona\u2026",
|
||||
"Preferences": "Par\u00e0metres",
|
||||
"Yes": "S\u00ed",
|
||||
"No": "No",
|
||||
"Keyboard Navigation": "Navegaci\u00f3 per teclat",
|
||||
"Version": "Versi\u00f3",
|
||||
"Anchor": "\u00c0ncora",
|
||||
"Special character": "Car\u00e0cter especial",
|
||||
"Code sample": "Mostra de codi",
|
||||
"Color": "Color",
|
||||
"Emoticons": "Emoticones",
|
||||
"Document properties": "Propietats del document",
|
||||
"Image": "Imatge",
|
||||
"Insert link": "Inserir enlla\u00e7",
|
||||
"Target": "Dest\u00ed",
|
||||
"Link": "Enlla\u00e7",
|
||||
"Poster": "P\u00f3ster",
|
||||
"Media": "Mitjans",
|
||||
"Print": "Imprimir",
|
||||
"Prev": "Anterior",
|
||||
"Find and replace": "Buscar i rempla\u00e7ar",
|
||||
"Whole words": "Paraules senceres",
|
||||
"Spellcheck": "Comprovar ortrografia",
|
||||
"Caption": "Encap\u00e7alament",
|
||||
"Insert template": "Inserir plantilla"
|
||||
});
|
||||
@@ -46,7 +46,7 @@ tinymce.addI18n('cs',{
|
||||
"Pre": "Pre",
|
||||
"Code": "K\u00f3d",
|
||||
"Paragraph": "Odstavec",
|
||||
"Blockquote": "Citace",
|
||||
"Blockquote": "Blokov\u00e1 citace",
|
||||
"Inline": "\u0158\u00e1dkov\u00e9 zobrazen\u00ed (inline)",
|
||||
"Blocks": "Bloky",
|
||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Je zapnuto vkl\u00e1d\u00e1n\u00ed \u010dist\u00e9ho textu. Dokud nebude tato volba vypnuta, bude ve\u0161ker\u00fd obsah vlo\u017een jako \u010dist\u00fd text.",
|
||||
@@ -54,7 +54,7 @@ tinymce.addI18n('cs',{
|
||||
"Font Sizes": "Velikost p\u00edsma",
|
||||
"Class": "T\u0159\u00edda",
|
||||
"Browse for an image": "Vyhledat obr\u00e1zek",
|
||||
"OR": "nebo",
|
||||
"OR": "OR",
|
||||
"Drop an image here": "P\u0159esu\u0148te obr\u00e1zek sem",
|
||||
"Upload": "Nahr\u00e1t",
|
||||
"Block": "Do bloku",
|
||||
@@ -74,7 +74,7 @@ tinymce.addI18n('cs',{
|
||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "Id by m\u011blo za\u010d\u00ednat p\u00edsmenem a d\u00e1le obsahovat pouze p\u00edsmena, \u010d\u00edsla, poml\u010dky, te\u010dky, dvojte\u010dky, nebo podtr\u017e\u00edtka.",
|
||||
"You have unsaved changes are you sure you want to navigate away?": "M\u00e1te neulo\u017een\u00e9 zm\u011bny. Opravdu chcete opustit str\u00e1nku?",
|
||||
"Restore last draft": "Obnovit posledn\u00ed koncept",
|
||||
"Special characters...": "Speci\u00e1ln\u00ed znaky...",
|
||||
"Special character...": "Speci\u00e1ln\u00ed znak\u2026",
|
||||
"Source code": "Zdrojov\u00fd k\u00f3d",
|
||||
"Insert\/Edit code sample": "Vlo\u017eit \/ Upravit uk\u00e1zkov\u00fd k\u00f3d",
|
||||
"Language": "Jazyk",
|
||||
@@ -124,7 +124,7 @@ tinymce.addI18n('cs',{
|
||||
"Horizontal space": "Horizont\u00e1ln\u00ed mezera",
|
||||
"Border": "R\u00e1me\u010dek",
|
||||
"Insert image": "Vlo\u017eit obr\u00e1zek",
|
||||
"Image...": "Obr\u00e1zek...",
|
||||
"Image...": "Obr\u00e1zek\u2026",
|
||||
"Image list": "Seznam obr\u00e1zk\u016f",
|
||||
"Rotate counterclockwise": "Oto\u010dit doleva",
|
||||
"Rotate clockwise": "Oto\u010dit doprava",
|
||||
@@ -251,6 +251,10 @@ tinymce.addI18n('cs',{
|
||||
"Show blocks": "Uk\u00e1zat bloky",
|
||||
"Show invisible characters": "Zobrazit speci\u00e1ln\u00ed znaky",
|
||||
"Word count": "Po\u010det slov",
|
||||
"Count": "Po\u010det",
|
||||
"Document": "Dokument",
|
||||
"Selection": "V\u00fdb\u011br",
|
||||
"Words": "Slova",
|
||||
"Words: {0}": "Po\u010det slov: {0}",
|
||||
"{0} words": "Po\u010det slov: {0}",
|
||||
"File": "Soubor",
|
||||
@@ -271,10 +275,10 @@ tinymce.addI18n('cs',{
|
||||
"To open the popup, press Shift+Enter": "Vyskakovac\u00ed okno otev\u0159ete stisknut\u00edm Shift+Enter",
|
||||
"Rich Text Area. Press ALT-0 for help.": "Oblast Rich Text, stiskn\u011bte ALT-0 pro n\u00e1pov\u011bdu.",
|
||||
"System Font": "Syst\u00e9mov\u00e9 p\u00edsmo",
|
||||
"Failed to upload image: {0}": "Nahr\u00e1n\u00ed obr\u00e1zku selhalo: ",
|
||||
"Failed to upload image: {0}": "Nahr\u00e1n\u00ed obr\u00e1zku selhalo:",
|
||||
"Failed to load plugin: {0} from url {1}": "Na\u010dten\u00ed z\u00e1suvn\u00e9ho modulu selhalo: {0} z URL {1}",
|
||||
"Failed to load plugin url: {0}": "Na\u010dten\u00ed z\u00e1suvn\u00e9ho modulu URL selhalo: {0}",
|
||||
"Failed to initialize plugin: {0}": "Inicializace z\u00e1suvn\u00e9ho modulu selhala: ",
|
||||
"Failed to initialize plugin: {0}": "Inicializace z\u00e1suvn\u00e9ho modulu selhala:",
|
||||
"example": "p\u0159\u00edklad",
|
||||
"Search": "Hledat",
|
||||
"All": "V\u0161e",
|
||||
@@ -332,6 +336,7 @@ tinymce.addI18n('cs',{
|
||||
"Flags": "Vlajky",
|
||||
"Characters": "Znaky",
|
||||
"Characters (no spaces)": "Znaky (bez mezer)",
|
||||
"{0} characters": "{0} znak\u016f",
|
||||
"Error: Form submit field collision.": "Chyba: Kolize odes\u00edlac\u00edho formul\u00e1\u0159ov\u00e9ho pole.",
|
||||
"Error: No form element found.": "Chyba: Nebyl nalezen \u017e\u00e1dn\u00fd prvek formul\u00e1\u0159e.",
|
||||
"Update": "Aktualizovat",
|
||||
@@ -356,6 +361,13 @@ tinymce.addI18n('cs',{
|
||||
"Dark Red": "Tmav\u011b \u010derven\u00e1",
|
||||
"Medium Gray": "St\u0159edn\u011b \u0161ed\u00e1",
|
||||
"Dark Gray": "Tmav\u011b \u0161ed\u00e1",
|
||||
"Light Green": "Sv\u011btle zelen\u00e1",
|
||||
"Light Yellow": "Sv\u011btle \u017elut\u00e1",
|
||||
"Light Red": "Sv\u011btle \u010derven\u00e1",
|
||||
"Light Purple": "Sv\u011btle fialov\u00e1",
|
||||
"Light Blue": "Sv\u011btle modr\u00e1",
|
||||
"Dark Purple": "Tmav\u011b fialov\u00e1",
|
||||
"Dark Blue": "Tmav\u011b modr\u00e1",
|
||||
"Black": "\u010cern\u00e1",
|
||||
"White": "B\u00edl\u00e1",
|
||||
"Switch to or from fullscreen mode": "P\u0159ep\u00edn\u00e1n\u00ed mezi re\u017eimem cel\u00e9 obrazovky",
|
||||
@@ -367,6 +379,24 @@ tinymce.addI18n('cs',{
|
||||
"indentation": "odsazen\u00ed",
|
||||
"permanent pen": "permanentn\u00ed pero",
|
||||
"comments": "koment\u00e1\u0159e",
|
||||
"Format Painter": "Kop\u00edrovat form\u00e1t",
|
||||
"Insert\/edit iframe": "Vlo\u017eit\/upravit prvek iframe",
|
||||
"Capitalization": "Velk\u00e1 p\u00edsmena",
|
||||
"lowercase": "mal\u00e1 p\u00edsmena",
|
||||
"UPPERCASE": "VELK\u00c1 P\u00cdSMENA",
|
||||
"Title Case": "V\u0161echna Prvn\u00ed Velk\u00e1",
|
||||
"Permanent Pen Properties": "Vlastnosti permanentn\u00edho pera",
|
||||
"Permanent pen properties...": "Vlastnosti permanentn\u00edho pera\u2026",
|
||||
"Font": "P\u00edsmo",
|
||||
"Size": "Velikost",
|
||||
"More...": "Dal\u0161\u00ed\u2026",
|
||||
"Spellcheck Language": "Jazyk kontroly pravopisu",
|
||||
"Select...": "Vybrat\u2026",
|
||||
"Preferences": "P\u0159edvolby",
|
||||
"Yes": "Ano",
|
||||
"No": "Ne",
|
||||
"Keyboard Navigation": "Navigace pomoc\u00ed kl\u00e1vesnice",
|
||||
"Version": "Verze",
|
||||
"Anchor": "Kotva",
|
||||
"Special character": "Speci\u00e1ln\u00ed znak",
|
||||
"Code sample": "Uk\u00e1zkov\u00fd k\u00f3d",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user