【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

相关文章

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预

【Godot4.3】多边形的斜线填充效果基础实现

概述 图案(Pattern)填充是一个非常常见的效果。其中又以斜线填充最为简单。本篇就探讨在Godot4.3中如何使用Geometry2D和CanvasItem的绘图函数实现斜线填充效果。 基础思路 Geometry2D类提供了多边形和多边形以及多边形与折线的布尔运算。按照自然的思路,多边形的斜线填充应该属于“多边形与折线的布尔运算”范畴。 第一个问题是如何获得斜线,这条斜线应该满足什么样

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

jqgrid设置单元格可编辑

1 在单元格的属性列设置为editable。 2 点击编辑按钮的时候,触发某一行设置为edit的状态。 jQuery("#rowed4").jqGrid({url:'server.php?q=2',datatype: "json",colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],colModel