|
@@ -0,0 +1,932 @@
|
|
|
+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;
|