mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-11 18:42:54 +00:00
no message
This commit is contained in:
parent
cbd9e8a33c
commit
03cd6e79bb
@ -653,6 +653,7 @@ class WebSocketDialogMsg extends AbstractModel
|
||||
if (!$text) return '';
|
||||
if ($msgData['type'] === 'md') {
|
||||
$text = Base::markdown2html($text);
|
||||
$text = self::previewConvertTaskList($text);
|
||||
}
|
||||
$text = preg_replace("/<img\s+class=\"emoticon\"[^>]*?alt=\"(\S+)\"[^>]*?>/", "[$1]", $text);
|
||||
$text = preg_replace("/<img\s+class=\"emoticon\"[^>]*?>/", "[" . Doo::translate('动画表情') . "]", $text);
|
||||
@ -667,6 +668,36 @@ class WebSocketDialogMsg extends AbstractModel
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换任务列表
|
||||
* @param $text
|
||||
* @return array|string|string[]|null
|
||||
*/
|
||||
private static function previewConvertTaskList($text) {
|
||||
$pattern = '/:::\s*(create-task-list|create-subtask-list)(.*?):::/s';
|
||||
$replacement = function($matches) {
|
||||
$content = $matches[2];
|
||||
$lines = explode("\n", trim($content));
|
||||
$result = [];
|
||||
$currentTitle = '';
|
||||
foreach ($lines as $line) {
|
||||
$line = trim($line);
|
||||
if (empty($line)) continue;
|
||||
|
||||
if (preg_match('/^title:\s*(.+)$/', $line, $titleMatch)) {
|
||||
$currentTitle = $titleMatch[1];
|
||||
$result[] = $currentTitle;
|
||||
} elseif (preg_match('/^desc:\s*(.+)$/', $line, $descMatch)) {
|
||||
if (!empty($currentTitle)) {
|
||||
$result[] = $descMatch[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return implode("\n", $result);
|
||||
};
|
||||
return preg_replace_callback($pattern, $replacement, $text);
|
||||
}
|
||||
|
||||
/**
|
||||
* 预览文件消息
|
||||
* @param $msg
|
||||
|
||||
@ -28,6 +28,7 @@
|
||||
"laravel/tinker": "^v2.6.1",
|
||||
"laravolt/avatar": "^5.1",
|
||||
"league/commonmark": "^2.5",
|
||||
"league/html-to-markdown": "^5.1",
|
||||
"maatwebsite/excel": "^3.1.31",
|
||||
"madnest/madzipper": "^v1.1.0",
|
||||
"mews/captcha": "^3.2.6",
|
||||
|
||||
@ -167,7 +167,7 @@ services:
|
||||
|
||||
ai:
|
||||
container_name: "dootask-ai-${APP_ID}"
|
||||
image: "kuaifan/dootask-ai:0.1.2"
|
||||
image: "kuaifan/dootask-ai:0.1.4"
|
||||
environment:
|
||||
REDIS_HOST: "${REDIS_HOST}"
|
||||
REDIS_PORT: "${REDIS_PORT}"
|
||||
|
||||
@ -503,6 +503,7 @@ webhook地址最长仅支持255个字符。
|
||||
计划描述
|
||||
计划时间
|
||||
清空上下文
|
||||
上下文已清空
|
||||
投票
|
||||
接龙
|
||||
语音
|
||||
@ -782,3 +783,5 @@ webhook地址最长仅支持255个字符。
|
||||
|
||||
修改提示词:(*)
|
||||
取消提示词
|
||||
|
||||
未找到可应用的规则
|
||||
|
||||
@ -1869,3 +1869,16 @@ WiFi签到延迟时长为±1分钟。
|
||||
取消提示词
|
||||
|
||||
清空上下文
|
||||
上下文已清空
|
||||
|
||||
只有在项目中才能创建任务
|
||||
项目不存在
|
||||
只有在任务中才能创建子任务
|
||||
任务不存在
|
||||
未知类型
|
||||
未找到内容
|
||||
再见
|
||||
(*)成功创建(*)个子任务,(*)个子任务创建失败
|
||||
(*)成功创建(*)个子任务
|
||||
(*)成功创建(*)个任务,(*)个任务创建失败
|
||||
(*)成功创建(*)个任务
|
||||
|
||||
@ -27442,5 +27442,137 @@
|
||||
"fr": "Annuler l'invite",
|
||||
"id": "Batalkan Prompt",
|
||||
"ru": "Отменить подсказку"
|
||||
},
|
||||
{
|
||||
"key": "上下文已清空",
|
||||
"zh": "",
|
||||
"zh-CHT": "上下文已清空",
|
||||
"en": "Context has been cleared",
|
||||
"ko": "컨텍스트가 지워졌습니다",
|
||||
"ja": "コンテキストがクリアされました",
|
||||
"de": "Kontext wurde gelöscht",
|
||||
"fr": "Le contexte a été effacé",
|
||||
"id": "Konteks telah dihapus",
|
||||
"ru": "Контекст очищен"
|
||||
},
|
||||
{
|
||||
"key": "只有在项目中才能创建任务",
|
||||
"zh": "",
|
||||
"zh-CHT": "只有在專案中才能創建任務",
|
||||
"en": "Tasks can only be created within a project",
|
||||
"ko": "프로젝트 내에서만 작업을 생성할 수 있습니다",
|
||||
"ja": "タスクはプロジェクト内でのみ作成できます",
|
||||
"de": "Aufgaben können nur innerhalb eines Projekts erstellt werden",
|
||||
"fr": "Les tâches ne peuvent être créées que dans un projet",
|
||||
"id": "Tugas hanya dapat dibuat dalam proyek",
|
||||
"ru": "Задачи можно создавать только в рамках проекта"
|
||||
},
|
||||
{
|
||||
"key": "只有在任务中才能创建子任务",
|
||||
"zh": "",
|
||||
"zh-CHT": "只有在任務中才能創建子任務",
|
||||
"en": "Subtasks can only be created within a task",
|
||||
"ko": "작업 내에서만 하위 작업을 생성할 수 있습니다",
|
||||
"ja": "サブタスクはタスク内でのみ作成できます",
|
||||
"de": "Unteraufgaben können nur innerhalb einer Aufgabe erstellt werden",
|
||||
"fr": "Les sous-tâches ne peuvent être créées que dans une tâche",
|
||||
"id": "Subtugas hanya dapat dibuat dalam tugas",
|
||||
"ru": "Подзадачи можно создавать только в рамках задачи"
|
||||
},
|
||||
{
|
||||
"key": "未知类型",
|
||||
"zh": "",
|
||||
"zh-CHT": "未知類型",
|
||||
"en": "Unknown type",
|
||||
"ko": "알 수 없는 유형",
|
||||
"ja": "不明なタイプ",
|
||||
"de": "Unbekannter Typ",
|
||||
"fr": "Type inconnu",
|
||||
"id": "Jenis tidak diketahui",
|
||||
"ru": "Неизвестный тип"
|
||||
},
|
||||
{
|
||||
"key": "未找到内容",
|
||||
"zh": "",
|
||||
"zh-CHT": "未找到內容",
|
||||
"en": "Content not found",
|
||||
"ko": "내용을 찾을 수 없습니다",
|
||||
"ja": "コンテンツが見つかりません",
|
||||
"de": "Inhalt nicht gefunden",
|
||||
"fr": "Contenu non trouvé",
|
||||
"id": "Konten tidak ditemukan",
|
||||
"ru": "Контент не найден"
|
||||
},
|
||||
{
|
||||
"key": "再见",
|
||||
"zh": "",
|
||||
"zh-CHT": "再見",
|
||||
"en": "Goodbye",
|
||||
"ko": "안녕히 가세요",
|
||||
"ja": "さようなら",
|
||||
"de": "Auf Wiedersehen",
|
||||
"fr": "Au revoir",
|
||||
"id": "Selamat tinggal",
|
||||
"ru": "До свидания"
|
||||
},
|
||||
{
|
||||
"key": "(%T1)成功创建(%T2)个子任务,(%T3)个子任务创建失败",
|
||||
"zh": "",
|
||||
"zh-CHT": "(%T1)成功創建(%T2)個子任務,(%T3)個子任務創建失敗",
|
||||
"en": "(%T1) successfully created (%T2) subtasks, (%T3) subtasks failed to create",
|
||||
"ko": "(%T1)이(가) (%T2)개의 하위 작업을 성공적으로 생성하고, (%T3)개의 하위 작업 생성에 실패했습니다",
|
||||
"ja": "(%T1)は(%T2)個のサブタスクを正常に作成しましたが、(%T3)個のサブタスクの作成に失敗しました",
|
||||
"de": "(%T1) hat erfolgreich (%T2) Unteraufgaben erstellt, (%T3) Unteraufgaben konnten nicht erstellt werden",
|
||||
"fr": "(%T1) a créé avec succès (%T2) sous-tâches, (%T3) sous-tâches n'ont pas pu être créées",
|
||||
"id": "(%T1) berhasil membuat (%T2) subtugas, (%T3) subtugas gagal dibuat",
|
||||
"ru": "(%T1) успешно создал (%T2) подзадачи, (%T3) подзадачи не удалось создать"
|
||||
},
|
||||
{
|
||||
"key": "(%T1)成功创建(%T2)个子任务",
|
||||
"zh": "",
|
||||
"zh-CHT": "(%T1)成功創建(%T2)個子任務",
|
||||
"en": "(%T1) successfully created (%T2) subtasks",
|
||||
"ko": "(%T1)이(가) (%T2)개의 하위 작업을 성공적으로 생성했습니다",
|
||||
"ja": "(%T1)は(%T2)個のサブタスクを正常に作成しました",
|
||||
"de": "(%T1) hat erfolgreich (%T2) Unteraufgaben erstellt",
|
||||
"fr": "(%T1) a créé avec succès (%T2) sous-tâches",
|
||||
"id": "(%T1) berhasil membuat (%T2) subtugas",
|
||||
"ru": "(%T1) успешно создал (%T2) подзадачи"
|
||||
},
|
||||
{
|
||||
"key": "(%T1)成功创建(%T2)个任务,(%T3)个任务创建失败",
|
||||
"zh": "",
|
||||
"zh-CHT": "(%T1)成功創建(%T2)個任務,(%T3)個任務創建失敗",
|
||||
"en": "(%T1) successfully created (%T2) tasks, (%T3) tasks failed to create",
|
||||
"ko": "(%T1)이(가) (%T2)개의 작업을 성공적으로 생성하고, (%T3)개의 작업 생성에 실패했습니다",
|
||||
"ja": "(%T1)は(%T2)個のタスクを正常に作成しましたが、(%T3)個のタスクの作成に失敗しました",
|
||||
"de": "(%T1) hat erfolgreich (%T2) Aufgaben erstellt, (%T3) Aufgaben konnten nicht erstellt werden",
|
||||
"fr": "(%T1) a créé avec succès (%T2) tâches, (%T3) tâches n'ont pas pu être créées",
|
||||
"id": "(%T1) berhasil membuat (%T2) tugas, (%T3) tugas gagal dibuat",
|
||||
"ru": "(%T1) успешно создал (%T2) задачи, (%T3) задачи не удалось создать"
|
||||
},
|
||||
{
|
||||
"key": "(%T1)成功创建(%T2)个任务",
|
||||
"zh": "",
|
||||
"zh-CHT": "(%T1)成功創建(%T2)個任務",
|
||||
"en": "(%T1) successfully created (%T2) tasks",
|
||||
"ko": "(%T1)이(가) (%T2)개의 작업을 성공적으로 생성했습니다",
|
||||
"ja": "(%T1)は(%T2)個のタスクを正常に作成しました",
|
||||
"de": "(%T1) hat erfolgreich (%T2) Aufgaben erstellt",
|
||||
"fr": "(%T1) a créé avec succès (%T2) tâches",
|
||||
"id": "(%T1) berhasil membuat (%T2) tugas",
|
||||
"ru": "(%T1) успешно создал (%T2) задачи"
|
||||
},
|
||||
{
|
||||
"key": "未找到可应用的规则",
|
||||
"zh": "",
|
||||
"zh-CHT": "未找到可應用的規則",
|
||||
"en": "No applicable rules found",
|
||||
"ko": "적용 가능한 규칙을 찾을 수 없습니다",
|
||||
"ja": "適用可能なルールが見つかりません",
|
||||
"de": "Keine anwendbaren Regeln gefunden",
|
||||
"fr": "Aucune règle applicable trouvée",
|
||||
"id": "Tidak ada aturan yang dapat diterapkan",
|
||||
"ru": "Не найдено применимых правил"
|
||||
}
|
||||
]
|
||||
@ -21,6 +21,7 @@
|
||||
"devDependencies": {
|
||||
"@chenfengyuan/vue-qrcode": "^1.0.2",
|
||||
"@kangc/v-md-editor": "^1.7.12",
|
||||
"@micro-zoe/micro-app": "^0.8.11",
|
||||
"@traptitech/markdown-it-katex": "^3.6.0",
|
||||
"autoprefixer": "^10.4.13",
|
||||
"axios": "^0.24.0",
|
||||
@ -43,7 +44,7 @@
|
||||
"less-loader": "^10.2.0",
|
||||
"localforage": "^1.10.0",
|
||||
"lodash": "^4.17.21",
|
||||
"markdown-it": "^13.0.1",
|
||||
"markdown-it": "^14.1.0",
|
||||
"markdown-it-link-attributes": "^4.0.1",
|
||||
"notification-koro1": "^1.1.1",
|
||||
"openpgp_hi": "^5.7.0-1",
|
||||
@ -90,8 +91,5 @@
|
||||
"url": "https://www.dootask.com/desktop/publish"
|
||||
}
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"@micro-zoe/micro-app": "^0.8.11"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]
|
||||
["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""]
|
||||
2
public/language/web/de.js
vendored
2
public/language/web/de.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/en.js
vendored
2
public/language/web/en.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/fr.js
vendored
2
public/language/web/fr.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/id.js
vendored
2
public/language/web/id.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/ja.js
vendored
2
public/language/web/ja.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/key.js
vendored
2
public/language/web/key.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/ko.js
vendored
2
public/language/web/ko.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/ru.js
vendored
2
public/language/web/ru.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/zh-CHT.js
vendored
2
public/language/web/zh-CHT.js
vendored
File diff suppressed because one or more lines are too long
2
public/language/web/zh.js
vendored
2
public/language/web/zh.js
vendored
File diff suppressed because one or more lines are too long
@ -25,10 +25,8 @@
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
import DialogMarkdown from "../DialogMarkdown.vue";
|
||||
|
||||
export default {
|
||||
components: {DialogMarkdown},
|
||||
props: {
|
||||
msgId: Number,
|
||||
msg: Object,
|
||||
|
||||
1
resources/assets/js/store/markdown.js
vendored
1
resources/assets/js/store/markdown.js
vendored
@ -209,6 +209,7 @@ export function MarkdownConver(text) {
|
||||
export function MarkdownPreview(text) {
|
||||
if (MarkdownUtils.mds === null) {
|
||||
MarkdownUtils.mds = MarkdownIt()
|
||||
MarkdownPluginUtils.initCreateTaskPlugin(MarkdownUtils.mds);
|
||||
}
|
||||
return MarkdownUtils.mds.render(text)
|
||||
}
|
||||
|
||||
66
task-regex.mjs
Normal file
66
task-regex.mjs
Normal file
@ -0,0 +1,66 @@
|
||||
/**
|
||||
* 清理任务列表标记,只保留标题和描述
|
||||
* @param {string} text 输入文本
|
||||
* @returns {string} 处理后的文本
|
||||
*/
|
||||
export function cleanTaskList(text) {
|
||||
// 匹配整个任务块的模式
|
||||
const pattern = /:::\s*(create-task-list|create-subtask-list)([\s\S]*?):::/g;
|
||||
|
||||
return text.replace(pattern, (match, type, content) => {
|
||||
// 分割内容为行
|
||||
const lines = content.trim().split('\n');
|
||||
const result = [];
|
||||
let currentTitle = '';
|
||||
|
||||
lines.forEach(line => {
|
||||
line = line.trim();
|
||||
if (!line) return;
|
||||
|
||||
const titleMatch = line.match(/^title:\s*(.+)$/);
|
||||
const descMatch = line.match(/^desc:\s*(.+)$/);
|
||||
|
||||
if (titleMatch) {
|
||||
currentTitle = titleMatch[1];
|
||||
result.push(currentTitle);
|
||||
} else if (descMatch && currentTitle) {
|
||||
result.push(descMatch[1]);
|
||||
}
|
||||
});
|
||||
|
||||
return result.join('\n');
|
||||
});
|
||||
}
|
||||
|
||||
// 测试代码
|
||||
const input = `啊大家啊速度快放假阿斯达哦佛阿萨代发
|
||||
|
||||
::: create-task-list
|
||||
title: 任务标题1
|
||||
desc: 任务描述1
|
||||
|
||||
title: 任务标题2
|
||||
desc: 任务描述2
|
||||
|
||||
title: 任务标题3
|
||||
|
||||
title: 任务标题4
|
||||
desc: 任务描述4
|
||||
:::
|
||||
|
||||
1231231231
|
||||
|
||||
::: create-subtask-list
|
||||
title: 任务标题5
|
||||
desc: 任务描述5
|
||||
|
||||
title: 任务标题6
|
||||
desc: 任务描述6
|
||||
|
||||
title: 任务标题7
|
||||
|
||||
title: 任务标题8
|
||||
desc: 任务描述8
|
||||
:::`;
|
||||
|
||||
console.log(cleanTaskList(input));
|
||||
133
test-md.mjs
Normal file
133
test-md.mjs
Normal file
@ -0,0 +1,133 @@
|
||||
import MarkdownIt from "markdown-it";
|
||||
|
||||
const mdIt = MarkdownIt();
|
||||
|
||||
// 添加自定义规则
|
||||
mdIt.block.ruler.before('fence', 'task-list', function (state, startLine, endLine, silent) {
|
||||
const start = state.bMarks[startLine] + state.tShift[startLine];
|
||||
const max = state.eMarks[startLine];
|
||||
const firstLine = state.src.slice(start, max).trim();
|
||||
|
||||
// 检查开始标记,并获取status值
|
||||
const match = firstLine.match(/^:::\s*task-list(?:\s+(\S+))?$/);
|
||||
if (!match) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (silent) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const status = match[1] || ''; // 获取status值,如果没有则为空字符串
|
||||
|
||||
let nextLine = startLine + 1;
|
||||
let content = [];
|
||||
|
||||
// 查找结束标记
|
||||
while (nextLine < endLine) {
|
||||
const lineStart = state.bMarks[nextLine] + state.tShift[nextLine];
|
||||
const lineMax = state.eMarks[nextLine];
|
||||
const line = state.src.slice(lineStart, lineMax);
|
||||
|
||||
if (line.trim() === ':::') {
|
||||
break;
|
||||
}
|
||||
|
||||
content.push(line);
|
||||
nextLine++;
|
||||
}
|
||||
|
||||
// 解析任务
|
||||
const tasks = [];
|
||||
let currentTask = null;
|
||||
let isCollectingDesc = false;
|
||||
let descLines = [];
|
||||
|
||||
content.forEach(line => {
|
||||
const titleMatch = line.trim().match(/^title:\s*(.+)$/);
|
||||
const descMatch = line.trim().match(/^desc:\s*(.*)$/);
|
||||
|
||||
if (titleMatch) {
|
||||
// 如果已经有一个任务在处理中,保存它
|
||||
if (currentTask) {
|
||||
if (descLines.length > 0) {
|
||||
currentTask.desc = descLines.join('\n');
|
||||
}
|
||||
tasks.push(currentTask);
|
||||
}
|
||||
|
||||
// 开始新的任务
|
||||
currentTask = {title: titleMatch[1]};
|
||||
isCollectingDesc = false;
|
||||
descLines = [];
|
||||
} else if (descMatch) {
|
||||
isCollectingDesc = true;
|
||||
if (descMatch[1]) {
|
||||
descLines.push(descMatch[1]);
|
||||
}
|
||||
} else if (isCollectingDesc && line.trim() && !line.trim().startsWith('title:')) {
|
||||
// 收集多行描述,但不包括空行和新的title行
|
||||
descLines.push(line.trim());
|
||||
}
|
||||
});
|
||||
|
||||
// 处理最后一个任务
|
||||
if (currentTask) {
|
||||
if (descLines.length > 0) {
|
||||
currentTask.desc = descLines.join('\n');
|
||||
}
|
||||
tasks.push(currentTask);
|
||||
}
|
||||
|
||||
// 生成HTML
|
||||
const showIndex = tasks.length > 1;
|
||||
const taskItems = tasks.map((task, index) => [
|
||||
'<li>',
|
||||
showIndex ? `<div class="task-index">${index + 1}.</div>` : '',
|
||||
'<div class="task-item">',
|
||||
`<div class="title">${task.title}</div>`,
|
||||
task.desc ? `<div class="desc">${task.desc}</div>` : '',
|
||||
'</div>',
|
||||
'</li>'
|
||||
].join(''));
|
||||
|
||||
const htmls = [
|
||||
'<div class="apply-create-task">',
|
||||
'<ul>',
|
||||
taskItems.join(''),
|
||||
'</ul>',
|
||||
'<div class="apply-button">',
|
||||
`<div class="apply-create-task-button${status ? ' ' + status : ''}">+添加任务</div>`,
|
||||
'</div>',
|
||||
'</div>'
|
||||
];
|
||||
|
||||
// 添加token
|
||||
const token = state.push('html_block', '', 0);
|
||||
token.content = htmls.join('');
|
||||
token.map = [startLine, nextLine];
|
||||
|
||||
state.line = nextLine + 1;
|
||||
return true;
|
||||
});
|
||||
|
||||
// 测试不同的情况
|
||||
const testCase = `
|
||||
::: task-list status
|
||||
title: 1单个任务的测试
|
||||
desc: 这个任务不应该显示序号
|
||||
title: 2任务标题1
|
||||
desc: 任务描述-1
|
||||
123123
|
||||
|
||||
title: 3任务标题2
|
||||
title: 没有描述的任务1
|
||||
|
||||
title: 4有多行描述的任务2
|
||||
desc: 第一行描述
|
||||
第二行描述
|
||||
第三行描述
|
||||
:::
|
||||
`;
|
||||
|
||||
console.log(mdIt.render(testCase));
|
||||
73
test_regex.php
Normal file
73
test_regex.php
Normal file
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
function cleanTaskList($text) {
|
||||
// 定义模式来匹配整个任务块
|
||||
$pattern = '/:::\s*(create-task-list|create-subtask-list)(.*?):::/s';
|
||||
|
||||
// 替换函数
|
||||
$replacement = function($matches) {
|
||||
$content = $matches[2];
|
||||
|
||||
// 提取所有标题和描述
|
||||
$lines = explode("\n", trim($content));
|
||||
$result = [];
|
||||
$currentTitle = '';
|
||||
|
||||
foreach ($lines as $line) {
|
||||
$line = trim($line);
|
||||
if (empty($line)) continue;
|
||||
|
||||
if (preg_match('/^title:\s*(.+)$/', $line, $titleMatch)) {
|
||||
$currentTitle = $titleMatch[1];
|
||||
$result[] = $currentTitle;
|
||||
} elseif (preg_match('/^desc:\s*(.+)$/', $line, $descMatch)) {
|
||||
if (!empty($currentTitle)) {
|
||||
$result[] = $descMatch[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return implode("\n", $result);
|
||||
};
|
||||
|
||||
// 执行替换
|
||||
return preg_replace_callback($pattern, $replacement, $text);
|
||||
}
|
||||
|
||||
// 测试代码
|
||||
$input = <<<EOD
|
||||
啊大家啊速度快放假阿斯达哦佛阿萨代发
|
||||
|
||||
::: create-task-list
|
||||
title: 任务标题1
|
||||
desc: 任务描述1
|
||||
|
||||
title: 任务标题2
|
||||
desc: 任务描述2
|
||||
|
||||
title: 任务标题3
|
||||
|
||||
title: 任务标题4
|
||||
desc: 任务描述4
|
||||
:::
|
||||
|
||||
1231231231
|
||||
|
||||
::: create-subtask-list
|
||||
title: 任务标题5
|
||||
desc: 任务描述5
|
||||
|
||||
title: 任务标题6
|
||||
desc: 任务描述6
|
||||
|
||||
title: 任务标题7
|
||||
|
||||
title: 任务标题8
|
||||
desc: 任务描述8
|
||||
:::
|
||||
EOD;
|
||||
|
||||
$result = cleanTaskList($input);
|
||||
echo $result;
|
||||
|
||||
?>
|
||||
Loading…
x
Reference in New Issue
Block a user