Server : Apache System : Linux iZ2vcgyutqttsd1p850kl8Z 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64 User : www ( 1000) PHP Version : 5.6.40 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv Directory : /www/wwwroot/saimikebio.com/mobile/include/kindeditor/plugins/table/ |
/******************************************************************************* * KindEditor - WYSIWYG HTML Editor for Internet * Copyright (C) 2006-2011 kindsoft.net * * @author Roddy <luolonghao@gmail.com> * @site http://www.kindsoft.net/ * @licence http://www.kindsoft.net/license.php *******************************************************************************/ KindEditor.plugin('table', function(K) { var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder'; // 设置颜色 function _setColor(box, color) { color = color.toUpperCase(); box.css('background-color', color); box.css('color', color === '#000000' ? '#FFFFFF' : '#000000'); box.html(color); } // 初始化取色器 var pickerList = []; function _initColorPicker(dialogDiv, colorBox) { colorBox.bind('click,mousedown', function(e){ e.stopPropagation(); }); function removePicker() { K.each(pickerList, function() { this.remove(); }); pickerList = []; K(document).unbind('click,mousedown', removePicker); dialogDiv.unbind('click,mousedown', removePicker); } colorBox.click(function(e) { removePicker(); var box = K(this), pos = box.pos(); var picker = K.colorpicker({ x : pos.x, y : pos.y + box.height(), z : 811214, selectedColor : K(this).html(), colors : self.colorTable, noColor : self.lang('noColor'), shadowMode : self.shadowMode, click : function(color) { _setColor(box, color); removePicker(); } }); pickerList.push(picker); K(document).bind('click,mousedown', removePicker); dialogDiv.bind('click,mousedown', removePicker); }); } // 取得下一行cell的index function _getCellIndex(table, row, cell) { var rowSpanCount = 0; for (var i = 0, len = row.cells.length; i < len; i++) { if (row.cells[i] == cell) { break; } rowSpanCount += row.cells[i].rowSpan - 1; } return cell.cellIndex - rowSpanCount; } self.plugin.table = { //insert or modify table prop : function(isInsert) { var html = [ '<div style="padding:20px;">', //rows, cols '<div class="ke-dialog-row">', '<label for="keRows" style="width:90px;">' + lang.cells + '</label>', lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> ', lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />', '</div>', //width, height '<div class="ke-dialog-row">', '<label for="keWidth" style="width:90px;">' + lang.size + '</label>', lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ', '<select name="widthType">', '<option value="%">' + lang.percent + '</option>', '<option value="px">' + lang.px + '</option>', '</select> ', lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ', '<select name="heightType">', '<option value="%">' + lang.percent + '</option>', '<option value="px">' + lang.px + '</option>', '</select>', '</div>', //space, padding '<div class="ke-dialog-row">', '<label for="kePadding" style="width:90px;">' + lang.space + '</label>', lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> ', lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />', '</div>', //align '<div class="ke-dialog-row">', '<label for="keAlign" style="width:90px;">' + lang.align + '</label>', '<select id="keAlign" name="align">', '<option value="">' + lang.alignDefault + '</option>', '<option value="left">' + lang.alignLeft + '</option>', '<option value="center">' + lang.alignCenter + '</option>', '<option value="right">' + lang.alignRight + '</option>', '</select>', '</div>', //border '<div class="ke-dialog-row">', '<label for="keBorder" style="width:90px;">' + lang.border + '</label>', lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> ', lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>', '</div>', //background color '<div class="ke-dialog-row">', '<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>', '<span class="ke-inline-block ke-input-color"></span>', '</div>', '</div>' ].join(''); var bookmark = self.cmd.range.createBookmark(); var dialog = self.createDialog({ name : name, width : 500, title : self.lang(name), body : html, beforeRemove : function() { colorBox.unbind(); }, yesBtn : { name : self.lang('yes'), click : function(e) { var rows = rowsBox.val(), cols = colsBox.val(), width = widthBox.val(), height = heightBox.val(), widthType = widthTypeBox.val(), heightType = heightTypeBox.val(), padding = paddingBox.val(), spacing = spacingBox.val(), align = alignBox.val(), border = borderBox.val(), borderColor = K(colorBox[0]).html() || '', bgColor = K(colorBox[1]).html() || ''; if (rows == 0 || !/^\d+$/.test(rows)) { alert(self.lang('invalidRows')); rowsBox[0].focus(); return; } if (cols == 0 || !/^\d+$/.test(cols)) { alert(self.lang('invalidRows')); colsBox[0].focus(); return; } if (!/^\d*$/.test(width)) { alert(self.lang('invalidWidth')); widthBox[0].focus(); return; } if (!/^\d*$/.test(height)) { alert(self.lang('invalidHeight')); heightBox[0].focus(); return; } if (!/^\d*$/.test(padding)) { alert(self.lang('invalidPadding')); paddingBox[0].focus(); return; } if (!/^\d*$/.test(spacing)) { alert(self.lang('invalidSpacing')); spacingBox[0].focus(); return; } if (!/^\d*$/.test(border)) { alert(self.lang('invalidBorder')); borderBox[0].focus(); return; } //modify table if (table) { if (width !== '') { table.width(width + widthType); } else { table.css('width', ''); } if (table[0].width !== undefined) { table.removeAttr('width'); } if (height !== '') { table.height(height + heightType); } else { table.css('height', ''); } if (table[0].height !== undefined) { table.removeAttr('height'); } table.css('background-color', bgColor); if (table[0].bgColor !== undefined) { table.removeAttr('bgColor'); } if (padding !== '') { table[0].cellPadding = padding; } else { table.removeAttr('cellPadding'); } if (spacing !== '') { table[0].cellSpacing = spacing; } else { table.removeAttr('cellSpacing'); } if (align !== '') { table[0].align = align; } else { table.removeAttr('align'); } if (border !== '') { table.attr('border', border); } else { table.removeAttr('border'); } if (border === '' || border === '0') { table.addClass(zeroborder); } else { table.removeClass(zeroborder); } if (borderColor !== '') { table.attr('borderColor', borderColor); } else { table.removeAttr('borderColor'); } self.hideDialog().focus(); self.cmd.range.moveToBookmark(bookmark); self.cmd.select(); self.addBookmark(); return; } //insert new table var style = ''; if (width !== '') { style += 'width:' + width + widthType + ';'; } if (height !== '') { style += 'height:' + height + heightType + ';'; } if (bgColor !== '') { style += 'background-color:' + bgColor + ';'; } var html = '<table'; if (style !== '') { html += ' style="' + style + '"'; } if (padding !== '') { html += ' cellpadding="' + padding + '"'; } if (spacing !== '') { html += ' cellspacing="' + spacing + '"'; } if (align !== '') { html += ' align="' + align + '"'; } if (border !== '') { html += ' border="' + border + '"'; } if (border === '' || border === '0') { html += ' class="' + zeroborder + '"'; } if (borderColor !== '') { html += ' bordercolor="' + borderColor + '"'; } html += '>'; for (var i = 0; i < rows; i++) { html += '<tr>'; for (var j = 0; j < cols; j++) { html += '<td>' + (K.IE ? ' ' : '<br />') + '</td>'; } html += '</tr>'; } html += '</table>'; if (!K.IE) { html += '<br />'; } self.insertHtml(html); self.select().hideDialog().focus(); self.addBookmark(); } } }), div = dialog.div, rowsBox = K('[name="rows"]', div).val(3), colsBox = K('[name="cols"]', div).val(2), widthBox = K('[name="width"]', div).val(100), heightBox = K('[name="height"]', div), widthTypeBox = K('[name="widthType"]', div), heightTypeBox = K('[name="heightType"]', div), paddingBox = K('[name="padding"]', div).val(2), spacingBox = K('[name="spacing"]', div).val(0), alignBox = K('[name="align"]', div), borderBox = K('[name="border"]', div).val(1), colorBox = K('.ke-input-color', div); _initColorPicker(div, colorBox.eq(0)); _initColorPicker(div, colorBox.eq(1)); _setColor(colorBox.eq(0), '#000000'); _setColor(colorBox.eq(1), ''); // foucs and select rowsBox[0].focus(); rowsBox[0].select(); var table; if (isInsert) { return; } //get selected table node table = self.plugin.getSelectedTable(); if (table) { rowsBox.val(table[0].rows.length); colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0); rowsBox.attr('disabled', true); colsBox.attr('disabled', true); var match, tableWidth = table[0].style.width || table[0].width, tableHeight = table[0].style.height || table[0].height; if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) { widthBox.val(match[1]); widthTypeBox.val(match[2]); } else { widthBox.val(''); } if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) { heightBox.val(match[1]); heightTypeBox.val(match[2]); } paddingBox.val(table[0].cellPadding || ''); spacingBox.val(table[0].cellSpacing || ''); alignBox.val(table[0].align || ''); borderBox.val(table[0].border === undefined ? '' : table[0].border); _setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || '')); _setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || '')); widthBox[0].focus(); widthBox[0].select(); } }, //modify cell cellprop : function() { var html = [ '<div style="padding:20px;">', //width, height '<div class="ke-dialog-row">', '<label for="keWidth" style="width:90px;">' + lang.size + '</label>', lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ', '<select name="widthType">', '<option value="%">' + lang.percent + '</option>', '<option value="px">' + lang.px + '</option>', '</select> ', lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ', '<select name="heightType">', '<option value="%">' + lang.percent + '</option>', '<option value="px">' + lang.px + '</option>', '</select>', '</div>', //align '<div class="ke-dialog-row">', '<label for="keAlign" style="width:90px;">' + lang.align + '</label>', lang.textAlign + ' <select id="keAlign" name="textAlign">', '<option value="">' + lang.alignDefault + '</option>', '<option value="left">' + lang.alignLeft + '</option>', '<option value="center">' + lang.alignCenter + '</option>', '<option value="right">' + lang.alignRight + '</option>', '</select> ', lang.verticalAlign + ' <select name="verticalAlign">', '<option value="">' + lang.alignDefault + '</option>', '<option value="top">' + lang.alignTop + '</option>', '<option value="middle">' + lang.alignMiddle + '</option>', '<option value="bottom">' + lang.alignBottom + '</option>', '<option value="baseline">' + lang.alignBaseline + '</option>', '</select>', '</div>', //border '<div class="ke-dialog-row">', '<label for="keBorder" style="width:90px;">' + lang.border + '</label>', lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> ', lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>', '</div>', //background color '<div class="ke-dialog-row">', '<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>', '<span class="ke-inline-block ke-input-color"></span>', '</div>', '</div>' ].join(''); var bookmark = self.cmd.range.createBookmark(); var dialog = self.createDialog({ name : name, width : 500, title : self.lang('tablecell'), body : html, beforeRemove : function() { colorBox.unbind(); }, yesBtn : { name : self.lang('yes'), click : function(e) { var width = widthBox.val(), height = heightBox.val(), widthType = widthTypeBox.val(), heightType = heightTypeBox.val(), padding = paddingBox.val(), spacing = spacingBox.val(), textAlign = textAlignBox.val(), verticalAlign = verticalAlignBox.val(), border = borderBox.val(), borderColor = K(colorBox[0]).html() || '', bgColor = K(colorBox[1]).html() || ''; if (!/^\d*$/.test(width)) { alert(self.lang('invalidWidth')); widthBox[0].focus(); return; } if (!/^\d*$/.test(height)) { alert(self.lang('invalidHeight')); heightBox[0].focus(); return; } if (!/^\d*$/.test(border)) { alert(self.lang('invalidBorder')); borderBox[0].focus(); return; } cell.css({ width : width !== '' ? (width + widthType) : '', height : height !== '' ? (height + heightType) : '', 'background-color' : bgColor, 'text-align' : textAlign, 'vertical-align' : verticalAlign, 'border-width' : border, 'border-style' : border !== '' ? 'solid' : '', 'border-color' : borderColor }); self.hideDialog().focus(); self.cmd.range.moveToBookmark(bookmark); self.cmd.select(); self.addBookmark(); } } }), div = dialog.div, widthBox = K('[name="width"]', div).val(100), heightBox = K('[name="height"]', div), widthTypeBox = K('[name="widthType"]', div), heightTypeBox = K('[name="heightType"]', div), paddingBox = K('[name="padding"]', div).val(2), spacingBox = K('[name="spacing"]', div).val(0), textAlignBox = K('[name="textAlign"]', div), verticalAlignBox = K('[name="verticalAlign"]', div), borderBox = K('[name="border"]', div).val(1), colorBox = K('.ke-input-color', div); _initColorPicker(div, colorBox.eq(0)); _initColorPicker(div, colorBox.eq(1)); _setColor(colorBox.eq(0), '#000000'); _setColor(colorBox.eq(1), ''); // foucs and select widthBox[0].focus(); widthBox[0].select(); // get selected cell var cell = self.plugin.getSelectedCell(); var match, cellWidth = cell[0].style.width || cell[0].width || '', cellHeight = cell[0].style.height || cell[0].height || ''; if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) { widthBox.val(match[1]); widthTypeBox.val(match[2]); } else { widthBox.val(''); } if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) { heightBox.val(match[1]); heightTypeBox.val(match[2]); } textAlignBox.val(cell[0].style.textAlign || ''); verticalAlignBox.val(cell[0].style.verticalAlign || ''); var border = cell[0].style.borderWidth || ''; if (border) { border = parseInt(border); } borderBox.val(border); _setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || '')); _setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || '')); widthBox[0].focus(); widthBox[0].select(); }, insert : function() { this.prop(true); }, 'delete' : function() { var table = self.plugin.getSelectedTable(); self.cmd.range.setStartBefore(table[0]).collapse(true); self.cmd.select(); table.remove(); self.addBookmark(); }, colinsert : function(offset) { var table = self.plugin.getSelectedTable()[0], row = self.plugin.getSelectedRow()[0], cell = self.plugin.getSelectedCell()[0], index = cell.cellIndex + offset; // 取得第一行的index index += table.rows[0].cells.length - row.cells.length; for (var i = 0, len = table.rows.length; i < len; i++) { var newRow = table.rows[i], newCell = newRow.insertCell(index); newCell.innerHTML = K.IE ? '' : '<br />'; // 调整下一行的单元格index index = _getCellIndex(table, newRow, newCell); } self.cmd.range.selectNodeContents(cell).collapse(true); self.cmd.select(); self.addBookmark(); }, colinsertleft : function() { this.colinsert(0); }, colinsertright : function() { this.colinsert(1); }, rowinsert : function(offset) { var table = self.plugin.getSelectedTable()[0], row = self.plugin.getSelectedRow()[0], cell = self.plugin.getSelectedCell()[0]; var rowIndex = row.rowIndex; if (offset === 1) { rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset; } var newRow = table.insertRow(rowIndex); for (var i = 0, len = row.cells.length; i < len; i++) { // 调整cell个数 if (row.cells[i].rowSpan > 1) { len -= row.cells[i].rowSpan - 1; } var newCell = newRow.insertCell(i); // copy colspan if (offset === 1 && row.cells[i].colSpan > 1) { newCell.colSpan = row.cells[i].colSpan; } newCell.innerHTML = K.IE ? '' : '<br />'; } // 调整rowspan for (var j = rowIndex; j >= 0; j--) { var cells = table.rows[j].cells; if (cells.length > i) { for (var k = cell.cellIndex; k >= 0; k--) { if (cells[k].rowSpan > 1) { cells[k].rowSpan += 1; } } break; } } self.cmd.range.selectNodeContents(cell).collapse(true); self.cmd.select(); self.addBookmark(); }, rowinsertabove : function() { this.rowinsert(0); }, rowinsertbelow : function() { this.rowinsert(1); }, rowmerge : function() { var table = self.plugin.getSelectedTable()[0], row = self.plugin.getSelectedRow()[0], cell = self.plugin.getSelectedCell()[0], rowIndex = row.rowIndex, // 当前行的index nextRowIndex = rowIndex + cell.rowSpan, // 下一行的index nextRow = table.rows[nextRowIndex]; // 下一行 // 最后一行不能合并 if (table.rows.length <= nextRowIndex) { return; } var cellIndex = cell.cellIndex; // 下一行单元格的index if (nextRow.cells.length <= cellIndex) { return; } var nextCell = nextRow.cells[cellIndex]; // 下一行单元格 // 上下行的colspan不一致时不能合并 if (cell.colSpan !== nextCell.colSpan) { return; } cell.rowSpan += nextCell.rowSpan; nextRow.deleteCell(cellIndex); self.cmd.range.selectNodeContents(cell).collapse(true); self.cmd.select(); self.addBookmark(); }, colmerge : function() { var table = self.plugin.getSelectedTable()[0], row = self.plugin.getSelectedRow()[0], cell = self.plugin.getSelectedCell()[0], rowIndex = row.rowIndex, // 当前行的index cellIndex = cell.cellIndex, nextCellIndex = cellIndex + 1; // 最后一列不能合并 if (row.cells.length <= nextCellIndex) { return; } var nextCell = row.cells[nextCellIndex]; // 左右列的rowspan不一致时不能合并 if (cell.rowSpan !== nextCell.rowSpan) { return; } cell.colSpan += nextCell.colSpan; row.deleteCell(nextCellIndex); self.cmd.range.selectNodeContents(cell).collapse(true); self.cmd.select(); self.addBookmark(); }, rowsplit : function() { var table = self.plugin.getSelectedTable()[0], row = self.plugin.getSelectedRow()[0], cell = self.plugin.getSelectedCell()[0], rowIndex = row.rowIndex; // 不是可分割单元格 if (cell.rowSpan === 1) { return; } var cellIndex = _getCellIndex(table, row, cell); for (var i = 1, len = cell.rowSpan; i < len; i++) { var newRow = table.rows[rowIndex + i], newCell = newRow.insertCell(cellIndex); if (cell.colSpan > 1) { newCell.colSpan = cell.colSpan; } newCell.innerHTML = K.IE ? '' : '<br />'; // 调整下一行的单元格index cellIndex = _getCellIndex(table, newRow, newCell); } K(cell).removeAttr('rowSpan'); self.cmd.range.selectNodeContents(cell).collapse(true); self.cmd.select(); self.addBookmark(); }, colsplit : function() { var table = self.plugin.getSelectedTable()[0], row = self.plugin.getSelectedRow()[0], cell = self.plugin.getSelectedCell()[0], cellIndex = cell.cellIndex; // 不是可分割单元格 if (cell.colSpan === 1) { return; } for (var i = 1, len = cell.colSpan; i < len; i++) { var newCell = row.insertCell(cellIndex + i); if (cell.rowSpan > 1) { newCell.rowSpan = cell.rowSpan; } newCell.innerHTML = K.IE ? '' : '<br />'; } K(cell).removeAttr('colSpan'); self.cmd.range.selectNodeContents(cell).collapse(true); self.cmd.select(); self.addBookmark(); }, coldelete : function() { var table = self.plugin.getSelectedTable()[0], row = self.plugin.getSelectedRow()[0], cell = self.plugin.getSelectedCell()[0], index = cell.cellIndex; for (var i = 0, len = table.rows.length; i < len; i++) { var newRow = table.rows[i], newCell = newRow.cells[index]; if (newCell.colSpan > 1) { newCell.colSpan -= 1; if (newCell.colSpan === 1) { K(newCell).removeAttr('colSpan'); } } else { newRow.deleteCell(index); } // 跳过不需要删除的行 if (newCell.rowSpan > 1) { i += newCell.rowSpan - 1; } } if (row.cells.length === 0) { self.cmd.range.setStartBefore(table).collapse(true); self.cmd.select(); K(table).remove(); } else { self.cmd.selection(true); } self.addBookmark(); }, rowdelete : function() { var table = self.plugin.getSelectedTable()[0], row = self.plugin.getSelectedRow()[0], cell = self.plugin.getSelectedCell()[0], rowIndex = row.rowIndex; // 从下到上删除 for (var i = cell.rowSpan - 1; i >= 0; i--) { table.deleteRow(rowIndex + i); } if (table.rows.length === 0) { self.cmd.range.setStartBefore(table).collapse(true); self.cmd.select(); K(table).remove(); } else { self.cmd.selection(true); } self.addBookmark(); } }; self.clickToolbar(name, self.plugin.table.prop); });