|
@@ -1,932 +0,0 @@
|
|
|
-import $ from './dom-core';
|
|
|
-import {getParentNodeByClass, isEmptyElement} from './util.js'
|
|
|
-let questionPrevUtils = function () {
|
|
|
- this.currentParaghSize = {};
|
|
|
-}
|
|
|
-
|
|
|
-questionPrevUtils.prototype = {
|
|
|
- constructor: questionPrevUtils,
|
|
|
- /**
|
|
|
- * function 客观题获取最后一行【不在框内】
|
|
|
- * @param {DomElement} $lastparagraph
|
|
|
- */
|
|
|
- _getLastNodeByLastparagraphNormal: function ($lastparagraph) {
|
|
|
- let lastchild = $lastparagraph[0].lastChild;
|
|
|
- if (lastchild.nodeType === 3) {
|
|
|
- return {
|
|
|
- type: 1,
|
|
|
- dom: lastchild
|
|
|
- };
|
|
|
- } else if (lastchild.tagName.toLowerCase() === 'br'){
|
|
|
- $(lastchild).remove();
|
|
|
- return this._getLastNodeByLastparagraphNormal($lastparagraph);
|
|
|
- } else {
|
|
|
- if (lastchild.className) {
|
|
|
- if (lastchild.className.indexOf('js-lsiten-border') > -1) {
|
|
|
- return {
|
|
|
- type: 0,
|
|
|
- dom: null
|
|
|
- };
|
|
|
- }
|
|
|
- } else {
|
|
|
- return {
|
|
|
- type: 2,
|
|
|
- dom: lastchild
|
|
|
- };
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退文字【不在框内】
|
|
|
- * @param {Node} item 文字节点
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {ndoe} currentParagh 当前编辑的段落
|
|
|
- */
|
|
|
- handerText: function (item, sizes, isMerge, $lastparagraph, currentParagh) {
|
|
|
- if (isMerge) {
|
|
|
- let lastNode = this._getLastNodeByLastparagraphNormal($lastparagraph);
|
|
|
- if (lastNode.type === 1 || lastNode.type === 2) {
|
|
|
- let textValue = item.nodeValue;
|
|
|
- let textLength = textValue.length;
|
|
|
- let parent = lastNode.dom.parentNode;
|
|
|
- let i = 0;
|
|
|
- while (i < textLength) {
|
|
|
- let tempHtml = parent.innerHTML;
|
|
|
- parent.innerHTML += textValue[i];
|
|
|
- let lastSize = $lastparagraph.getSizeData();
|
|
|
- if (lastSize.bottom > sizes.csize.bottom) {
|
|
|
- parent.innerHTML = tempHtml;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- i++;
|
|
|
- }
|
|
|
- let currentText = textValue.substring(i);
|
|
|
- item.nodeValue = currentText;
|
|
|
- } else {
|
|
|
- console.log('%cerror:系统错误,请联系管理员!', 'color:red')
|
|
|
- return false;
|
|
|
- }
|
|
|
- } else {
|
|
|
- let tempParagraph = currentParagh.cloneNode(false);
|
|
|
- let $tempParagraph = $(tempParagraph);
|
|
|
- $tempParagraph.insertAfter($lastparagraph);
|
|
|
- let textValue = item.nodeValue;
|
|
|
- let textLength = textValue.length;
|
|
|
- let i = 0;
|
|
|
- while (i < textLength) {
|
|
|
- let tempHtml = tempParagraph.innerHTML;
|
|
|
- tempParagraph.innerHTML += textValue[i];
|
|
|
- let lastSize = $tempParagraph.getSizeData();
|
|
|
- if (lastSize.bottom > sizes.csize.bottom) {
|
|
|
- tempParagraph.innerHTML = tempHtml;
|
|
|
- break;
|
|
|
- }
|
|
|
- i++;
|
|
|
- }
|
|
|
- let currentText = textValue.substring(i);
|
|
|
- item.nodeValue = currentText;
|
|
|
- if (isEmptyElement(tempParagraph)) {
|
|
|
- $tempParagraph.remove();
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退div【不在框内】
|
|
|
- * @param {Node} item 文字节点
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- */
|
|
|
- handerNormalDiv: function ($item, sizes, $lastparagraph, isMerge) {
|
|
|
- let currentParagh = getParentNodeByClass($item[0], 'js-paragraph-view');
|
|
|
- if (currentParagh) {
|
|
|
- this.currentParaghSize = $(currentParagh).getSizeData();
|
|
|
- } else {
|
|
|
- console.log('error');
|
|
|
- return '';
|
|
|
- }
|
|
|
- let $prevDivSub = $item.clone(false);
|
|
|
- $item.childNodes().forEach(node => {
|
|
|
- if (node.nodeType === 3) {
|
|
|
- this.handerText(node, sizes, isMerge, $lastparagraph, currentParagh);
|
|
|
- } else if (node.tagName.toLowerCase() === 'br' || node.tagName.toLowerCase() === 'img') {
|
|
|
- let brSize = $(node).getSizeData();
|
|
|
- if (isMerge) {
|
|
|
- if (brSize.height < sizes.diff) {
|
|
|
- sizes.diff -= brSize.height;
|
|
|
- $lastparagraph.append($(node));
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- } else {
|
|
|
- let diff = brSize.bottom - this.currentParaghSize.top;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- sizes.diff -= diff;
|
|
|
- $lastparagraph.append($(node));
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- this._handerNormalDiv($(node), sizes, $prevDivSub, $lastparagraph, isMerge);
|
|
|
- if (!isEmptyElement($prevDivSub[0])) {
|
|
|
- if (isMerge) {
|
|
|
- $lastparagraph[0].innerHTML += $prevDivSub.html();
|
|
|
- } else {
|
|
|
- $prevDivSub.insertAfter($lastparagraph);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- /**
|
|
|
- * function 计算字体是否可以回退【不在框内】
|
|
|
- * @param {node} text 计算文字节点
|
|
|
- * @param {object} sizes 参考尺寸
|
|
|
- */
|
|
|
- _checkoutNodeOut: function (text, sizes) {
|
|
|
- let nextNode = text.nextSibling;
|
|
|
- let parentNode = text.parentNode;
|
|
|
- let span = document.createElement('span');
|
|
|
- span.appendChild(text);
|
|
|
- if (nextNode) {
|
|
|
- parentNode.insertBefore(span, nextNode);
|
|
|
- } else {
|
|
|
- parentNode.appendChild(span);
|
|
|
- }
|
|
|
- let $span = $(span);
|
|
|
- let currentParaghSize = this.currentParaghSize;
|
|
|
- let textValue = text.nodeValue;
|
|
|
- let length = textValue.length;
|
|
|
- let i = length;
|
|
|
- let prev = '';
|
|
|
- while (i >= 0) {
|
|
|
- let textTemp = textValue.substr(0, i--);
|
|
|
- text.nodeValue = textTemp;
|
|
|
- let textSize = $span.getSizeData();
|
|
|
- let diff = textSize.bottom - currentParaghSize.top;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- prev = textTemp;
|
|
|
- span.outerHTML = textValue.substring(i);
|
|
|
- sizes.diff -= diff;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- return prev;
|
|
|
- },
|
|
|
- /**
|
|
|
- * function 插入上一段文字是否可以回退【不在框内】
|
|
|
- * @param {node} lastNode 上一段最后一个节点
|
|
|
- * @param {node} subNode 子节点
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- */
|
|
|
- _checkInsertText: function (lastNode, subNode, sizes, $lastparagraph) {
|
|
|
- let textValue = subNode.nodeValue;
|
|
|
- let length = textValue.length;
|
|
|
- let i = 0;
|
|
|
- while (i < length) {
|
|
|
- let tempHtml = lastNode.innerHTML;
|
|
|
- lastNode.innerHTML += textValue[i];
|
|
|
- let size = $lastparagraph.getSizeData();
|
|
|
- if (size.bottom > sizes.csize.bottom) {
|
|
|
- lastNode.innerHTML = tempHtml;
|
|
|
- break;
|
|
|
- }
|
|
|
- i++;
|
|
|
- }
|
|
|
- subNode.nodeValue = textValue.substring(i);
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退div【不在框内】
|
|
|
- * @param {DomElement} $item 处理的DOM
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {DomElement} $prevDiv 该栏前移的div
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- */
|
|
|
- _handerNormalDiv: function ($item, sizes, $prevDiv, $lastparagraph, isMerge) {
|
|
|
- let $prevDivSub = $item.clone(false);
|
|
|
- let currentParaghSize = this.currentParaghSize;
|
|
|
- $item.childNodes().forEach(subNode => {
|
|
|
- if (subNode.nodeType === 3) {
|
|
|
- if (isMerge) {
|
|
|
- let lastNode = this._getLastNodeByLastparagraphNormal($lastparagraph);
|
|
|
- if (lastNode.type === 2) {
|
|
|
- if (lastNode.dom.tagName === $item[0].tagName) {
|
|
|
- this._checkInsertText(lastNode.dom, subNode, sizes, $lastparagraph);
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- let prevText = this._checkoutNodeOut(subNode, sizes);
|
|
|
- if (prevText.length > 0) {
|
|
|
- let textNode = document.createTextNode(prevText);
|
|
|
- $prevDivSub[0].appendChild(textNode);
|
|
|
- }
|
|
|
- }
|
|
|
- } else if (subNode.tagName.toLowerCase() === 'br') {
|
|
|
- let $br = $(subNode);
|
|
|
- let brSize = $br.getSizeData();
|
|
|
- let diff = brSize.bottom - currentParaghSize.top + 11;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- $prevDivSub.append($br);
|
|
|
- sizes.diff -= diff;
|
|
|
- }
|
|
|
- } else {
|
|
|
- let $subnode = $(subNode);
|
|
|
- let $prevTemp = $subnode.clone(false);
|
|
|
- this._handerNormalDiv($subnode, sizes, $prevTemp, $lastparagraph, isMerge);
|
|
|
- let html = $prevTemp.html();
|
|
|
- if (html.length > 0) {
|
|
|
- $prevDivSub.append($prevTemp);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- let html2 = $prevDivSub.html();
|
|
|
- if (html2.length > 0) {
|
|
|
- $prevDiv.append($prevDivSub);
|
|
|
- }
|
|
|
-
|
|
|
- if (!$item.html().length) {
|
|
|
- $item.remove();
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退框
|
|
|
- * @param {DomElement} $border 题框
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- */
|
|
|
- handerBorder: function ($border, sizes, isMerge, $lastparagraph) {
|
|
|
- // border有10px的margin-bottom
|
|
|
- sizes.diff -= 10;
|
|
|
- let currentParagh = getParentNodeByClass($border[0], 'js-paragraph-view');
|
|
|
- if (currentParagh) {
|
|
|
- this.currentParaghSize = $(currentParagh).getSizeData();
|
|
|
- } else {
|
|
|
- console.log('error');
|
|
|
- return '';
|
|
|
- }
|
|
|
- let borderType = parseInt($border.attr('data-type'));
|
|
|
- this.borderType = borderType;
|
|
|
- if (borderType === 1) {
|
|
|
- // 客观题
|
|
|
- this._handerObjectBorder($border, sizes, isMerge, $lastparagraph, currentParagh);
|
|
|
- } else {
|
|
|
- // 主观题
|
|
|
- this._handerSubjectBorder($border, sizes, isMerge, $lastparagraph);
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * function 客观题获取最后一行
|
|
|
- * @param {DomElement} $lastparagraph
|
|
|
- */
|
|
|
- _getLastRowByLastparagraph ($lastparagraph) {
|
|
|
- let border = $lastparagraph[0].lastChild;
|
|
|
- if (border.className && border.className.indexOf('lsiten-question-object') > -1) {
|
|
|
- let lastRow = border.lastChild;
|
|
|
- if (lastRow.className && lastRow.className.indexOf('js-options-row') > -1) {
|
|
|
- return lastRow;
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理主观题回退框
|
|
|
- * @param {DomElement} $border 题框
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Node} currentParagh 当前处理的段落
|
|
|
- */
|
|
|
- _handerObjectBorder: function ($border, sizes, isMerge, $lastparagraph, currentParagh) {
|
|
|
- if (isMerge) {
|
|
|
- let lastRow = this._getLastRowByLastparagraph($lastparagraph);
|
|
|
- let $lastRow = $(lastRow);
|
|
|
- let splitClass = '';
|
|
|
- let splitColumn = [];
|
|
|
- if (lastRow.className) {
|
|
|
- let splits = lastRow.className.match(/js-split-row[0-9]+/);
|
|
|
- if (splits) {
|
|
|
- splitClass = splits[0];
|
|
|
- splitColumn = $lastRow.childNodes();
|
|
|
- }
|
|
|
- }
|
|
|
- if (lastRow) {
|
|
|
- $border.childNodes().forEach(row => {
|
|
|
- let $row = $(row);
|
|
|
- let $rowTemp = $row.clone(false);
|
|
|
- let columns = $row.childNodes();
|
|
|
- let rowClass = $row.attr('class');
|
|
|
- if (!columns.length) {
|
|
|
- return false;
|
|
|
- } else {
|
|
|
- let $firstColumn = $(columns[0].firstChild);
|
|
|
- $firstColumn.childNodes().forEach(question => {
|
|
|
- let size = $(question).getSizeData();
|
|
|
- if (splitClass.length > 0 && rowClass.indexOf(splitClass) > -1) {
|
|
|
- if (size.height + 16 < sizes.diff) {
|
|
|
- let j = 0;
|
|
|
- splitColumn.forEach(column => {
|
|
|
- let questions = $(columns[j++].firstChild).childNodes();
|
|
|
- questions[0] && column.firstChild.appendChild(questions[0]);
|
|
|
- })
|
|
|
-
|
|
|
- sizes.diff -= size.height;
|
|
|
- }
|
|
|
- } else {
|
|
|
- let diff = size.height + 24 + 16;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- let j = 0;
|
|
|
- let columnTemps = $rowTemp.find('.js-option-column');
|
|
|
- columns.forEach(column => {
|
|
|
- let columnTemp = columnTemps[j];
|
|
|
- let columnContentTemp = null;
|
|
|
- if (!columnTemp) {
|
|
|
- columnTemp = column.cloneNode(false);
|
|
|
- columnContentTemp = column.firstChild.cloneNode(false);
|
|
|
- columnTemp.appendChild(columnContentTemp);
|
|
|
- $rowTemp[0].appendChild(columnTemp);
|
|
|
- } else {
|
|
|
- columnContentTemp = columnTemp.firstChild;
|
|
|
- }
|
|
|
- let questions = $(columns[j++].firstChild).childNodes();
|
|
|
- questions[0] && columnContentTemp.appendChild(questions[0]);
|
|
|
- })
|
|
|
- sizes.diff -= size.height;
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- if (isEmptyElement($firstColumn[0])) {
|
|
|
- $row.remove();
|
|
|
- }
|
|
|
-
|
|
|
- if (!isEmptyElement($rowTemp[0])) {
|
|
|
- $lastparagraph[0].firstChild.appendChild($rowTemp[0]);
|
|
|
- $lastparagraph[0].firstChild.childNodes.length > 0 && $rowTemp.css('border-top', '1px solid #000');
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- if (isEmptyElement($border[0])) {
|
|
|
- $border.remove();
|
|
|
- }
|
|
|
- } else {
|
|
|
- console.log("%cerror", "color:red")
|
|
|
- }
|
|
|
- } else {
|
|
|
- let $borderTemp = $border.clone(false);
|
|
|
- $border.childNodes().forEach(row => {
|
|
|
- let $row = $(row);
|
|
|
- let firstColumn = row.firstChild;
|
|
|
- let $rowTemp = $row.clone(false);
|
|
|
- let columns = $row.childNodes();
|
|
|
- let $columnContent = $(firstColumn.firstChild);
|
|
|
- $columnContent.childNodes().forEach(question => {
|
|
|
- let size = $(question).getSizeData();
|
|
|
- let diff = size.height + 24 + 16;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- let j = 0;
|
|
|
- let columnTemps = $rowTemp.find('.js-option-column');
|
|
|
- columns.forEach(column => {
|
|
|
- let columnTemp = columnTemps[j];
|
|
|
- let columnContentTemp = null;
|
|
|
- if (!columnTemp) {
|
|
|
- columnTemp = column.cloneNode(false);
|
|
|
- columnContentTemp = column.firstChild.cloneNode(false);
|
|
|
- columnTemp.appendChild(columnContentTemp);
|
|
|
- $rowTemp[0].appendChild(columnTemp);
|
|
|
- } else {
|
|
|
- columnContentTemp = columnTemp.firstChild;
|
|
|
- }
|
|
|
- let questions = $(columns[j++].firstChild).childNodes();
|
|
|
- questions[0] && columnContentTemp.appendChild(questions[0]);
|
|
|
- })
|
|
|
- sizes.diff -= size.height;
|
|
|
- }
|
|
|
- })
|
|
|
- if (!isEmptyElement($rowTemp[0])) {
|
|
|
- $borderTemp.append($rowTemp);
|
|
|
- }
|
|
|
-
|
|
|
- if (isEmptyElement($columnContent[0])) {
|
|
|
- $row.remove();
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- if (isEmptyElement($border[0])) {
|
|
|
- $border.remove();
|
|
|
- }
|
|
|
-
|
|
|
- if (!isEmptyElement($borderTemp[0])) {
|
|
|
- let tempParagraph = currentParagh.cloneNode(false);
|
|
|
- tempParagraph.appendChild($borderTemp[0]);
|
|
|
- $(tempParagraph).insertAfter($lastparagraph);
|
|
|
- if (isEmptyElement(currentParagh)) {
|
|
|
- $(tempParagraph).remove();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理主观题回退框
|
|
|
- * @param {DomElement} $border 题框
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- */
|
|
|
- _handerSubjectBorder: function ($border, sizes, isMerge, $lastparagraph) {
|
|
|
- let borderContent = $border[0].firstChild;
|
|
|
- if (!borderContent || borderContent.nodeType !== 1) {
|
|
|
- console.log("%cerror border", "color:red");
|
|
|
- return false;
|
|
|
- } else {
|
|
|
- let $borderContent = $(borderContent);
|
|
|
- let $prevDiv = $borderContent.clone(false);
|
|
|
- $borderContent.childNodes().forEach(item => {
|
|
|
- if (item.nodeType === 3) {
|
|
|
- this._moveTxtToPrev(item, sizes, $prevDiv, $lastparagraph, isMerge);
|
|
|
- } else {
|
|
|
- let $item = $(item);
|
|
|
- let className = $item.attr('class');
|
|
|
- if (className && className.indexOf('js-lsiten-question') > -1) {
|
|
|
- let type = parseInt($item.attr('data-type'));
|
|
|
- switch (type) {
|
|
|
- case 1:
|
|
|
- case 2:
|
|
|
- this._handerObjectContent($item, sizes, $prevDiv, $lastparagraph, isMerge);
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- this._handersubjectContent($item, sizes, $prevDiv, $lastparagraph, isMerge);
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- this._handerwrittingContent($item, sizes, $prevDiv, $lastparagraph, isMerge);
|
|
|
- break;
|
|
|
- }
|
|
|
- } else {
|
|
|
- this._handerNormal($item, sizes, $prevDiv, $lastparagraph, isMerge);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- if (!isEmptyElement($prevDiv[0])) {
|
|
|
- if (isMerge) {
|
|
|
- let lastBorder = $lastparagraph[0].lastChild;
|
|
|
- if (lastBorder) {
|
|
|
- lastBorder.firstChild.innerHTML += $prevDiv[0].innerHTML;
|
|
|
- }
|
|
|
- } else {
|
|
|
- let tempBorder = $border[0].cloneNode(false);
|
|
|
- tempBorder.append($prevDiv[0]);
|
|
|
- let tempPrevParagraph = $border[0].parentNode.cloneNode(false);
|
|
|
- tempPrevParagraph.appendChild(tempBorder);
|
|
|
- $lastparagraph[0].parentNode.appendChild(tempPrevParagraph);
|
|
|
- }
|
|
|
- }
|
|
|
- if (isEmptyElement($borderContent[0])) {
|
|
|
- $border.remove();
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退框内客观题
|
|
|
- * @param {DomElement} $item 文字节点
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {DomElement} $prev 向前移动的容器
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- */
|
|
|
- _handerObjectContent: function ($item, sizes, $prevDiv, $lastparagraph, isMerge) {
|
|
|
- let itemSize = $item.getSizeData();
|
|
|
- if (isMerge) {
|
|
|
- let diff = itemSize.height;
|
|
|
- if (sizes.diff > diff) {
|
|
|
- sizes.diff -= diff;
|
|
|
- let borderContent = this.getBorderContentByParagh($lastparagraph);
|
|
|
- borderContent.appendChild($item[0]);
|
|
|
- }
|
|
|
- } else {
|
|
|
- let diff = itemSize.bottom - this.currentParaghSize.top + 11;
|
|
|
- if (sizes.diff > diff) {
|
|
|
- sizes.diff -= diff;
|
|
|
- $prevDiv.append($item);
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退框内主观题
|
|
|
- * @param {DomElement} $item 文字节点
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {DomElement} $prev 向前移动的容器
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- */
|
|
|
- _handersubjectContent: function ($item, sizes, $prevDiv, $lastparagraph, isMerge) {
|
|
|
- let $prevDivSub = $item.clone(false);
|
|
|
- $item.childNodes().forEach(node => {
|
|
|
- if (node.nodeType === 3) {
|
|
|
- this._moveTxtToPrev(node, sizes, $prevDivSub, $lastparagraph, isMerge);
|
|
|
- } else {
|
|
|
- this._handerNormal($(node), sizes, $prevDivSub, $lastparagraph, isMerge);
|
|
|
-
|
|
|
- if (node.innerHTML === '') {
|
|
|
- $(node).remove();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- })
|
|
|
- // console.log($prevDivSub[0], isMerge, sizes);
|
|
|
- if(!isEmptyElement($prevDivSub[0])) {
|
|
|
- let lastRow = this.getLastQestionByParagh($lastparagraph);
|
|
|
- if (lastRow) {
|
|
|
- if (isMerge) {
|
|
|
- let type = parseInt(lastRow.getAttribute('data-type'));
|
|
|
- if (type === 3) {
|
|
|
- if (lastRow.className && lastRow.className.indexOf('js-split-problem') > -1) {
|
|
|
- lastRow.innerHTML += $prevDivSub.html();
|
|
|
- } else {
|
|
|
- $prevDiv.append($prevDivSub);
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- $prevDiv.append($prevDivSub);
|
|
|
- }
|
|
|
- } else {
|
|
|
- $prevDiv.append($prevDivSub);
|
|
|
- }
|
|
|
-
|
|
|
- if (isEmptyElement($item[0])) {
|
|
|
- $(lastRow).removeClass('js-split-problem');
|
|
|
- $item.remove();
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * function 获取最后一段最后一个div
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- */
|
|
|
- getLastQestionByParagh: function ($lastparagraph) {
|
|
|
- let lastChild = $lastparagraph[0].lastChild;
|
|
|
- if (lastChild.className && lastChild.className.indexOf('js-lsiten-border') > -1) {
|
|
|
- let borderType = parseInt(lastChild.getAttribute('data-type'));
|
|
|
- if (borderType === this.borderType) {
|
|
|
- if (borderType === 2) {
|
|
|
- // 主观题
|
|
|
- let content = lastChild.lastChild;
|
|
|
- if (content.className && content.className.indexOf('border-content') > -1) {
|
|
|
- let lastcontent = content.lastChild;
|
|
|
- if (lastcontent.className && lastcontent.className.indexOf('js-lsiten-question') > -1) {
|
|
|
- return lastcontent;
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 客观题
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退框内作文题
|
|
|
- * @param {DomElement} $item 文字节点
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {DomElement} $prev 向前移动的容器
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- */
|
|
|
- _handerwrittingContent: function ($item, sizes, $prevDiv, $lastparagraph, isMerge) {
|
|
|
- let $questionDivSub = $item.clone(false);
|
|
|
- $item.childNodes().forEach(nodeItem => {
|
|
|
- if (nodeItem.nodeType === 3) {
|
|
|
- nodeItem.parentNode.removeChild(nodeItem);
|
|
|
- } else {
|
|
|
- let $nodeItem = $(nodeItem);
|
|
|
- let className = $nodeItem.attr('class');
|
|
|
- if (className && className.indexOf('lsiten-title') > -1) {
|
|
|
- // 作文题目区
|
|
|
- let $prevDivSub = $nodeItem.clone(false);
|
|
|
- $nodeItem.childNodes().forEach(node => {
|
|
|
- if (node.nodeType === 3) {
|
|
|
- this._moveTxtToPrev(node, sizes, $prevDivSub, $lastparagraph, isMerge);
|
|
|
- } else {
|
|
|
- this._handerNormal($(node), sizes, $prevDivSub, $lastparagraph, isMerge);
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- if (!isEmptyElement($prevDivSub[0])) {
|
|
|
- $questionDivSub.append($prevDivSub);
|
|
|
- }
|
|
|
- } else if (className && className.indexOf('lsiten-border-box') > -1) {
|
|
|
- let $prevDivSub = $nodeItem.clone(false);
|
|
|
- let lastRow = null;
|
|
|
- if (isMerge) {
|
|
|
- lastRow = this.getLastContentByParagh($lastparagraph);
|
|
|
- }
|
|
|
- if (lastRow) {
|
|
|
- // 作文网格区
|
|
|
- $nodeItem.childNodes().forEach(row => {
|
|
|
- let rsize = $(row).getSizeData();
|
|
|
- if (this._checkIsNeedPrev(rsize, sizes, isMerge)) {
|
|
|
- if (isMerge) {
|
|
|
- if (lastRow.className && lastRow.className.indexOf('lsiten-title') > -1) {
|
|
|
- let $prevDivSubTemp = $nodeItem.clone(false);
|
|
|
- $prevDivSubTemp.append($(row));
|
|
|
- lastRow.parentNode.appendChild($prevDivSubTemp[0]);
|
|
|
- } else {
|
|
|
- lastRow.parentNode.appendChild(row);
|
|
|
- }
|
|
|
- } else {
|
|
|
- $prevDivSub.append($(row));
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- if (!isEmptyElement($prevDivSub[0])) {
|
|
|
- $questionDivSub.append($prevDivSub);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- if (isEmptyElement($nodeItem[0])) {
|
|
|
- $nodeItem.remove();
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- if (!isEmptyElement($questionDivSub[0])) {
|
|
|
- $prevDiv.append($questionDivSub);
|
|
|
- }
|
|
|
-
|
|
|
- if (isEmptyElement($item[0])) {
|
|
|
- $item.remove();
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * function 判断是否可以回退回去
|
|
|
- * @param {Object} osize 需要判断的尺寸
|
|
|
- * @param {Object} sizes 参考的尺寸
|
|
|
- * @param {Boolean} isMerge 是否合并段落
|
|
|
- */
|
|
|
- _checkIsNeedPrev: function (osize, sizes, isMerge) {
|
|
|
- if (isMerge) {
|
|
|
- if (osize.height < sizes.diff) {
|
|
|
- sizes.diff -= osize.height;
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- } else {
|
|
|
- let diff = osize.bottom - sizes.csize.bottom;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- sizes.diff -= diff;
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * @param {node} item 需要处理的节点
|
|
|
- * @param {object} sizes 参考的尺寸
|
|
|
- * @param {DomElement} $prevDivSub 上移的div容器
|
|
|
- * @param {DomElement} $lastparagraph 上一栏最后一段
|
|
|
- */
|
|
|
- _checkNormalText: function (item, sizes, $prevDivSub, $lastparagraph) {
|
|
|
- let nextNode = item.nextSibling;
|
|
|
- let parentNode = item.parentNode;
|
|
|
- let span = document.createElement('span');
|
|
|
- span.appendChild(item);
|
|
|
- if (nextNode) {
|
|
|
- parentNode.insertBefore(span, nextNode);
|
|
|
- } else {
|
|
|
- parentNode.appendChild(span);
|
|
|
- }
|
|
|
- let $span = $(span);
|
|
|
- if (!this.currentParaghSize.top) {
|
|
|
- $span[0].outerHTML = $span[0].innerHTML;
|
|
|
- return false;
|
|
|
- }
|
|
|
- let textValue = item.nodeValue;
|
|
|
- let length = textValue.length;
|
|
|
- let i = length;
|
|
|
- while (i > 0) {
|
|
|
- let textTemp = textValue.substring(0, length);
|
|
|
- item.nodeValue = textTemp;
|
|
|
- let textSize = $span.getSizeData();
|
|
|
- let diff = textSize.bottom - this.currentParaghSize.top + 11;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- $prevDivSub[0].appendChild(document.createTextNode(textTemp));
|
|
|
- break;
|
|
|
- }
|
|
|
- i--;
|
|
|
- }
|
|
|
- item.nodeValue = textValue.substring(i);
|
|
|
- $span[0].outerHTML = $span[0].innerHTML;
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退框内普通文字
|
|
|
- * @param {DomElement} $item 文字节点
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {DomElement} $prev 向前移动的容器
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- */
|
|
|
- _handerNormal: function ($item, sizes, $prevDiv, $lastparagraph, isMerge) {
|
|
|
- let $prevDivSub = $item.clone(false);
|
|
|
- $item.childNodes().forEach(node => {
|
|
|
- if (node.nodeType === 3) {
|
|
|
- if (isMerge) {
|
|
|
- this._moveTxtToPrev(node, sizes, $prevDivSub, $lastparagraph, isMerge);
|
|
|
- } else {
|
|
|
- this._checkNormalText(node, sizes, $prevDivSub, $lastparagraph);
|
|
|
- }
|
|
|
- } else if (node.tagName.toLowerCase() === 'br' || node.tagName.toLowerCase() === 'img') {
|
|
|
- let brSize = $(node).getSizeData();
|
|
|
- if (isMerge) {
|
|
|
- let diff = brSize.bottom - this.currentParaghSize.top - 11;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- sizes.diff -= brSize.height;
|
|
|
- $prevDivSub.append($(node));
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- } else {
|
|
|
- let diff = brSize.bottom - this.currentParaghSize.top + 11;
|
|
|
- if (diff < sizes.diff) {
|
|
|
- sizes.diff -= diff;
|
|
|
- $prevDivSub.append($(node));
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- this._handerNormal($(node), sizes, $prevDivSub, $lastparagraph, isMerge);
|
|
|
- }
|
|
|
- })
|
|
|
- if($prevDivSub[0].innerHTML !== '') {
|
|
|
- $prevDiv.append($prevDivSub);
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * function 获取最后一段最后一个问题
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- */
|
|
|
- getBorderContentByParagh: function ($lastparagraph) {
|
|
|
- let lastChild = $lastparagraph[0].lastChild;
|
|
|
- if (lastChild.className && lastChild.className.indexOf('js-lsiten-border') > -1) {
|
|
|
- let borderType = parseInt(lastChild.getAttribute('data-type'));
|
|
|
- if (borderType === this.borderType) {
|
|
|
- if (borderType === 2) {
|
|
|
- // 主观题
|
|
|
- let content = lastChild.lastChild;
|
|
|
- if (content.className && content.className.indexOf('border-content') > -1) {
|
|
|
- return content;
|
|
|
- } else {
|
|
|
- return null;
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 客观题
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
- },
|
|
|
- /**
|
|
|
- * function 获取最后一段最后一个div
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- */
|
|
|
- getLastContentByParagh: function ($lastparagraph) {
|
|
|
- let lastChild = $lastparagraph[0].lastChild;
|
|
|
- if (lastChild.className && lastChild.className.indexOf('js-lsiten-border') > -1) {
|
|
|
- let borderType = parseInt(lastChild.getAttribute('data-type'));
|
|
|
- if (borderType === this.borderType) {
|
|
|
- if (borderType === 2) {
|
|
|
- // 主观题
|
|
|
- let content = lastChild.lastChild;
|
|
|
- if (content.className && content.className.indexOf('border-content') > -1) {
|
|
|
- let lastcontent = content.lastChild;
|
|
|
- let type = parseInt(lastcontent.getAttribute('data-type'));
|
|
|
- if (type === 3) {
|
|
|
- return lastcontent.lastChild;
|
|
|
- } else if (type === 4) {
|
|
|
- lastcontent = lastcontent.lastChild;
|
|
|
- if (lastcontent.className && lastcontent.className.indexOf('lsiten-title') > -1) {
|
|
|
- return lastcontent;
|
|
|
- } else if (lastcontent.className && lastcontent.className.indexOf('lsiten-border-box') > -1) {
|
|
|
- return lastcontent.lastChild;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 客观题
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- return lastChild;
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- * funciton 处理回退框 仅仅适合客观题
|
|
|
- * @param {Node} item 文字节点
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- * @param {DomElement} $prev 向前移动的容器
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Boolean} isMerge 是否需要合并段落
|
|
|
- * */
|
|
|
- _moveTxtToPrev (item, sizes, $prev, $lastparagraph, isMerge) {
|
|
|
- let nextNode = item.nextSibling;
|
|
|
- let parentNode = item.parentNode;
|
|
|
- let span = document.createElement('span');
|
|
|
- span.appendChild(item);
|
|
|
- if (nextNode) {
|
|
|
- parentNode.insertBefore(span, nextNode);
|
|
|
- } else {
|
|
|
- parentNode.appendChild(span);
|
|
|
- }
|
|
|
- let $span = $(span);
|
|
|
- let textSize = $span.getSizeData();
|
|
|
- if (!this.currentParaghSize.top) {
|
|
|
- $span[0].outerHTML = $span[0].innerHTML;
|
|
|
- return false;
|
|
|
- }
|
|
|
- let diff = textSize.bottom - this.currentParaghSize.top + 11;
|
|
|
- if (diff) {
|
|
|
- if (sizes.diff - diff > 0) {
|
|
|
- $prev[0].appendChild(item);
|
|
|
- $span.remove();
|
|
|
- } else {
|
|
|
- if (isMerge) {
|
|
|
- let lastContent = this.getLastContentByParagh($lastparagraph);
|
|
|
- if (lastContent.className && lastContent.className.indexOf('js-split-item') > -1) {
|
|
|
- let content = lastContent.lastChild;
|
|
|
- if (content.nodeType === 3) {
|
|
|
- let prevText = this._textInsertTest(content, item, $lastparagraph, sizes);
|
|
|
- $prev[0].innerHTML += prevText;
|
|
|
- }
|
|
|
- } else if ( lastContent.className && lastContent.className.indexOf('js-split-writting-title') > -1) {
|
|
|
- let content = lastContent.lastChild;
|
|
|
- if (content.nodeType === 3) {
|
|
|
- let prevText = this._textInsertTest(content, item, $lastparagraph, sizes);
|
|
|
- $prev[0].innerHTML += prevText;
|
|
|
- }
|
|
|
- } else {
|
|
|
- diff = textSize.bottom - this.currentParaghSize.top - 11;
|
|
|
- if ( diff < sizes.diff ) {
|
|
|
- sizes.diff -= textSize.height;
|
|
|
- $prev[0].appendChild(item);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- $span[0].outerHTML = $span[0].innerHTML;
|
|
|
- }
|
|
|
- } else {
|
|
|
- $span[0].outerHTML = $span[0].innerHTML;
|
|
|
- console.log('error');
|
|
|
- }
|
|
|
- },
|
|
|
- /**
|
|
|
- *
|
|
|
- * @param {node} content 需要插入测试的文本节点node
|
|
|
- * @param {node} insert 被插入测试的文本节点node
|
|
|
- * @param {DomElement} $lastparagraph 该栏最后一段
|
|
|
- * @param {Object} sizes 尺寸对象
|
|
|
- */
|
|
|
- _textInsertTest (content, insert, $lastparagraph, sizes) {
|
|
|
- let nextNode = content.nextSibling;
|
|
|
- let parentNode = content.parentNode;
|
|
|
- let span = document.createElement('span');
|
|
|
- span.appendChild(content);
|
|
|
- if (nextNode) {
|
|
|
- parentNode.insertBefore(span, nextNode);
|
|
|
- } else {
|
|
|
- parentNode.appendChild(span);
|
|
|
- }
|
|
|
-
|
|
|
- let textValue = insert.nodeValue;
|
|
|
- let length = textValue.length;
|
|
|
- let columnSize = sizes.csize;
|
|
|
- let prev = '';
|
|
|
- let i = 0;
|
|
|
- for ( ;i < length; i++) {
|
|
|
- let tempHtml = span.innerHTML;
|
|
|
- span.innerHTML += textValue[i];
|
|
|
- let psize = $lastparagraph.getSizeData();
|
|
|
- if (psize.bottom > columnSize.bottom) {
|
|
|
- span.outerHTML = tempHtml;
|
|
|
- break;
|
|
|
- } else {
|
|
|
- prev += textValue[i];
|
|
|
- }
|
|
|
- }
|
|
|
- insert.nodeValue = textValue.substring(i);
|
|
|
- return prev;
|
|
|
- }
|
|
|
-}
|
|
|
-export default questionPrevUtils;
|