├── LICENSE.md ├── assets ├── redactor-font.eot ├── plugins │ ├── clips │ │ ├── clips.css │ │ └── clips.js │ ├── textdirection │ │ └── textdirection.js │ ├── fontsize │ │ └── fontsize.js │ ├── limiter │ │ └── limiter.js │ ├── fontfamily │ │ └── fontfamily.js │ ├── counter │ │ └── counter.js │ ├── definedlinks │ │ └── definedlinks.js │ ├── imagemanager │ │ └── imagemanager.js │ ├── textexpander │ │ └── textexpander.js │ ├── filemanager │ │ └── filemanager.js │ ├── video │ │ └── video.js │ ├── fontcolor │ │ └── fontcolor.js │ ├── fullscreen │ │ └── fullscreen.js │ └── table │ │ └── table.js ├── lang │ ├── zh_cn.js │ ├── ko.js │ ├── zh_tw.js │ ├── ja.js │ ├── he.js │ ├── fa.js │ ├── th.js │ ├── ar.js │ ├── az.js │ ├── tr.js │ ├── mk.js │ ├── vi.js │ ├── pl.js │ ├── bg.js │ ├── fi.js │ ├── hu.js │ ├── sl.js │ ├── ge.js │ ├── nl.js │ ├── sr-cir.js │ ├── ba.js │ ├── lt.js │ ├── lv.js │ ├── no_NB.js │ ├── sr-lat.js │ ├── es_ar.js │ ├── ca.js │ ├── pt_pt.js │ ├── es.js │ ├── it.js │ ├── ro.js │ ├── ru.js │ ├── el.js │ ├── uk.js │ ├── uz.js │ ├── hr.js │ ├── de.js │ ├── fr.js │ ├── da.js │ ├── id.js │ ├── sq.js │ ├── by.js │ ├── cs.js │ ├── sk.js │ ├── pt_br.js │ ├── sv.js │ └── eo.js └── redactor.less ├── package.json ├── ImagemanagerImperaviRedactorPluginAsset.php ├── TableImperaviRedactorPluginAsset.php ├── VideoImperaviRedactorPluginAsset.php ├── CounterImperaviRedactorPluginAsset.php ├── FontsizeImperaviRedactorPluginAsset.php ├── LimiterImperaviRedactorPluginAsset.php ├── FontcolorImperaviRedactorPluginAsset.php ├── ClipsImperaviRedactorPluginAsset.php ├── FontfamilyImperaviRedactorPluginAsset.php ├── FullscreenImperaviRedactorPluginAsset.php ├── FilemanagerImperaviRedactorPluginAsset.php ├── DefinedlinksImperaviRedactorPluginAsset.php ├── TextdirectionImperaviRedactorPluginAsset.php ├── TextexpanderImperaviRedactorPluginAsset.php ├── ImperaviRedactorAsset.php ├── composer.json ├── CHANGELOG.md ├── README.md ├── .gitignore └── Widget.php /LICENSE.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asofter/yii2-imperavi-redactor/HEAD/LICENSE.md -------------------------------------------------------------------------------- /assets/redactor-font.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asofter/yii2-imperavi-redactor/HEAD/assets/redactor-font.eot -------------------------------------------------------------------------------- /assets/plugins/clips/clips.css: -------------------------------------------------------------------------------- 1 | .label-red { 2 | color: #fff; 3 | background: #c92020; 4 | padding: 0 7px; 5 | border-radius: 4px; 6 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-project", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "build": "babel assets/redactor.js assets/redactor-min.js" 6 | }, 7 | "devDependencies": { 8 | "babel-cli": "^6.26.0" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /ImagemanagerImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.5 14 | */ 15 | class CounterImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/counter'; 18 | public $js = [ 19 | 'counter.js', 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /FontsizeImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.4 14 | */ 15 | class FontsizeImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/fontsize'; 18 | public $js = [ 19 | 'fontsize.js' 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /LimiterImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.5 14 | */ 15 | class LimiterImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/limiter'; 18 | public $js = [ 19 | 'limiter.js', 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /FontcolorImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.4 14 | */ 15 | class FontcolorImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/fontcolor'; 18 | public $js = [ 19 | 'fontcolor.js', 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /ClipsImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.4 14 | */ 15 | class ClipsImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/clips'; 18 | public $js = [ 19 | 'clips.js', 20 | ]; 21 | public $css = [ 22 | 'clips.css' 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /FontfamilyImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.4 14 | */ 15 | class FontfamilyImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/fontfamily'; 18 | public $js = [ 19 | 'fontfamily.js' 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /FullscreenImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.4 14 | */ 15 | class FullscreenImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/fullscreen'; 18 | public $js = [ 19 | 'fullscreen.js' 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /FilemanagerImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.5 14 | */ 15 | class FilemanagerImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/filemanager'; 18 | public $js = [ 19 | 'filemanager.js', 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /DefinedlinksImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.5 14 | */ 15 | class DefinedlinksImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/definedlinks'; 18 | public $js = [ 19 | 'definedlinks.js', 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /TextdirectionImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.4 14 | */ 15 | class TextdirectionImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/textdirection'; 18 | public $js = [ 19 | 'textdirection.js' 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /TextexpanderImperaviRedactorPluginAsset.php: -------------------------------------------------------------------------------- 1 | 13 | * @since 1.5 14 | */ 15 | class TextexpanderImperaviRedactorPluginAsset extends AssetBundle 16 | { 17 | public $sourcePath = '@yii/imperavi/assets/plugins/textexpander'; 18 | public $js = [ 19 | 'textexpander.js', 20 | ]; 21 | public $css = [ 22 | 23 | ]; 24 | public $depends = [ 25 | 'yii\imperavi\ImperaviRedactorAsset' 26 | ]; 27 | } -------------------------------------------------------------------------------- /assets/plugins/textdirection/textdirection.js: -------------------------------------------------------------------------------- 1 | (function($) 2 | { 3 | $.Redactor.prototype.textdirection = function() 4 | { 5 | return { 6 | init: function() 7 | { 8 | var that = this; 9 | var dropdown = {}; 10 | 11 | dropdown.ltr = { title: 'Left to Right', func: that.textdirection.setLtr }; 12 | dropdown.rtl = { title: 'Right to Left', func: that.textdirection.setRtl}; 13 | 14 | var button = this.button.add('textdirection', 'Change Text Direction'); 15 | this.button.addDropdown(button, dropdown); 16 | }, 17 | setRtl: function() 18 | { 19 | this.buffer.set(); 20 | this.block.setAttr('dir', 'rtl'); 21 | }, 22 | setLtr: function() 23 | { 24 | this.buffer.set(); 25 | this.block.removeAttr('dir'); 26 | } 27 | }; 28 | }; 29 | })(jQuery); -------------------------------------------------------------------------------- /assets/plugins/fontsize/fontsize.js: -------------------------------------------------------------------------------- 1 | (function($) 2 | { 3 | $.Redactor.prototype.fontsize = function() 4 | { 5 | return { 6 | init: function() 7 | { 8 | var fonts = [10, 11, 12, 14, 16, 18, 20, 24, 28, 30]; 9 | var that = this; 10 | var dropdown = {}; 11 | 12 | $.each(fonts, function(i, s) 13 | { 14 | dropdown['s' + i] = { title: s + 'px', func: function() { that.fontsize.set(s); } }; 15 | }); 16 | 17 | dropdown.remove = { title: 'Remove Font Size', func: that.fontsize.reset }; 18 | 19 | var button = this.button.add('fontsize', 'Change Font Size'); 20 | this.button.addDropdown(button, dropdown); 21 | }, 22 | set: function(size) 23 | { 24 | this.inline.format('span', 'style', 'font-size: ' + size + 'px;'); 25 | }, 26 | reset: function() 27 | { 28 | this.inline.removeStyleRule('font-size'); 29 | } 30 | }; 31 | }; 32 | })(jQuery); -------------------------------------------------------------------------------- /assets/plugins/limiter/limiter.js: -------------------------------------------------------------------------------- 1 | (function($) 2 | { 3 | $.Redactor.prototype.limiter = function() 4 | { 5 | return { 6 | init: function() 7 | { 8 | if (!this.opts.limiter) return; 9 | 10 | this.$editor.on('keydown.redactor-limiter', $.proxy(function(e) 11 | { 12 | var key = e.which; 13 | var ctrl = e.ctrlKey || e.metaKey; 14 | 15 | if (key == this.keyCode.BACKSPACE 16 | || key == this.keyCode.DELETE 17 | || key == this.keyCode.ESC 18 | || key == this.keyCode.SHIFT 19 | || (ctrl && key == 65) 20 | || (ctrl && key == 82) 21 | || (ctrl && key == 116) 22 | ) 23 | { 24 | return; 25 | } 26 | 27 | var count = this.$editor.text().length; 28 | if (count >= this.opts.limiter) 29 | { 30 | return false; 31 | } 32 | 33 | 34 | }, this)); 35 | 36 | } 37 | }; 38 | }; 39 | })(jQuery); -------------------------------------------------------------------------------- /assets/plugins/fontfamily/fontfamily.js: -------------------------------------------------------------------------------- 1 | (function($) 2 | { 3 | $.Redactor.prototype.fontfamily = function() 4 | { 5 | return { 6 | init: function () 7 | { 8 | var fonts = [ 'Arial', 'Helvetica', 'Georgia', 'Times New Roman', 'Monospace' ]; 9 | var that = this; 10 | var dropdown = {}; 11 | 12 | $.each(fonts, function(i, s) 13 | { 14 | dropdown['s' + i] = { title: s, func: function() { that.fontfamily.set(s); }}; 15 | }); 16 | 17 | dropdown.remove = { title: 'Remove Font Family', func: that.fontfamily.reset }; 18 | 19 | var button = this.button.add('fontfamily', 'Change Font Family'); 20 | this.button.addDropdown(button, dropdown); 21 | 22 | }, 23 | set: function (value) 24 | { 25 | this.inline.format('span', 'style', 'font-family:' + value + ';'); 26 | }, 27 | reset: function() 28 | { 29 | this.inline.removeStyleRule('font-family'); 30 | } 31 | }; 32 | }; 33 | })(jQuery); -------------------------------------------------------------------------------- /ImperaviRedactorAsset.php: -------------------------------------------------------------------------------- 1 | 14 | * @since 2.0.1 15 | */ 16 | class ImperaviRedactorAsset extends AssetBundle 17 | { 18 | public $sourcePath = '@yii/imperavi/assets'; 19 | public $js = [ 20 | 'redactor.js' 21 | ]; 22 | public $css = [ 23 | 'redactor.css' 24 | ]; 25 | public $depends = [ 26 | 'yii\web\JqueryAsset' 27 | ]; 28 | 29 | public function init() { 30 | $appLanguage = strtolower(substr(Yii::$app->language , 0, 2)); // First 2 letters 31 | if($appLanguage != 'en' && file_exists(Yii::getAlias('@yii/imperavi/assets') . 'lang/' . $appLanguage . '.js')){ 32 | $this->js[] = 'lang/' . $appLanguage . '.js'; 33 | } 34 | parent::init(); 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /assets/plugins/counter/counter.js: -------------------------------------------------------------------------------- 1 | (function($) 2 | { 3 | $.Redactor.prototype.counter = function() 4 | { 5 | return { 6 | init: function() 7 | { 8 | if (!this.opts.counterCallback) return; 9 | 10 | this.$editor.on('keyup.redactor-limiter', $.proxy(function(e) 11 | { 12 | var words = 0, characters = 0, spaces = 0; 13 | 14 | var html = this.code.get(); 15 | 16 | var text = html.replace(/<\/(.*?)>/gi, ' '); 17 | text = text.replace(/<(.*?)>/gi, ''); 18 | text = text.replace(/\t/gi, ''); 19 | text = text.replace(/\n/gi, ' '); 20 | text = text.replace(/\r/gi, ' '); 21 | text = $.trim(text); 22 | 23 | if (text !== '') 24 | { 25 | var arrWords = text.split(/\s+/); 26 | var arrSpaces = text.match(/\s/g); 27 | 28 | if (arrWords) words = arrWords.length; 29 | if (arrSpaces) spaces = arrSpaces.length; 30 | 31 | characters = text.length; 32 | 33 | } 34 | 35 | this.core.setCallback('counter', { words: words, characters: characters, spaces: spaces }); 36 | 37 | 38 | }, this)); 39 | } 40 | }; 41 | }; 42 | })(jQuery); -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asofter/yii2-imperavi-redactor", 3 | "description": "Imperavi Redactor WYSIWYG widget (OEM-licensed for Yii 2)", 4 | "keywords": ["yii", "imperavi redactor", "imperavi"], 5 | "type": "yii2-extension", 6 | "license": "BSD-3-Clause", 7 | "support": { 8 | "issues": "https://github.com/asofter/yii2-imperavi-redactor/issues", 9 | "forum": "http://www.yiiframework.com/forum/", 10 | "wiki": "http://www.yiiframework.com/wiki/", 11 | "irc": "irc://irc.freenode.net/yii", 12 | "source": "https://github.com/yiisoft/yii2" 13 | }, 14 | "authors": [ 15 | { 16 | "name": "Veaceslav Medvedev", 17 | "email": "slavcopost@gmail.com" 18 | }, 19 | { 20 | "name": "Alexander Makarov", 21 | "email": "sam@rmcreative.ru", 22 | "homepage": "http://rmcreative.ru/" 23 | }, 24 | { 25 | "name": "Alexander Yaremchuk", 26 | "email": "alwex10@gmail.com" 27 | } 28 | ], 29 | "require": { 30 | "yiisoft/yii2": "*" 31 | }, 32 | "autoload": { 33 | "psr-0": { "yii\\imperavi\\": "" } 34 | }, 35 | "target-dir": "yii/imperavi" 36 | } -------------------------------------------------------------------------------- /assets/plugins/definedlinks/definedlinks.js: -------------------------------------------------------------------------------- 1 | (function($) 2 | { 3 | $.Redactor.prototype.definedlinks = function() 4 | { 5 | return { 6 | init: function() 7 | { 8 | if (!this.opts.definedLinks) return; 9 | 10 | this.modal.addCallback('link', $.proxy(this.definedlinks.load, this)); 11 | 12 | }, 13 | load: function() 14 | { 15 | var $select = $('' 14 | + ''; 15 | }, 16 | init: function() 17 | { 18 | var button = this.button.addAfter('image', 'video', this.lang.get('video')); 19 | this.button.addCallback(button, this.video.show); 20 | }, 21 | show: function() 22 | { 23 | this.modal.addTemplate('video', this.video.getTemplate()); 24 | 25 | this.modal.load('video', this.lang.get('video'), 700); 26 | this.modal.createCancelButton(); 27 | 28 | var button = this.modal.createActionButton(this.lang.get('insert')); 29 | button.on('click', this.video.insert); 30 | 31 | this.selection.save(); 32 | this.modal.show(); 33 | 34 | $('#redactor-insert-video-area').focus(); 35 | 36 | }, 37 | insert: function() 38 | { 39 | var data = $('#redactor-insert-video-area').val(); 40 | 41 | if (!data.match(/'); 48 | $swatch.css('background-color', color); 49 | $swatch.on('click', func); 50 | 51 | $dropdown.append($swatch); 52 | } 53 | 54 | var $elNone = $('').html(this.lang.get('none')); 55 | $elNone.on('click', $.proxy(function(e) 56 | { 57 | e.preventDefault(); 58 | this.fontcolor.remove(rule); 59 | 60 | }, this)); 61 | 62 | $dropdown.append($elNone); 63 | }, 64 | set: function(rule, type) 65 | { 66 | this.inline.format('span', 'style', rule + ': ' + type + ';'); 67 | }, 68 | remove: function(rule) 69 | { 70 | this.inline.removeStyleRule(rule); 71 | } 72 | }; 73 | }; 74 | })(jQuery); -------------------------------------------------------------------------------- /assets/lang/sv.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | $.Redactor.opts.langs['sv'] = { 3 | _delete: 'Tag Bort', 4 | add_head: 'Lägg Till Tabellhuvud', 5 | align_center: 'Centerjustera', 6 | align_justify: 'Marginaljustering', 7 | align_left: 'Vänsterjustera', 8 | align_right: 'Högerjustera', 9 | alignment: 'Justering', 10 | anchor: 'Ankare', 11 | backcolor: 'Bakgrundsfärg', 12 | bold: 'Fet', 13 | cancel: 'Ångra', 14 | choose: 'Välj', 15 | code: 'Kod', 16 | columns: 'Kolumner', 17 | delete_column: 'Tag Bort Kolumn', 18 | delete_head: 'Tag Bort Tabellhuvud', 19 | delete_row: 'Tag Bort Rad', 20 | delete_table: 'Tag Bort Tabell', 21 | deleted: 'Överstruken', 22 | download: 'Nedladdning', 23 | drop_file_here: 'Släpp Fil Här', 24 | edit: 'Ändra', 25 | file: 'Infoga Fil...', 26 | filename: 'Namn (valfritt)', 27 | fontcolor: 'Typsnittsfärg', 28 | formatting: 'Formatering', 29 | fullscreen: 'Fullskärm', 30 | header1: 'Rubrik 1', 31 | header2: 'Rubrik 2', 32 | header3: 'Rubrik 3', 33 | header4: 'Rubrik 4', 34 | header5: 'Rubrik 5', 35 | horizontalrule: 'Infoga Horisontell Linje', 36 | html: 'HTML', 37 | image: 'Infoga Bild...', 38 | image_position: 'Position', 39 | image_web_link: 'Bildlänk', 40 | indent: 'Öka indentering', 41 | insert: 'Infoga', 42 | insert_column_left: 'Lägg Till Vänsterkolumn', 43 | insert_column_right: 'Lägg Till Högerkolumn', 44 | insert_row_above: 'Lägg Till Rad Ovanför', 45 | insert_row_below: 'Lägg Till Rad Under', 46 | insert_table: 'Infoga Tabell...', 47 | italic: 'Kursiv', 48 | left: 'Vänster', 49 | link: 'Länk', 50 | link_edit: 'Ändra länk', 51 | link_insert: 'Infoga Länk...', 52 | link_new_tab: 'Öppna länk i ny flik', 53 | mailto: 'E-post', 54 | none: 'Ingen', 55 | or_choose: 'Eller Välj', 56 | orderedlist: 'Ordnad Lista', 57 | outdent: 'Minska Indentering', 58 | paragraph: 'Paragraf', 59 | quote: 'Citat', 60 | right: 'Höger', 61 | rows: 'Rader', 62 | save: 'Spara', 63 | table: 'Tabell', 64 | text: 'Text', 65 | title: 'Titel', 66 | underline: 'Understryk', 67 | unlink: 'Tag Bort Länk', 68 | unorderedlist: 'Oordnad Lista', 69 | upload: 'Uppladdning', 70 | video: 'Infoga Video...', 71 | video_html_code: 'Kod För Inbäddad Video', 72 | web: 'Webbadress', 73 | center: 'Center' 74 | }; 75 | })( jQuery ); 76 | 77 | -------------------------------------------------------------------------------- /assets/lang/eo.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | $.Redactor.opts.langs['eo'] = { 3 | html: 'HTML', // substantive 4 | video: 'Enŝovu videon...', // imperative 5 | image: 'Enŝovu bildon...', // imperative 6 | table: 'Tabelo', // substantive 7 | link: 'Ligu', // imperative 8 | link_insert: 'Enŝovu ligilon ...', // imperative 9 | link_edit: 'Edit link', 10 | unlink: 'Malligu', // imperative 11 | formatting: 'Tekstaranĝo', // substantive 12 | paragraph: 'Paragrafo', // substantive 13 | quote: 'Citaĵo', // substantive 14 | code: 'Kodo', // substantive 15 | header1: 'Kapo 1', // substantive 16 | header2: 'Kapo 2', // substantive 17 | header3: 'Kapo 3', // substantive 18 | header4: 'Kapo 4', // substantive 19 | header5: 'Kapo 5', // substantive 20 | bold: 'Grasa', // adjective 21 | italic: 'Kursiva', // adjective 22 | fontcolor: 'Tipara koloro', // substantive 23 | backcolor: 'Fona koloro', // substantive 24 | unorderedlist: 'Malorda listo', // substantive 25 | orderedlist: 'Orda listo', // substantive 26 | outdent: 'Malkrommarĝenu', // imperative 27 | indent: 'Krommarĝenu', // imperative 28 | cancel: 'Rezignu', // imperative 29 | insert: 'Enŝovu', // imperative 30 | save: 'Konservu', // imperative 31 | _delete: 'Forigu', // imperative 32 | insert_table: 'Enŝovu tabelon...', // imperative 33 | insert_row_above: 'Enŝovu vicon supren', // imperative 34 | insert_row_below: 'Enŝovu vicon malsupren', // imperative 35 | insert_column_left: 'Enŝovu kolumnon maldekstren', // imperative 36 | insert_column_right: 'Enŝovu kolumnon dekstren', // imperative 37 | delete_column: 'Forigu kolumnon', // imperative 38 | delete_row: 'Forigu vicon', // imperative 39 | delete_table: 'Forigu tabelon', // imperative 40 | rows: 'Vicoj', // substantive (plural) 41 | columns: 'Kolumnoj', // substantive (plural) 42 | add_head: 'Enŝovu kapon', // imperative 43 | delete_head: 'Forigu kapon', // imperative 44 | title: 'Titolo', // substantive 45 | image_position: 'Bildloko', // substantive 46 | none: 'Neniu', // determiner 47 | left: 'Maldekstra', // adjective 48 | right: 'Dekstra', // adjective 49 | image_web_link: 'Bilda hiperligilo', // substantive 50 | text: 'Teksto', // substantive 51 | mailto: 'Retpoŝto', // substantive 52 | web: 'URL', // substantive 53 | video_html_code: 'Videa enkorpigita kodo', // substantive 54 | file: 'Enŝovu dosieron...', // imperative 55 | upload: 'Alŝutu', // imperative 56 | download: 'Elŝutu', // imperative 57 | choose: 'Elektu', // imperative 58 | or_choose: 'Aŭ elektu', // imperative 59 | drop_file_here: 'Demetu dosieron ĉi tien', // imperative 60 | align_left: 'Ĝisrandigu maldekstren', // imperative 61 | align_center: 'Centrigu', // imperative 62 | align_right: 'Ĝisrandigu dekstren', // imperative 63 | align_justify: 'Ĝisrandigu', // imperative 64 | horizontalrule: 'Enŝovu horizontalan linion', // imperative 65 | fullscreen: 'Plenekrana', // adjective 66 | deleted: 'Foriga', // adjective 67 | anchor: 'Ankro', // substantive 68 | link_new_tab: 'Malfermu hiperligilon en novan langeton', // imperative 69 | underline: 'Substrekita', // adjective 70 | alignment: 'Ĝisrandigo', // substantive 71 | filename: 'Dosiernomo (fakultativa)', // substantive 72 | edit: 'Redaktu', // imperative 73 | center: 'Center' 74 | }; 75 | })( jQuery ); 76 | -------------------------------------------------------------------------------- /assets/plugins/fullscreen/fullscreen.js: -------------------------------------------------------------------------------- 1 | (function($) 2 | { 3 | $.Redactor.prototype.fullscreen = function() 4 | { 5 | return { 6 | init: function() 7 | { 8 | this.fullscreen.isOpen = false; 9 | 10 | var button = this.button.add('fullscreen', 'Fullscreen'); 11 | this.button.addCallback(button, this.fullscreen.toggle); 12 | 13 | if (this.opts.fullscreen) this.fullscreen.toggle(); 14 | }, 15 | enable: function() 16 | { 17 | this.button.changeIcon('fullscreen', 'normalscreen'); 18 | this.button.setActive('fullscreen'); 19 | this.fullscreen.isOpen = true; 20 | 21 | if (this.opts.toolbarExternal) 22 | { 23 | this.fullscreen.toolcss = {}; 24 | this.fullscreen.boxcss = {}; 25 | this.fullscreen.toolcss.width = this.$toolbar.css('width'); 26 | this.fullscreen.toolcss.top = this.$toolbar.css('top'); 27 | this.fullscreen.toolcss.position = this.$toolbar.css('position'); 28 | this.fullscreen.boxcss.top = this.$box.css('top'); 29 | } 30 | 31 | this.fullscreen.height = this.$editor.height(); 32 | 33 | if (this.opts.maxHeight) this.$editor.css('max-height', ''); 34 | if (this.opts.minHeight) this.$editor.css('min-height', ''); 35 | 36 | if (!this.$fullscreenPlaceholder) this.$fullscreenPlaceholder = $('
'); 37 | this.$fullscreenPlaceholder.insertAfter(this.$box); 38 | 39 | this.$box.appendTo(document.body); 40 | 41 | this.$box.addClass('redactor-box-fullscreen'); 42 | $('body, html').css('overflow', 'hidden'); 43 | 44 | this.fullscreen.resize(); 45 | $(window).on('resize.redactor.fullscreen', $.proxy(this.fullscreen.resize, this)); 46 | $(document).scrollTop(0, 0); 47 | 48 | $('.redactor-toolbar-tooltip').hide(); 49 | this.$editor.focus(); 50 | this.observe.load(); 51 | }, 52 | disable: function() 53 | { 54 | this.button.removeIcon('fullscreen', 'normalscreen'); 55 | this.button.setInactive('fullscreen'); 56 | this.fullscreen.isOpen = false; 57 | 58 | $(window).off('resize.redactor.fullscreen'); 59 | $('body, html').css('overflow', ''); 60 | 61 | this.$box.insertBefore(this.$fullscreenPlaceholder); 62 | this.$fullscreenPlaceholder.remove(); 63 | 64 | this.$box.removeClass('redactor-box-fullscreen').css({ width: 'auto', height: 'auto' }); 65 | 66 | this.code.sync(); 67 | 68 | if (this.opts.toolbarExternal) 69 | { 70 | this.$box.css('top', this.fullscreen.boxcss.top); 71 | this.$toolbar.css({ 72 | 'width': this.fullscreen.toolcss.width, 73 | 'top': this.fullscreen.toolcss.top, 74 | 'position': this.fullscreen.toolcss.position 75 | }); 76 | } 77 | 78 | if (this.opts.minHeight) this.$editor.css('minHeight', this.opts.minHeight); 79 | if (this.opts.maxHeight) this.$editor.css('maxHeight', this.opts.maxHeight); 80 | 81 | $('.redactor-toolbar-tooltip').hide(); 82 | this.$editor.css('height', 'auto'); 83 | this.$editor.focus(); 84 | this.observe.load(); 85 | }, 86 | toggle: function() 87 | { 88 | if (this.fullscreen.isOpen) 89 | { 90 | this.fullscreen.disable(); 91 | } 92 | else 93 | { 94 | this.fullscreen.enable(); 95 | } 96 | }, 97 | resize: function() 98 | { 99 | if (!this.fullscreen.isOpen) return; 100 | 101 | var toolbarHeight = this.$toolbar.height(); 102 | 103 | var height = $(window).height() - toolbarHeight - this.utils.normalize(this.$editor.css('padding-top')) - this.utils.normalize(this.$editor.css('padding-bottom')); 104 | this.$box.width($(window).width()).height(height); 105 | 106 | if (this.opts.toolbarExternal) 107 | { 108 | this.$toolbar.css({ 109 | 'top': '0px', 110 | 'position': 'absolute', 111 | 'width': '100%' 112 | }); 113 | 114 | this.$box.css('top', toolbarHeight + 'px'); 115 | } 116 | 117 | this.$editor.height(height); 118 | } 119 | }; 120 | }; 121 | })(jQuery); -------------------------------------------------------------------------------- /Widget.php: -------------------------------------------------------------------------------- 1 | 22 | * @author Alexander Makarov 23 | * @author Alexander Yaremchuk 24 | * 25 | * @version 2.0.1 26 | * 27 | * @link https://github.com/asofter/yii2-imperavi-redactor 28 | * @link http://imperavi.com/redactor 29 | * @license https://github.com/asofter/yii2-imperavi-redactor/blob/master/LICENSE.md 30 | */ 31 | class Widget extends \yii\base\Widget 32 | { 33 | /** 34 | * @var array the options for the Imperavi Redactor. 35 | * Please refer to the corresponding [Imperavi Web page](http://imperavi.com/redactor/docs/) for possible options. 36 | */ 37 | public $options = []; 38 | 39 | /** 40 | * @var array the html options. 41 | */ 42 | public $htmlOptions = []; 43 | 44 | /** 45 | * @var array plugins that you want to use 46 | */ 47 | public $plugins = []; 48 | 49 | /* 50 | * @var object model for active text area 51 | */ 52 | public $model = null; 53 | 54 | /* 55 | * @var string selector for init js scripts 56 | */ 57 | protected $selector = null; 58 | 59 | /* 60 | * @var string name of textarea tag or name of attribute 61 | */ 62 | public $attribute = null; 63 | 64 | /* 65 | * @var string value for text area (without model) 66 | */ 67 | public $value = ''; 68 | 69 | /** 70 | * @var \yii\web\AssetBundle|null Imperavi Redactor Asset bundle 71 | */ 72 | protected $_assetBundle = null; 73 | 74 | /** 75 | * Initializes the widget. 76 | * If you override this method, make sure you call the parent implementation first. 77 | */ 78 | public function init() 79 | { 80 | parent::init(); 81 | if (!isset($this->htmlOptions['id'])) { 82 | $this->htmlOptions['id'] = $this->getId(); 83 | } 84 | } 85 | 86 | /** 87 | * Renders the widget. 88 | */ 89 | public function run() 90 | { 91 | $this->selector = '#' . $this->htmlOptions['id']; 92 | 93 | if (!is_null($this->model)) { 94 | echo Html::activeTextarea($this->model, $this->attribute, $this->htmlOptions); 95 | } else { 96 | echo Html::textarea($this->attribute, $this->value, $this->htmlOptions); 97 | } 98 | 99 | $this->registerRedactorAsset(); 100 | $this->registerClientScript(); 101 | } 102 | 103 | /** 104 | * Registers Imperavi Redactor asset bundle 105 | */ 106 | protected function registerRedactorAsset() 107 | { 108 | $this->_assetBundle = ImperaviRedactorAsset::register($this->getView()); 109 | } 110 | 111 | /** 112 | * Returns current asset bundle 113 | * @return \yii\web\AssetBundle current asset bundle for Redactor 114 | */ 115 | protected function getAssetBundle() 116 | { 117 | if (!($this->_assetBundle instanceof AssetBundle)) { 118 | $this->registerRedactorAsset(); 119 | } 120 | 121 | return $this->_assetBundle; 122 | } 123 | 124 | /** 125 | * Registers Imperavi Redactor JS 126 | */ 127 | protected function registerClientScript() 128 | { 129 | $view = $this->getView(); 130 | 131 | /* 132 | * Language fix 133 | * @author 134 | */ 135 | if (!isset($this->options['lang']) || empty($this->options['lang'])) { 136 | $this->options['lang'] = strtolower(substr(Yii::$app->language, 0, 2)); 137 | } 138 | 139 | // Kudos to yiidoc/yii2-redactor for this solution 140 | $this->assetBundle->js[] = 'lang/' . $this->options['lang'] . '.js'; 141 | 142 | // Insert plugins in options 143 | if (!empty($this->plugins)) { 144 | $this->options['plugins'] = $this->plugins; 145 | 146 | foreach ($this->options['plugins'] as $plugin) { 147 | $this->registerPlugin($plugin); 148 | } 149 | } 150 | 151 | $options = empty($this->options) ? '' : Json::encode($this->options); 152 | $js = "jQuery('" . $this->selector . "').redactor($options);"; 153 | $view->registerJs($js); 154 | } 155 | 156 | /** 157 | * Registers a specific Imperavi plugin and the related events 158 | * @param string $name the name of the Imperavi plugin 159 | */ 160 | protected function registerPlugin($name) 161 | { 162 | $asset = "yii\\imperavi\\" . ucfirst($name) . "ImperaviRedactorPluginAsset"; 163 | // check exists file before register (it may be custom plugin with not standard file placement) 164 | $sourcePath = Yii::$app->vendorPath . '/asofter/yii2-imperavi-redactor/' . str_replace('\\', '/', $asset) . '.php'; 165 | if (is_file($sourcePath)) { 166 | $asset::register($this->getView()); 167 | } 168 | } 169 | } 170 | 171 | -------------------------------------------------------------------------------- /assets/plugins/table/table.js: -------------------------------------------------------------------------------- 1 | (function($) 2 | { 3 | $.Redactor.prototype.table = function() 4 | { 5 | return { 6 | getTemplate: function() 7 | { 8 | return String() 9 | + '
' 10 | + '' 11 | + '' 12 | + '' 13 | + '' 14 | + '
'; 15 | }, 16 | init: function() 17 | { 18 | var dropdown = {}; 19 | 20 | dropdown.insert_table = { 21 | title: this.lang.get('insert_table'), 22 | func: this.table.show, 23 | observe: { 24 | element: 'table', 25 | in: { 26 | attr: { 27 | 'class': 'redactor-dropdown-link-inactive', 28 | 'aria-disabled': true, 29 | } 30 | } 31 | } 32 | }; 33 | 34 | dropdown.insert_row_above = { 35 | title: this.lang.get('insert_row_above'), 36 | func: this.table.addRowAbove, 37 | observe: { 38 | element: 'table', 39 | out: { 40 | attr: { 41 | 'class': 'redactor-dropdown-link-inactive', 42 | 'aria-disabled': true, 43 | } 44 | } 45 | } 46 | }; 47 | 48 | dropdown.insert_row_below = { 49 | title: this.lang.get('insert_row_below'), 50 | func: this.table.addRowBelow, 51 | observe: { 52 | element: 'table', 53 | out: { 54 | attr: { 55 | 'class': 'redactor-dropdown-link-inactive', 56 | 'aria-disabled': true, 57 | } 58 | } 59 | } 60 | }; 61 | 62 | dropdown.insert_column_left = { 63 | title: this.lang.get('insert_column_left'), 64 | func: this.table.addColumnLeft, 65 | observe: { 66 | element: 'table', 67 | out: { 68 | attr: { 69 | 'class': 'redactor-dropdown-link-inactive', 70 | 'aria-disabled': true, 71 | } 72 | } 73 | } 74 | }; 75 | 76 | dropdown.insert_column_right = { 77 | title: this.lang.get('insert_column_right'), 78 | func: this.table.addColumnRight, 79 | observe: { 80 | element: 'table', 81 | out: { 82 | attr: { 83 | 'class': 'redactor-dropdown-link-inactive', 84 | 'aria-disabled': true, 85 | } 86 | } 87 | } 88 | }; 89 | 90 | dropdown.add_head = { 91 | title: this.lang.get('add_head'), 92 | func: this.table.addHead, 93 | observe: { 94 | element: 'table', 95 | out: { 96 | attr: { 97 | 'class': 'redactor-dropdown-link-inactive', 98 | 'aria-disabled': true, 99 | } 100 | } 101 | } 102 | }; 103 | 104 | dropdown.delete_head = { 105 | title: this.lang.get('delete_head'), 106 | func: this.table.deleteHead, 107 | observe: { 108 | element: 'table', 109 | out: { 110 | attr: { 111 | 'class': 'redactor-dropdown-link-inactive', 112 | 'aria-disabled': true, 113 | } 114 | } 115 | } 116 | }; 117 | 118 | dropdown.delete_column = { 119 | title: this.lang.get('delete_column'), 120 | func: this.table.deleteColumn, 121 | observe: { 122 | element: 'table', 123 | out: { 124 | attr: { 125 | 'class': 'redactor-dropdown-link-inactive', 126 | 'aria-disabled': true, 127 | } 128 | } 129 | } 130 | }; 131 | 132 | dropdown.delete_row = { 133 | title: this.lang.get('delete_row'), 134 | func: this.table.deleteRow, 135 | observe: { 136 | element: 'table', 137 | out: { 138 | attr: { 139 | 'class': 'redactor-dropdown-link-inactive', 140 | 'aria-disabled': true, 141 | } 142 | } 143 | } 144 | }; 145 | 146 | dropdown.delete_table = { 147 | title: this.lang.get('delete_table'), 148 | func: this.table.deleteTable, 149 | observe: { 150 | element: 'table', 151 | out: { 152 | attr: { 153 | 'class': 'redactor-dropdown-link-inactive', 154 | 'aria-disabled': true, 155 | } 156 | } 157 | } 158 | }; 159 | 160 | this.observe.addButton('td', 'table'); 161 | this.observe.addButton('th', 'table'); 162 | 163 | var button = this.button.addBefore('link', 'table', this.lang.get('table')); 164 | this.button.addDropdown(button, dropdown); 165 | }, 166 | show: function() 167 | { 168 | this.modal.addTemplate('table', this.table.getTemplate()); 169 | 170 | this.modal.load('table', this.lang.get('insert_table'), 300); 171 | this.modal.createCancelButton(); 172 | 173 | var button = this.modal.createActionButton(this.lang.get('insert')); 174 | button.on('click', this.table.insert); 175 | 176 | this.selection.save(); 177 | this.modal.show(); 178 | 179 | $('#redactor-table-rows').focus(); 180 | 181 | }, 182 | insert: function() 183 | { 184 | this.placeholder.remove(); 185 | 186 | var rows = $('#redactor-table-rows').val(), 187 | columns = $('#redactor-table-columns').val(), 188 | $tableBox = $('
'), 189 | tableId = Math.floor(Math.random() * 99999), 190 | $table = $('
'), 191 | i, $row, z, $column; 192 | 193 | for (i = 0; i < rows; i++) 194 | { 195 | $row = $(''); 196 | 197 | for (z = 0; z < columns; z++) 198 | { 199 | $column = $('' + this.opts.invisibleSpace + ''); 200 | 201 | // set the focus to the first td 202 | if (i === 0 && z === 0) 203 | { 204 | $column.append(this.selection.getMarker()); 205 | } 206 | 207 | $($row).append($column); 208 | } 209 | 210 | $table.append($row); 211 | } 212 | 213 | $tableBox.append($table); 214 | var html = $tableBox.html(); 215 | 216 | this.modal.close(); 217 | this.selection.restore(); 218 | 219 | if (this.table.getTable()) return; 220 | 221 | this.buffer.set(); 222 | 223 | var current = this.selection.getBlock() || this.selection.getCurrent(); 224 | if (current && current.tagName != 'BODY') 225 | { 226 | if (current.tagName == 'LI') current = $(current).closest('ul, ol'); 227 | $(current).after(html); 228 | } 229 | else 230 | { 231 | this.insert.html(html, false); 232 | } 233 | 234 | this.selection.restore(); 235 | 236 | var table = this.$editor.find('#table' + tableId); 237 | 238 | var p = table.prev("p"); 239 | 240 | if (p.length > 0 && this.utils.isEmpty(p.html())) 241 | { 242 | p.remove(); 243 | } 244 | 245 | if (!this.opts.linebreaks && (this.utils.browser('mozilla') || this.utils.browser('msie'))) 246 | { 247 | var $next = table.next(); 248 | if ($next.length === 0) 249 | { 250 | table.after(this.opts.emptyHtml); 251 | } 252 | } 253 | 254 | this.observe.buttons(); 255 | 256 | table.find('span.redactor-selection-marker').remove(); 257 | table.removeAttr('id'); 258 | 259 | this.code.sync(); 260 | this.core.setCallback('insertedTable', table); 261 | }, 262 | getTable: function() 263 | { 264 | var $table = $(this.selection.getParent()).closest('table'); 265 | 266 | if (!this.utils.isRedactorParent($table)) return false; 267 | if ($table.size() === 0) return false; 268 | 269 | return $table; 270 | }, 271 | restoreAfterDelete: function($table) 272 | { 273 | this.selection.restore(); 274 | $table.find('span.redactor-selection-marker').remove(); 275 | this.code.sync(); 276 | }, 277 | deleteTable: function() 278 | { 279 | var $table = this.table.getTable(); 280 | if (!$table) return; 281 | 282 | this.buffer.set(); 283 | 284 | 285 | var $next = $table.next(); 286 | if (!this.opts.linebreaks && $next.length !== 0) 287 | { 288 | this.caret.setStart($next); 289 | } 290 | else 291 | { 292 | this.caret.setAfter($table); 293 | } 294 | 295 | 296 | $table.remove(); 297 | 298 | this.code.sync(); 299 | }, 300 | deleteRow: function() 301 | { 302 | var $table = this.table.getTable(); 303 | if (!$table) return; 304 | 305 | var $current = $(this.selection.getCurrent()); 306 | 307 | this.buffer.set(); 308 | 309 | var $current_tr = $current.closest('tr'); 310 | var $focus_tr = $current_tr.prev().length ? $current_tr.prev() : $current_tr.next(); 311 | if ($focus_tr.length) 312 | { 313 | var $focus_td = $focus_tr.children('td, th').first(); 314 | if ($focus_td.length) $focus_td.prepend(this.selection.getMarker()); 315 | } 316 | 317 | $current_tr.remove(); 318 | this.table.restoreAfterDelete($table); 319 | }, 320 | deleteColumn: function() 321 | { 322 | var $table = this.table.getTable(); 323 | if (!$table) return; 324 | 325 | this.buffer.set(); 326 | 327 | var $current = $(this.selection.getCurrent()); 328 | var $current_td = $current.closest('td, th'); 329 | var index = $current_td[0].cellIndex; 330 | 331 | $table.find('tr').each($.proxy(function(i, elem) 332 | { 333 | var $elem = $(elem); 334 | var focusIndex = index - 1 < 0 ? index + 1 : index - 1; 335 | if (i === 0) $elem.find('td, th').eq(focusIndex).prepend(this.selection.getMarker()); 336 | 337 | $elem.find('td, th').eq(index).remove(); 338 | 339 | }, this)); 340 | 341 | this.table.restoreAfterDelete($table); 342 | }, 343 | addHead: function() 344 | { 345 | var $table = this.table.getTable(); 346 | if (!$table) return; 347 | 348 | this.buffer.set(); 349 | 350 | if ($table.find('thead').size() !== 0) 351 | { 352 | this.table.deleteHead(); 353 | return; 354 | } 355 | 356 | var tr = $table.find('tr').first().clone(); 357 | tr.find('td').replaceWith($.proxy(function() 358 | { 359 | return $('').html(this.opts.invisibleSpace); 360 | }, this)); 361 | 362 | $thead = $('').append(tr); 363 | $table.prepend($thead); 364 | 365 | this.code.sync(); 366 | 367 | }, 368 | deleteHead: function() 369 | { 370 | var $table = this.table.getTable(); 371 | if (!$table) return; 372 | 373 | var $thead = $table.find('thead'); 374 | if ($thead.size() === 0) return; 375 | 376 | this.buffer.set(); 377 | 378 | $thead.remove(); 379 | this.code.sync(); 380 | }, 381 | addRowAbove: function() 382 | { 383 | this.table.addRow('before'); 384 | }, 385 | addRowBelow: function() 386 | { 387 | this.table.addRow('after'); 388 | }, 389 | addColumnLeft: function() 390 | { 391 | this.table.addColumn('before'); 392 | }, 393 | addColumnRight: function() 394 | { 395 | this.table.addColumn('after'); 396 | }, 397 | addRow: function(type) 398 | { 399 | var $table = this.table.getTable(); 400 | if (!$table) return; 401 | 402 | this.buffer.set(); 403 | 404 | var $current = $(this.selection.getCurrent()); 405 | var $current_tr = $current.closest('tr'); 406 | var new_tr = $current_tr.clone(); 407 | 408 | new_tr.find('th').replaceWith(function() 409 | { 410 | var $td = $(''); 411 | $td[0].attributes = this.attributes; 412 | 413 | return $td.append($(this).contents()); 414 | }); 415 | 416 | new_tr.find('td').html(this.opts.invisibleSpace); 417 | 418 | if (type == 'after') 419 | { 420 | $current_tr.after(new_tr); 421 | } 422 | else 423 | { 424 | $current_tr.before(new_tr); 425 | } 426 | 427 | this.code.sync(); 428 | }, 429 | addColumn: function (type) 430 | { 431 | var $table = this.table.getTable(); 432 | if (!$table) return; 433 | 434 | var index = 0; 435 | var current = $(this.selection.getCurrent()); 436 | 437 | this.buffer.set(); 438 | 439 | var $current_tr = current.closest('tr'); 440 | var $current_td = current.closest('td, th'); 441 | 442 | $current_tr.find('td, th').each($.proxy(function(i, elem) 443 | { 444 | if ($(elem)[0] === $current_td[0]) index = i; 445 | 446 | }, this)); 447 | 448 | $table.find('tr').each($.proxy(function(i, elem) 449 | { 450 | var $current = $(elem).find('td, th').eq(index); 451 | 452 | var td = $current.clone(); 453 | td.html(this.opts.invisibleSpace); 454 | 455 | if (type == 'after') 456 | { 457 | $current.after(td); 458 | } 459 | else 460 | { 461 | $current.before(td); 462 | } 463 | 464 | }, this)); 465 | 466 | this.code.sync(); 467 | } 468 | }; 469 | }; 470 | })(jQuery); -------------------------------------------------------------------------------- /assets/redactor.less: -------------------------------------------------------------------------------- 1 | .clearfix() { 2 | &:after { 3 | content: ""; 4 | display: table; 5 | clear: both; 6 | } 7 | } 8 | .transition-redactor(@transition: all linear .2s) { 9 | -moz-transition: @transition; 10 | transition: @transition; 11 | } 12 | 13 | .opacity-redactor(@opacity: 100) { 14 | filter: e(%("alpha(opacity=%d)", @opacity)); 15 | -moz-opacity: @opacity / 100; 16 | opacity: @opacity / 100; 17 | } 18 | .box-sizing-redactor(@box-model) { 19 | -webkit-box-sizing: @box-model; 20 | -moz-box-sizing: @box-model; 21 | box-sizing: @box-model; 22 | } 23 | .striped-redactor(@color: rgba(255, 255, 255, .2); @angle: 45deg) { 24 | background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); 25 | background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); 26 | background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); 27 | } 28 | 29 | .animation-redactor(@animation) { 30 | -webkit-animation: @animation; 31 | -o-animation: @animation; 32 | animation: @animation; 33 | } 34 | 35 | // VARIABLES 36 | @redactorFontFamily: Arial, Helvetica, Verdana, Tahoma, sans-serif !important; 37 | @redactorCodeFontFamily: Menlo, Monaco, monospace, sans-serif !important; 38 | 39 | @redactorFontSize: 14px; 40 | @redactorLineHeight: 1.6em; 41 | 42 | /* 43 | Icon font 44 | */ 45 | @font-face { 46 | font-family: 'RedactorFont'; 47 | src: url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'), 48 | url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); 49 | font-weight: normal; 50 | font-style: normal; 51 | } 52 | 53 | 54 | /* 55 | Box 56 | */ 57 | .redactor-box { 58 | position: relative; 59 | overflow: visible; 60 | margin-bottom: 24px; 61 | 62 | & textarea { 63 | display: block; 64 | position: relative; 65 | margin: 0; 66 | padding: 0; 67 | width: 100%; 68 | overflow: auto; 69 | outline: none; 70 | border: none; 71 | background-color: #111; 72 | box-shadow: none; 73 | color: #ccc; 74 | font-size: 13px; 75 | font-family: @redactorCodeFontFamily; 76 | resize: none; 77 | &:focus { 78 | outline: none; 79 | } 80 | } 81 | } 82 | .redactor-editor, 83 | .redactor-box { 84 | background: #fff; 85 | } 86 | 87 | /* 88 | Z-index setup 89 | */ 90 | .redactor-editor, 91 | .redactor-box, 92 | .redactor-box textarea { 93 | z-index: auto; 94 | } 95 | .redactor-box-fullscreen { 96 | z-index: 1051; 97 | } 98 | .redactor-toolbar { 99 | z-index: 100; 100 | } 101 | .redactor-dropdown { 102 | z-index: 1052; 103 | } 104 | #redactor-modal-overlay, 105 | #redactor-modal-box, 106 | #redactor-modal { 107 | z-index: 1053; 108 | } 109 | 110 | /* 111 | Fullscreen 112 | */ 113 | body .redactor-box-fullscreen { 114 | position: fixed; 115 | top: 0; 116 | left: 0; 117 | width: 100%; 118 | } 119 | 120 | /* 121 | Utils 122 | */ 123 | .redactor-scrollbar-measure { 124 | position: absolute; 125 | top: -9999px; 126 | width: 50px; 127 | height: 50px; 128 | overflow: scroll; 129 | } 130 | 131 | /* 132 | Editor 133 | */ 134 | .redactor-editor { 135 | position: relative; 136 | overflow: auto; 137 | margin: 0 !important; 138 | padding: 20px; 139 | min-height: 80px; 140 | outline: none; 141 | white-space: normal; 142 | border: 1px solid #eee; 143 | font-family: @redactorFontFamily; 144 | font-size: @redactorFontSize; 145 | line-height: @redactorLineHeight; 146 | &:focus { 147 | outline: none; 148 | } 149 | } 150 | .toolbar-fixed-box + .redactor-editor { 151 | padding-top: 32px !important; 152 | } 153 | 154 | /* 155 | Placeholder 156 | */ 157 | .redactor-placeholder:after { 158 | position: absolute; 159 | top: 20px; 160 | left: 20px; 161 | content: attr(placeholder); 162 | display: block; /* For Firefox */ 163 | color: #999 !important; 164 | font-weight: normal !important; 165 | } 166 | 167 | 168 | /* 169 | Toolbar 170 | */ 171 | .redactor-toolbar { 172 | position: relative; 173 | top: 0; 174 | left: 0; 175 | margin: 0 !important; 176 | padding: 0 !important; 177 | list-style: none !important; 178 | font-size: 14px !important; 179 | line-height: 1 !important; 180 | 181 | background: #fff; 182 | border: none; 183 | box-shadow: 0 1px 2px rgba(0, 0, 0, .2); 184 | 185 | .clearfix; 186 | 187 | &.redactor-toolbar-overflow { 188 | overflow-y: auto; 189 | height: 29px; 190 | white-space: nowrap; 191 | } 192 | &.redactor-toolbar-external { 193 | z-index: 999; 194 | box-shadow: none; 195 | border: 1px solid rgba(0, 0, 0, .1); 196 | } 197 | & li { 198 | vertical-align: top; 199 | display: inline-block; 200 | margin: 0 !important; 201 | padding: 0 !important; 202 | outline: none; 203 | list-style: none !important; 204 | .box-sizing-redactor(content-box); 205 | } 206 | & li a { 207 | display: block; 208 | color: #333; 209 | text-align: center; 210 | padding: 9px 10px; 211 | cursor: pointer; 212 | outline: none; 213 | border: none; 214 | text-decoration: none; 215 | cursor: pointer; 216 | zoom: 1; 217 | .box-sizing-redactor(content-box); 218 | } 219 | & li a { 220 | &:hover { 221 | outline: none; 222 | background-color: rgba(31,120,216,1); 223 | color: #fff; 224 | } 225 | &:hover i:before { 226 | color: #fff; 227 | } 228 | &:active, 229 | &.redactor-act { 230 | outline: none; 231 | background-color: #ccc; 232 | color: #444; 233 | } 234 | } 235 | & li a.redactor-btn-image { 236 | width: 14px; 237 | height: 14px; 238 | background-position: center center; 239 | background-repeat: no-repeat; 240 | } 241 | & li a.fa-redactor-btn { 242 | display: inline-block; 243 | padding: 9px 10px 8px 10px; 244 | line-height: 1; 245 | } 246 | & li a.redactor-button-disabled { 247 | .opacity-redactor(30); 248 | &:hover { 249 | color: #333; 250 | outline: none; 251 | background-color: transparent !important; 252 | cursor: default; 253 | } 254 | } 255 | & li a.redactor-button-focus { 256 | color:#fff; 257 | background:#000; 258 | } 259 | } 260 | 261 | /* 262 | CodeMirror 263 | */ 264 | .redactor-box .CodeMirror { 265 | display: none; 266 | } 267 | 268 | /* 269 | Icons 270 | */ 271 | .re-icon { 272 | font-family: 'RedactorFont'; 273 | speak: none; 274 | font-style: normal; 275 | font-weight: normal; 276 | font-variant: normal; 277 | text-transform: none; 278 | line-height: 1; 279 | -webkit-font-smoothing: antialiased; 280 | -moz-osx-font-smoothing: grayscale; 281 | } 282 | .re-icon i:before { 283 | position: relative; 284 | font-size: 14px; 285 | } 286 | 287 | 288 | .re-video:before { 289 | content: "\e600"; 290 | } 291 | .re-unorderedlist:before { 292 | content: "\e601"; 293 | } 294 | .re-undo:before { 295 | content: "\e602"; 296 | } 297 | .re-underline:before { 298 | content: "\e603"; 299 | } 300 | .re-textdirection:before { 301 | content: "\e604"; 302 | } 303 | .re-fontcolor:before { 304 | content: "\e605"; 305 | } 306 | .re-table:before { 307 | content: "\e606"; 308 | } 309 | .re-redo:before { 310 | content: "\e607"; 311 | } 312 | .re-quote:before { 313 | content: "\e608"; 314 | } 315 | .re-outdent:before { 316 | content: "\e609"; 317 | } 318 | .re-orderedlist:before { 319 | content: "\e60a"; 320 | } 321 | .re-link:before { 322 | content: "\e60b"; 323 | } 324 | .re-horizontalrule:before { 325 | content: "\e60c"; 326 | } 327 | .re-italic:before { 328 | content: "\e60d"; 329 | } 330 | .re-indent:before { 331 | content: "\e60e"; 332 | } 333 | .re-image:before { 334 | content: "\e60f"; 335 | } 336 | .re-fullscreen:before { 337 | content: "\e610"; 338 | } 339 | .re-normalscreen:before { 340 | content: "\e611"; 341 | } 342 | .re-formatting:before { 343 | content: "\e612"; 344 | } 345 | .re-fontsize:before { 346 | content: "\e613"; 347 | } 348 | .re-fontfamily:before { 349 | content: "\e614"; 350 | } 351 | .re-deleted:before { 352 | content: "\e615"; 353 | } 354 | .re-html:before { 355 | content: "\e616"; 356 | } 357 | .re-clips:before { 358 | content: "\e617"; 359 | } 360 | .re-bold:before { 361 | content: "\e618"; 362 | } 363 | .re-backcolor:before { 364 | content: "\e619"; 365 | } 366 | .re-file:before { 367 | content: "\e61a"; 368 | } 369 | .re-alignright:before { 370 | content: "\e61b"; 371 | } 372 | .re-alignment:before, 373 | .re-alignleft:before { 374 | content: "\e61c"; 375 | } 376 | .re-alignjustify:before { 377 | content: "\e61d"; 378 | } 379 | .re-aligncenter:before { 380 | content: "\e61e"; 381 | } 382 | .re-gallery:before { 383 | content: "\e61f"; 384 | } 385 | 386 | 387 | /* 388 | Toolbar tooltip 389 | */ 390 | .redactor-toolbar-tooltip { 391 | position: absolute; 392 | z-index: 1054; 393 | text-align: center; 394 | top: 0; 395 | left: 0; 396 | background: #000; 397 | color: #fff; 398 | padding: 5px 8px; 399 | line-height: 1; 400 | font-family: @redactorFontFamily; 401 | font-size: 12px; 402 | border-radius: 2px; 403 | } 404 | 405 | 406 | /* 407 | Dropdown 408 | */ 409 | .redactor-dropdown { 410 | position: absolute; 411 | top: 28px; 412 | left: 0; 413 | padding: 0; 414 | min-width: 220px; 415 | max-height: 254px; 416 | overflow: auto; 417 | background-color: #fff; 418 | box-shadow: 0 1px 7px rgba(0, 0, 0, .25); 419 | font-size: @redactorFontSize; 420 | font-family: @redactorFontFamily; 421 | line-height: @redactorLineHeight; 422 | & a { 423 | display: block; 424 | padding: 10px 15px; 425 | color: #000; 426 | text-decoration: none; 427 | border-bottom: 1px solid rgba(0, 0, 0, .07); 428 | &:last-child { 429 | border-bottom: none; 430 | } 431 | &:hover { 432 | background-color: rgba(31, 120, 216, 1); 433 | color: #fff !important; 434 | text-decoration: none; 435 | } 436 | &.selected { 437 | background-color: #000; 438 | color: #fff; 439 | } 440 | &.redactor-dropdown-link-inactive, 441 | &.redactor-dropdown-link-inactive:hover { 442 | background: none; 443 | cursor: default; 444 | color: #000 !important; 445 | .opacity-redactor(40); 446 | } 447 | &.redactor-dropdown-link-selected { 448 | color:#fff; 449 | background:#000; 450 | } 451 | } 452 | } 453 | 454 | 455 | /* 456 | IMAGE BOX 457 | */ 458 | #redactor-image-box { 459 | position: relative; 460 | max-width: 100%; 461 | display: inline-block; 462 | line-height: 0; 463 | outline: 1px dashed rgba(0, 0, 0, .6), 464 | } 465 | #redactor-image-editter { 466 | position: absolute; 467 | z-index: 5; 468 | top: 50%; 469 | left: 50%; 470 | margin-top: -11px; 471 | margin-left: -18px; 472 | line-height: 1; 473 | background-color: #000; 474 | color: #fff; 475 | font-size: 11px; 476 | padding: 7px 10px; 477 | cursor: pointer; 478 | } 479 | #redactor-image-resizer { 480 | position: absolute; 481 | z-index: 2; 482 | line-height: 1; 483 | cursor: nw-resize; 484 | bottom: -4px; 485 | right: -5px; 486 | border: 1px solid #fff; 487 | background-color: #000; 488 | width: 8px; 489 | height: 8px; 490 | } 491 | 492 | 493 | 494 | /* 495 | LINK TOOLTIP 496 | */ 497 | .redactor-link-tooltip { 498 | position: absolute; 499 | z-index: 99; 500 | padding: 10px; 501 | line-height: 1; 502 | display: inline-block; 503 | background-color: #000; 504 | color: #555 !important; 505 | } 506 | .redactor-link-tooltip, 507 | .redactor-link-tooltip a { 508 | font-size: 12px; 509 | font-family: @redactorFontFamily; 510 | } 511 | .redactor-link-tooltip a { 512 | color: #ccc; 513 | margin: 0 5px; 514 | text-decoration: none; 515 | &:hover { 516 | color: #fff; 517 | } 518 | } 519 | 520 | /* 521 | DROPAREA 522 | */ 523 | #redactor-droparea { 524 | position: relative; 525 | overflow: hidden; 526 | padding: 140px 20px; 527 | border: 3px dashed rgba(0, 0, 0, .1); 528 | &.drag-hover { 529 | background: rgba(200, 222, 250, 0.75); 530 | } 531 | &.drag-drop { 532 | background: rgba(250, 248, 200, 0.5); 533 | } 534 | } 535 | #redactor-droparea-placeholder { 536 | text-align: center; 537 | font-size: 12px; 538 | color: rgba(0, 0, 0, .7); 539 | } 540 | 541 | 542 | /* 543 | PROGRESS 544 | */ 545 | #redactor-progress { 546 | position: fixed; 547 | top: 0; 548 | left: 0; 549 | width: 100%; 550 | z-index: 1000000; 551 | height: 10px; 552 | } 553 | #redactor-progress span { 554 | display: block; 555 | width: 100%; 556 | height: 100%; 557 | background-color: #3d58a8; 558 | .striped-redactor(); 559 | .animation-redactor(progress-bar-stripes 2s linear infinite); 560 | background-size: 40px 40px; 561 | } 562 | 563 | @-webkit-keyframes progress-bar-stripes { 564 | from { background-position: 40px 0; } 565 | to { background-position: 0 0; } 566 | } 567 | @-o-keyframes progress-bar-stripes { 568 | from { background-position: 40px 0; } 569 | to { background-position: 0 0; } 570 | } 571 | @keyframes progress-bar-stripes { 572 | from { background-position: 40px 0; } 573 | to { background-position: 0 0; } 574 | } 575 | 576 | 577 | /* 578 | MODAL 579 | */ 580 | #redactor-modal-overlay { 581 | position: fixed; 582 | top: 0; 583 | left: 0; 584 | margin: auto; 585 | overflow: auto; 586 | width: 100%; 587 | height: 100%; 588 | background-color: #000 !important; 589 | .opacity-redactor(30); 590 | } 591 | #redactor-modal-box { 592 | position: fixed; 593 | top: 0; 594 | left: 0; 595 | bottom: 0; 596 | right: 0; 597 | overflow-x: hidden; 598 | overflow-y: auto; 599 | } 600 | #redactor-modal { 601 | outline:0; 602 | position: relative; 603 | margin: auto; 604 | margin-bottom: 20px; 605 | padding: 0; 606 | background: #fff; 607 | color: #000; 608 | font-size: 14px !important; 609 | font-family: @redactorFontFamily; 610 | box-shadow: 0 1px 70px rgba(0, 0, 0, .5); 611 | 612 | & header { 613 | padding: 30px 40px 5px 40px; 614 | font-size: 18px; 615 | font-weight: bold; 616 | } 617 | & section { 618 | padding: 30px 40px 50px 40px; 619 | } 620 | & label { 621 | display: block; 622 | float: none !important; 623 | margin: 15px 0 3px 0 !important; 624 | padding: 0; 625 | } 626 | & input[type="radio"], 627 | & input[type="checkbox"] { 628 | position: relative; 629 | top: -1px; 630 | } 631 | & select { 632 | width: 100%; 633 | } 634 | & input[type="text"], 635 | & input[type="password"], 636 | & input[type="email"], 637 | & input[type="url"], 638 | & textarea { 639 | position: relative; 640 | z-index: 2; 641 | margin: 0; 642 | padding: 5px 4px; 643 | height: 28px; 644 | border: 1px solid #ccc; 645 | border-radius: 1px; 646 | background-color: white; 647 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset; 648 | color: #333; 649 | width: 100%; 650 | font-size: 14px; 651 | font-family: @redactorFontFamily; 652 | .transition-redactor(border 0.3s ease-in); 653 | &:focus { 654 | outline: none; 655 | border-color: #5ca9e4; 656 | box-shadow: 0 0 0 2px rgba(70, 161, 231, .3), 0 1px 2px rgba(0, 0, 0, .2) inset; 657 | } 658 | &.redactor-input-error { 659 | border-color: #e82f2f; 660 | box-shadow: 0 0 0 2px rgba(232, 47, 47, .3), 0 1px 2px rgba(0, 0, 0, .2) inset; 661 | } 662 | } 663 | & textarea { 664 | display: block; 665 | margin-top: 4px; 666 | line-height: 1.4em; 667 | } 668 | 669 | } 670 | 671 | /* 672 | Tabs in Modal 673 | */ 674 | #redactor-modal-tabber { 675 | margin-bottom: 15px; 676 | font-size: 12px; 677 | & a { 678 | border: 1px solid #ddd; 679 | line-height: 1; 680 | padding: 8px 15px; 681 | margin-right: -1px; 682 | text-decoration: none; 683 | color: #000; 684 | &:hover { 685 | background-color: rgba(31,120,216,1); 686 | border-color: rgba(31,120,216,1); 687 | color: #fff; 688 | } 689 | &.active { 690 | cursor: default; 691 | background-color: #ddd; 692 | border-color: #ddd; 693 | color: rgba(0, 0, 0, .6); 694 | } 695 | } 696 | } 697 | 698 | 699 | /* 700 | List in Modal 701 | */ 702 | #redactor-modal { 703 | #redactor-modal-list { 704 | margin-left: 0; 705 | padding-left: 0; 706 | list-style: none; 707 | max-height: 250px; 708 | overflow-x: auto; 709 | & li { 710 | border-bottom: 1px solid #ddd; 711 | &:last-child { 712 | border-bottom: none; 713 | } 714 | } 715 | 716 | & a { 717 | padding: 10px 5px; 718 | color: #000; 719 | text-decoration: none; 720 | font-size: 13px; 721 | display: block; 722 | position: relative; 723 | &:hover { 724 | background-color: #eee; 725 | } 726 | } 727 | } 728 | } 729 | 730 | #redactor-modal-close { 731 | position: absolute; 732 | top: 10px; 733 | right: 10px; 734 | width: 30px; 735 | height: 30px; 736 | text-align: right; 737 | color: #bbb; 738 | font-size: 30px; 739 | font-weight: 300; 740 | cursor: pointer; 741 | -webkit-appearance: none; 742 | padding:0; 743 | border:0; 744 | background:0; 745 | outline:none; 746 | &:hover { 747 | color: #000; 748 | } 749 | 750 | } 751 | #redactor-modal footer button { 752 | position: relative; 753 | width: 100%; 754 | padding: 14px 16px; 755 | margin: 0; 756 | outline: none; 757 | border: none; 758 | background-color: #ddd; 759 | color: #000; 760 | text-align: center; 761 | text-decoration: none; 762 | font-weight: normal; 763 | font-size: 12px; 764 | font-family: @redactorFontFamily; 765 | line-height: 1; 766 | cursor: pointer; 767 | 768 | &:hover { 769 | color: #777; 770 | background: none; 771 | background: #bbb; 772 | text-decoration: none; 773 | } 774 | 775 | &.redactor-modal-delete-btn { 776 | background: none; 777 | color: #fff; 778 | background-color: #b52525; 779 | &:hover { 780 | color: rgba(255, 255, 255, .6); 781 | background-color: #881b1b; 782 | } 783 | } 784 | &.redactor-modal-action-btn { 785 | background: none; 786 | color: #fff; 787 | background-color: #2461b5; 788 | &:hover { 789 | color: rgba(255, 255, 255, .6); 790 | background-color: #1a4580; 791 | } 792 | } 793 | } 794 | 795 | 796 | /* 797 | ############################################## 798 | 799 | DROPDOWN FORMATTING 800 | 801 | ############################################## 802 | */ 803 | .redactor-dropdown { 804 | & .redactor-formatting-blockquote { 805 | color: rgba(0, 0, 0, .4); 806 | font-style: italic; 807 | } 808 | & .redactor-formatting-pre { 809 | font-family: monospace, sans-serif; 810 | } 811 | & .redactor-formatting-h1 { 812 | font-size: 36px; 813 | line-height: 36px; 814 | font-weight: bold; 815 | } 816 | & .redactor-formatting-h2 { 817 | font-size: 24px; 818 | line-height: 36px; 819 | font-weight: bold; 820 | } 821 | & .redactor-formatting-h3 { 822 | font-size: 21px; 823 | line-height: 30px; 824 | font-weight: bold; 825 | } 826 | & .redactor-formatting-h4 { 827 | font-size: 18px; 828 | line-height: 26px; 829 | font-weight: bold; 830 | } 831 | & .redactor-formatting-h5 { 832 | font-size: 16px; 833 | line-height: 23px; 834 | font-weight: bold; 835 | } 836 | } 837 | 838 | 839 | /* 840 | ############################################## 841 | 842 | CONTENT STYLES 843 | 844 | ############################################## 845 | */ 846 | .redactor-editor { 847 | code, 848 | pre { 849 | font-family: @redactorCodeFontFamily; 850 | cursor: text; 851 | } 852 | div, 853 | p, 854 | ul, 855 | ol, 856 | table, 857 | dl, 858 | blockquote, 859 | pre { 860 | font-size: @redactorFontSize; 861 | line-height: @redactorLineHeight; 862 | } 863 | a { 864 | color: #15c; 865 | text-decoration: underline; 866 | } 867 | 868 | object, 869 | embed, 870 | video, 871 | img { 872 | max-width: 100%; 873 | width: auto; 874 | } 875 | video, 876 | img { 877 | height: auto; 878 | } 879 | div, 880 | p, 881 | ul, 882 | ol, 883 | table, 884 | dl, 885 | figure, 886 | blockquote, 887 | pre { 888 | margin: 0; 889 | margin-bottom: 15px; 890 | border: none; 891 | background: none; 892 | box-shadow: none; 893 | } 894 | iframe, 895 | object, 896 | hr { 897 | margin-bottom: 15px; 898 | } 899 | blockquote { 900 | margin-left: 1.6em !important; 901 | padding: 0; 902 | text-align: left; 903 | color: #777; 904 | font-style: italic; 905 | &:before, 906 | &:after { 907 | content: ''; 908 | } 909 | } 910 | ul, 911 | ol { 912 | padding-left: 2em; 913 | } 914 | ul ul, 915 | ol ol, 916 | ul ol, 917 | ol ul { 918 | margin: 2px; 919 | padding: 0; 920 | padding-left: 2em; 921 | border: none; 922 | } 923 | ol ol li { 924 | list-style-type: lower-alpha; 925 | } 926 | ol ol ol li { 927 | list-style-type: lower-roman; 928 | } 929 | dl dt { 930 | font-weight: bold; 931 | } 932 | dd { 933 | margin-left: 1em; 934 | } 935 | table { 936 | border-collapse: collapse; 937 | font-size: 1em; 938 | width: 100%; 939 | & td, 940 | & th { 941 | padding: 5px; 942 | border: 1px solid #ddd; 943 | vertical-align: top; 944 | } 945 | } 946 | table thead td, 947 | table th { 948 | font-weight: bold; 949 | border-bottom-color: #888; 950 | } 951 | code { 952 | background-color: #d8d7d7; 953 | } 954 | pre { 955 | padding: 1em; 956 | border: 1px solid #ddd; 957 | border-radius: 3px; 958 | background: #f8f8f8; 959 | font-size: 90%; 960 | } 961 | hr { 962 | display: block; 963 | height: 1px; 964 | border: 0; 965 | border-top: 1px solid #ccc; 966 | } 967 | h1, 968 | h2, 969 | h3, 970 | h4, 971 | h5, 972 | h6 { 973 | font-weight: bold; 974 | color: #000; 975 | padding: 0; 976 | background: none; 977 | text-rendering: optimizeLegibility; 978 | margin: 0 0 .5em 0; 979 | } 980 | h1, 981 | h2, 982 | h3, 983 | h4 { 984 | line-height: 1.3; 985 | } 986 | h1 { 987 | font-size: 36px; 988 | } 989 | h2 { 990 | font-size: 24px; 991 | margin-bottom: .7em; 992 | } 993 | h3 { 994 | font-size: 21px; 995 | } 996 | h4 { 997 | font-size: 18px; 998 | } 999 | h5 { 1000 | font-size: 16px; 1001 | } 1002 | h6 { 1003 | font-size: 12px; 1004 | text-transform: uppercase; 1005 | } 1006 | } --------------------------------------------------------------------------------