【Godot4.3】MarkDown编辑和控件事实渲染

2024-09-01 05:20

本文主要是介绍【Godot4.3】MarkDown编辑和控件事实渲染,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

这是本人2024年5月份左右编写的一个简易的MarkDown编辑和渲染测试项目,基于自己编写的MarkDown解析和生成类MDdoc编写。之前是作为一个试验性的内容混乱的放置在另一个测试项目中,现在独立为一个单独项目。因为测验成功后就一直没改动,所以这仍然是一个很初期的版本。

项目核心

在这里插入图片描述

它的核心是有两部分:

  • MDdoc类:一个MarkDown纯文本解析类,可以将MarkDown文档元素按其顺序解析为对象,从存入内部的数组。每个MarkDown文档元素对应MDdoc的一个内部类:
    • CodebBlock:代码块
    • Headding:标题,H1-H6
    • Paragraph:普通段落
    • Img:图片
    • UL:无序列表
    • OL:有序列表
    • Table:表格
  • 主编辑器:采用传统的左侧编写,右侧渲染的形式。其主要是在左侧编辑器编辑时,利用MDdoc类实时的生成MarkDown元素列表,再借由右侧的一个VBoxContainer顺序渲染相应的控件显示内容。

在这里插入图片描述

编辑器语法高亮

为了让MarkDown代码显得不那么无聊,在对应的CodeEdit上手动用代码添加了一些语法高亮规则。

extends CodeEdit@export var Hedding_color:= Color.GOLD
@export var codeblock_color:= Color.AQUAMARINEfunc _ready() -> void:var highlighter = CodeHighlighter.new()# H1 - H6for i in range(6):highlighter.add_color_region("%s " % "#".repeat(i+1)," ",Hedding_color,true)highlighter.add_color_region("```","```",codeblock_color,false)highlighter.add_color_region("- "," ",codeblock_color,true)for i in range(100):var start = "1. " % (i+1)highlighter.add_color_region(start," ",codeblock_color,true)#highlighter.add_color_region("- "," ",codeblock_color,true)syntax_highlighter = highlighter

实时渲染

mdTest(VBoxContainer)节点上,我们通过遍历MDdoc解析后生成的MarkDown元素数组,并根据对应的元素类型添加不同的控件为mdTest的子节点,从而实现MarkDown内容渲染和显示。

  • 每次调用render,都会先清空mdTest(VBoxContainer)上的所有子节点,然后重新渲染MDdoc解析后生成的MarkDown元素
# ==================== 核心渲染方法 ====================
# 渲染为控件
func render(md):# 清空原来的for child in get_children():remove_child(child)# 渲染var doc := MDdoc.parse(md)for ele in doc._doc:if ele is MDdoc.Headding:add_child(H(ele.level,ele.text))if ele is MDdoc.CodebBlock:add_child(CodeBlock(ele.language,ele.code))if ele is MDdoc.Paragraph:add_child(p(ele.text))if ele is MDdoc.UL:add_child(ul(ele))if ele is MDdoc.OL:add_child(ol(ele))if ele is MDdoc.Img:add_child(img(ele.src,ele.desc))

其中render()_ready()CodeEdit发生文本改变时调用,从而实现运行后的解析和编辑时的实时渲染。

func _ready() -> void:render(code_edit.text)# 文本发生改变时
func _on_code_edit_text_changed() -> void:render(code_edit.text)pass

为了让代码清晰,为控件生成编写了对应的函数。

# ==================== 获取对应的控件 ====================
# H1- H6
func H(level:int,text:String) -> Label:var lab := Label.new()lab.text = textlab.set("theme_override_font_sizes/font_size",H_size[level-1])lab.set("theme_override_colors/font_color",font_color)return lab# 段落
func p(text:String) -> Label:var lab := Label.new()lab.text = textlab.set("theme_override_font_sizes/font_size",p_size)lab.set("theme_override_colors/font_color",font_color)return lab# 代码块
func CodeBlock(language:String,code:String) -> CodeEdit:var txt := CodeEdit.new()txt.text = codetxt.custom_minimum_size.y = 200txt.gutters_draw_line_numbers = truereturn txt# 无序列表
func ul(ele) -> Label:var lab := Label.new()lab.text = ele.to_string()lab.set("theme_override_font_sizes/font_size",p_size)lab.set("theme_override_colors/font_color",font_color)return lab# 无序列表
func ol(ele) -> Label:var lab := Label.new()lab.text = ele.to_string()lab.set("theme_override_font_sizes/font_size",p_size)lab.set("theme_override_colors/font_color",font_color)return lab
# 图片
func img(src:String,desc:String):var pic := TextureRect.new()pic.expand_mode = TextureRect.EXPAND_FIT_WIDTHpic.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTEREDpic.custom_minimum_size.y = 100if load(src):pic.texture = load(src)else:pic.texture = load("res://1.jpeg")return pic

剩余的就是基础的应用和参数设定了。

extends VBoxContainer@onready var code_edit: CodeEdit = %CodeEdit# 文本颜色
@export var font_color:Color = Color.BLACK# 字号
var H_size = [48,40,36,32,28,26]  # H1-H6字号
var p_size = 20  # 正文字号

其他渲染选择

其实利用VBoxContainer按顺序动态加载控件的形式只是一个很简易甚至粗鄙的形式,完全没有考虑长篇幅文档的性能问题。
在Godot内部,可以选择其他的形式来作为MarkDown内容渲染和显示的选择:

  • RichTextLabel+BBCode:富文本标签,天然支持BBCode语法,也是Godot内置文档的渲染和显示控件,很容易实现,而且可以选择和复制内容
  • 基于绘图函数的渲染:基于CanvasItem的绘图函数,我们可以将MarkDown内容渲染到一个Control

其中RichTextLabel是比较有前途的选项。

代码实时渲染类工具的魅力

其实采用VBoxContainer动态渲染是为了检验一种工具软件类型的可行性,就是代码实时渲染类工具。
它的特点就是一边编写,一边运行代码进行测试。在5月份编写这个工具的同时,我还测试编写了一个用代码测试绘图函数和动画的小工具。

界面和功能分离

MDdoc其实是MarkDown解析和生成的核心,借由这个类,我可以选择不同的MarkDown渲染路线,创建不同的界面,甚至完全不同的程序。甚至也可以将其用于创建游戏项目的内置百科。

这篇关于【Godot4.3】MarkDown编辑和控件事实渲染的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1126053

相关文章

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

WinForms中主要控件的详细使用教程

《WinForms中主要控件的详细使用教程》WinForms(WindowsForms)是Microsoft提供的用于构建Windows桌面应用程序的框架,它提供了丰富的控件集合,可以满足各种UI设计... 目录一、基础控件1. Button (按钮)2. Label (标签)3. TextBox (文本框

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Python+Tkinter实现Windows Hosts文件编辑管理工具

《Python+Tkinter实现WindowsHosts文件编辑管理工具》在日常开发和网络调试或科学上网场景中,Hosts文件修改是每个开发者都绕不开的必修课,本文将完整解析一个基于Python... 目录一、前言:为什么我们需要专业的Hosts管理工具二、工具核心功能全景图2.1 基础功能模块2.2 进

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t