|
|
@@ -101,7 +101,7 @@
|
|
|
:key="item.mark"
|
|
|
v-model="item.value"
|
|
|
placeholder="多个答案可用‘/’分割"
|
|
|
- @blur="handleTone(item.value, i)"
|
|
|
+ @blur="handleTone(item.value, item)"
|
|
|
>
|
|
|
<span slot="prefix">{{ i + 1 }}.</span>
|
|
|
</el-input>
|
|
|
@@ -313,6 +313,19 @@ export default {
|
|
|
*/
|
|
|
appendTextBlock(blocks, content, richTextList = []) {
|
|
|
if (!this.hasVisibleText(content) && blocks.length > 0) {
|
|
|
+ // 填空(input)属于当前段落的一部分:若段落以填空结尾,紧随其后的闭合标签和
|
|
|
+ // 段间换行 \n 不能合并到填空前面的文本块中,否则 PinyinText 会把 \n 渲染成
|
|
|
+ // <br> 出现在填空之前,导致填空换到下一行显示。此时将换行保留为填空后的独立文本块。
|
|
|
+ const lastBlock = blocks[blocks.length - 1];
|
|
|
+ if (lastBlock && lastBlock.type === 'input' && String(content).includes('\n')) {
|
|
|
+ blocks.push({
|
|
|
+ content,
|
|
|
+ type: 'text',
|
|
|
+ rich_text_list: richTextList,
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
for (let i = blocks.length - 1; i >= 0; i--) {
|
|
|
if (blocks[i] && blocks[i].type === 'text') {
|
|
|
blocks[i].content = `${blocks[i].content || ''}${content}`;
|
|
|
@@ -720,18 +733,18 @@ export default {
|
|
|
return slicedWord;
|
|
|
},
|
|
|
|
|
|
- handleTone(value, i) {
|
|
|
- if (!/^[a-zA-Z0-9\s]+$/.test(value)) return;
|
|
|
- this.data.answer.answer_list[i].value = value
|
|
|
+ handleTone(value, item) {
|
|
|
+ if (!item || !/^[a-zA-Z0-9\s]+$/.test(value)) return;
|
|
|
+ item.value = value
|
|
|
.trim()
|
|
|
.split(/\s+/)
|
|
|
- .map((item) => {
|
|
|
- return handleToneValue(item);
|
|
|
+ .map((valItem) => {
|
|
|
+ return handleToneValue(valItem);
|
|
|
})
|
|
|
- .map((item) =>
|
|
|
- item.map(({ number, con }) => (number && con ? addTone(Number(number), con) : number || con || '')),
|
|
|
+ .map((valItem) =>
|
|
|
+ valItem.map(({ number, con }) => (number && con ? addTone(Number(number), con) : number || con || '')),
|
|
|
)
|
|
|
- .filter((item) => item.length > 0)
|
|
|
+ .filter((valItem) => valItem.length > 0)
|
|
|
.join(' ');
|
|
|
},
|
|
|
uploads(file_id) {
|