judge.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import $ from '../util/dom-core.js';
  2. import { getParentByClassname, isEmptyElement } from '../util/util.js';
  3. /**
  4. * function 生成判断题
  5. * @param {DomElement} $border 需要添加题的框
  6. * @param {JSON} data 题目数据
  7. * @param {Objec} editor 编辑器对象
  8. */
  9. let generateJudge = function ($border, data, editor) {
  10. let type = parseInt($border.attr('data-type'));
  11. let proId = data.proId;
  12. let quId = data.quId;
  13. let pnum = data.pnum;
  14. let $questionItem = $('<div class="lsiten-question-judge js-lsiten-question"></div>');
  15. $questionItem.attr('data-type', 2);
  16. $questionItem.attr('data-pid', proId);
  17. $questionItem.attr('data-qid', quId);
  18. $questionItem.css('margin', '8px 0')
  19. .css('outline', 'none')
  20. .css('overflow', 'hidden')
  21. .css('position', 'relative');
  22. let mergePnum = data.proData.pnum;
  23. if (mergePnum && mergePnum.length > 0) {
  24. pnum = mergePnum +''+ pnum;
  25. }
  26. let $span = $('<span class = "lsiten-pnum-box"> ' + pnum + ' </span>');
  27. $span.css('min-width', '25px')
  28. .css('height', 'auto')
  29. .css('width', 'auto')
  30. .css('line-height', '14px')
  31. .css('display', 'inline-block')
  32. .css('text-align', 'right')
  33. .css('float', 'left')
  34. .css('margin-right', '0');
  35. let $optionBox = generateJudgeOptions();
  36. $questionItem.append($span);
  37. $questionItem.append($optionBox);
  38. if (type === 1) {
  39. // 在客观题里添加
  40. let currentRow = parseInt($border.attr('data-current-row'));
  41. let row = parseInt($border.attr('data-row'));
  42. let column = parseInt($border.attr('data-column'));
  43. let $currentRow = null;
  44. try {
  45. $currentRow = $($border.find('.js-options-row')[currentRow]);
  46. } catch (err) {
  47. console.log("%c" + err, "color:red");
  48. return '';
  49. }
  50. let currentColumn = parseInt($currentRow.attr('data-current-column'));
  51. let $currentColumn = null;
  52. try {
  53. $currentColumn = $($currentRow.find('.js-option-column')[currentColumn]);
  54. } catch (err) {
  55. console.log("%c" + err, "color:red");
  56. return '';
  57. }
  58. let questionCount = parseInt($currentColumn.attr('data-question-count'));
  59. if (questionCount === 5) {
  60. // 下一栏
  61. if (currentColumn === (column - 1)) {
  62. // 下一行
  63. $border.attr('data-current-row', ++currentRow);
  64. let nextRowNode = $currentRow[0].nextSibling;
  65. if (nextRowNode) {
  66. $currentColumn = $(nextRowNode.firstChild);
  67. } else {
  68. console.log("%c该框问题个数已满了,请再添加框", "color:red");
  69. return '';
  70. }
  71. } else {
  72. $currentRow.attr('data-current-column', ++currentColumn);
  73. let nextColumnNode = $currentColumn[0].nextSibling;
  74. if (nextColumnNode) {
  75. $currentColumn = $(nextColumnNode);
  76. }
  77. }
  78. questionCount = 0;
  79. }
  80. $($currentColumn[0].firstChild).append($questionItem);
  81. $currentColumn.attr('data-question-count', ++questionCount);
  82. let size = $currentColumn.getSizeData();
  83. $currentRow.find('.js-option-column').css('min-height', size.height + 'px');
  84. } else {
  85. // 在主观题内添加
  86. let $selectionElem = editor.selection.getSelectionContainerElem();
  87. let $borderContent = getParentByClassname($selectionElem, 'border-content');
  88. if (!$borderContent) {
  89. console.log("%c请在框内添加该题!", "color:red");
  90. return '';
  91. }
  92. $borderContent.append($questionItem);
  93. if ( isEmptyElement($borderContent[0].firstChild) ) {
  94. $borderContent[0].removeChild($borderContent[0].firstChild);
  95. }
  96. editor.selection.getRange().setStartAfter($questionItem[0]);
  97. if (editor.selection.getRange()) {
  98. editor.selection.restoreSelection();
  99. }
  100. editor.selection.saveRange();
  101. editor.selection.collapseRange();
  102. }
  103. }
  104. /**
  105. * function 生成判断题选项
  106. */
  107. function generateJudgeOptions () {
  108. let $box = $('<div class="lsiten-options-box"></div>');
  109. $box.css('display', 'inline-block').css('float', 'left').css('width', 'auto').css('font-size', '0');
  110. let $right = $('<div class="lsiten-option">√</div>');
  111. $right.css('border', '1px solid #000')
  112. .css('text-align', 'center')
  113. .css('width', '19px')
  114. .css('height', 'auto')
  115. .css('box-sizing', 'border-box')
  116. .css('font-size', '12px')
  117. .css('display', 'inline-block')
  118. .css('line-height', '0.95')
  119. .css('margin', '0 0 0 5px');
  120. let $err = $('<div class="lsiten-option">×</div>');
  121. $err.css('border', '1px solid #000')
  122. .css('text-align', 'center')
  123. .css('width', '19px')
  124. .css('height', 'auto')
  125. .css('box-sizing', 'border-box')
  126. .css('font-size', '12px')
  127. .css('display', 'inline-block')
  128. .css('line-height', '0.95')
  129. .css('margin', '0 0 0 5px');
  130. $box.append($right);
  131. $box.append($err);
  132. return $box;
  133. }
  134. export default {
  135. generateJudge: generateJudge
  136. }