0.6.1 developing

HTML format!!!!!!
This commit is contained in:
shenjackyuanjie 2022-01-09 20:06:41 +08:00
parent 643298c400
commit 920b1e5af0
5 changed files with 115 additions and 24 deletions

View File

@ -12,9 +12,7 @@ gitee: @shenjackyuanjie
""" """
import re import re
import parse
import pprint import pprint
from typing import List, Dict, Union, Iterable
from Difficult_Rocket import translate from Difficult_Rocket import translate
@ -38,7 +36,10 @@ class SingleTextStyle:
self.bold = bold self.bold = bold
self.italic = italic self.italic = italic
self.color = color self.color = color
self._tag = text_tag if not text_tag:
self._tag = []
else:
self._tag = text_tag
self.show = show self.show = show
self.text = text self.text = text
@ -93,14 +94,43 @@ class SingleTextStyle:
self.text = self.text self.text = self.text
return self return self
def same_tag(self, other: 'SingleTextStyle') -> bool: """
对各种判定的支持
"""
def have_tag(self, other: 'SingleTextStyle') -> bool:
"""
比较两个字体样式tag是否相同
:param other: 叠加的字体样式
:return: 是否相同
"""
assert type(other) == SingleTextStyle
return other.tag in self.tag
def same_style(self, other: 'SingleTextStyle') -> bool:
""" """
比较两个字体样式是否相同 比较两个字体样式是否相同
:param other: 叠加的字体样式 :param other: 叠加的字体样式
:return: 是否相同 :return: 是否相同
""" """
assert type(other) == SingleTextStyle assert type(other) == SingleTextStyle
return self.tag == other.tag return (self.font_name == other.font_name and
self.font_size == other.font_size and
self.bold == other.bold and
self.italic == other.italic and
self.color == other.color and
self.show == other.show)
"""
自动输出一些属性的支持
"""
def HTML_style_text(self) -> str:
"""
输出字体样式的HTML代码
:return: HTML代码
"""
return f'<font name="{self.font_name}" real_size={self.font_size} bold={self.bold} italic={self.italic} color={self.color}>'
# [\u4e00-\u9fa5] 中文字符 # [\u4e00-\u9fa5] 中文字符
@ -134,9 +164,9 @@ default_fonts_config = [
'ignore': { 'ignore': {
# 如果匹配到的字符含有 tag 就忽略本次解析 # 如果匹配到的字符含有 tag 就忽略本次解析
'match': re.compile(r'\*'), 'match': re.compile(r'\*'),
'style': SingleTextStyle(text_tag=['italic']) 'tag': SingleTextStyle(text_tag=['italic'])
}, },
'style': SingleTextStyle(italic=True) 'style': SingleTextStyle(italic=True)
}, },
{ {
# Markdown 链接规则匹配 # Markdown 链接规则匹配
@ -145,16 +175,75 @@ default_fonts_config = [
# 匹配的内容:[abc](def) # 匹配的内容:[abc](def)
# 显示的内容abc # 显示的内容abc
'match': re.compile(r'\[(.*?(?<!\s))\]\((.*?(?<!\s))\)'), 'match': re.compile(r'\[(.*?(?<!\s))\]\((.*?(?<!\s))\)'),
'shown': re.compile(r'(?<=\[)(.*?(?<!\s))(?=\]\((.*?(?<!\s))\))') 'shown': re.compile(r'(?<=\[)(.*?(?<!\s))(?=\]\((.*?(?<!\s))\))'),
'style': SingleTextStyle(bold=True)
} }
] ]
font_HTML_end = '</font>'
def decode_text_to_HTML(text: str, def decode_text2HTML(text: str,
config=None) -> str: configs=None) -> str:
if config is None: if configs is None:
config = default_fonts_config configs = default_fonts_config
style_list = [SingleTextStyle() for x in range(len(text))] style_list = [SingleTextStyle(text=text[x]) for x in range(0, len(text))]
style_HTML_str = '' # 字体样式HTML字符串
# 根据输入的配置对每一个字符进行样式设定
for config in configs:
# 根据 配置"文件"
match_texts = config['match'].finditer(text) # 使用config.match匹配
for match_text in match_texts: # 每一个匹配到的匹配项
text_match = match_text.group() # 缓存一下匹配到的字符,用于匹配显示的字符
shown_texts = config['shown'].finditer(text_match) # 使用config.shown匹配
match_start = match_text.span()[0]
match_end = match_text.span()[1]
if 'ignore' in config: # 如果样式选项包含忽略某些字符的tag
ignore_texts = config['ignore']['match'].finditer(text_match) # 根据选项匹配可能忽略的字符
ignore = False # 忽略先为False
for ignore_text in ignore_texts: # 每一个可能忽略的字符
if ignore: # 为了方便退出
break
for ignore_index in range(match_start + ignore_text.span()[0], match_start + ignore_text.span()[1]): # 对每一个可能的字符进行检测
if style_list[ignore_index].have_tag(config['ignore']['tag']): # 如果确实包含要忽略的
ignore = True # 忽略为True
break
if ignore:
continue # 跳过本次匹配
if 'tag' in config: # 如果样式选项包含对部分字符添加tag
tag_texts = config['tag']['match'].finditer(text_match) # 根据配置的正则表达式匹配要添加tag的字符
for tag_text in tag_texts: # 对每一个匹配到的~~~~~~
for tag_index in range(match_start + tag_text.span()[0], match_start + tag_text.span()[1]): # 用于遍历匹配到的字符
style_list[tag_index] += config['tag']['style']
# 为匹配到的字符添加样式
for match_index in range(match_start, match_end): # 用于遍历匹配到的字符
# 这里用match index来精确读写列表里的元素毕竟re.Match返回的span是两个标点得遍历
style_list[match_index] += config['style'] # 字体样式列表的[match_index] += config['style']的样式
style_list[match_index].show = False # 设置显示属性变为False
# 为每一个显示的字符设置显示属性
for shown_text in shown_texts: # 每一个显示的匹配项
for shown_index in range(match_start + shown_text.span()[0], match_start + shown_text.span()[1]):
style_list[shown_index].show = True
# 字体样式列表的[shown_index]设置显示属性变为True
# 开始根据配置好的样式输出HTML文本
style_list[0].text = style_list[0].HTML_style_text() + style_list[0].text if style_list[0].show else style_list[0].text
# 样式列表里的第一个.text
# 如果 (这个字符显示) = 第一个的HTML样式+第一个样式.text
# 否则 = 第一个样式.text(其实pass最好)
for style_index in range(1, len(style_list)): # 从第二个开始的每一个样式
if not style_list[style_index].same_style(style_list[style_index-1]): # 如果这个字符的样式跟前一个不一样
style_list[style_index-1].text += font_HTML_end # 在前一个样式.text 的后面附加一个 </font>
style_list[style_index].text = style_list[style_index].HTML_style_text() + style_list[style_index].text # 在这个样式.text 的前面放一个HTML样式
style_list[-1].text += font_HTML_end # 样式表的最后一个样式后面附加一个 </font>
# 输出最终的HTML文本
formatted_HTML_text = '' # 初始化一下
for style in style_list: # 每一个样式
if style.show: # 如果这个字符显示
formatted_HTML_text += style.text # 文本的后面附加一下
return formatted_HTML_text # 返回DONE

View File

@ -15,7 +15,7 @@
- [![Readme-gitee](https://img.shields.io/badge/Readme-中文(点我!)-blue.svg?style=flat-square)](README-cn.md) - [![Readme-gitee](https://img.shields.io/badge/Readme-中文(点我!)-blue.svg?style=flat-square)](README-cn.md)
- Using [SemVer 2.0.0](https://semver.org/) to manage version - Using [SemVer 2.0.0](https://semver.org/) to manage version
## ~~202112xx~~ 202201 V 0.6.1 ## ~~202111 202112xx~~ 202201 V 0.6.1
~~争取12月内发一个release~~ ~~争取12月内发一个release~~
@ -74,9 +74,9 @@
- added `json5` `pyglet` `pyperclip` `xmltodict` LICENSE - added `json5` `pyglet` `pyperclip` `xmltodict` LICENSE
- thanks a lot to above module's author and maintainer - thanks a lot to above module's author and maintainer
- 继续~~重~~新写了一个基于 `HTMLLabel``HTMLformatedLabel` - 继续~~重~~新写了一个基于 `HTMLLabel``HTMLformatedLabel`
- 同时为他写了一个 `decode_text_to_HTML` 工具(这也是咕咕咕的一大部分原因) - 同时为他写了一个 `decode_text2HTML` 工具(这也是咕咕咕的一大部分原因)
- add a `HTMLformatedLabel` Label based on `HTMLLabel` - add a `HTMLformatedLabel` Label based on `HTMLLabel`
- also write a `decode_text_to_HTML` tool (also a big reason why lazy) - also write a `decode_text2HTML` tool (also a big reason why lazy)
## 20211025 V 0.6.0 ## 20211025 V 0.6.0

View File

@ -155,7 +155,7 @@ _kernel32.GlobalLock.argtypes = [HGLOBAL]
_kernel32.GlobalUnlock.restype = BOOL _kernel32.GlobalUnlock.restype = BOOL
_kernel32.GlobalUnlock.argtypes = [HGLOBAL] _kernel32.GlobalUnlock.argtypes = [HGLOBAL]
_kernel32.SetLastError.restype = DWORD _kernel32.SetLastError.restype = DWORD
_kernel32.SetLastError.argtypes = [] _kernel32.SetLastError.argtypes = [DWORD]
_kernel32.SetWaitableTimer.restype = BOOL _kernel32.SetWaitableTimer.restype = BOOL
_kernel32.SetWaitableTimer.argtypes = [HANDLE, POINTER(LARGE_INTEGER), LONG, LPVOID, LPVOID, BOOL] # TIMERAPCPROC _kernel32.SetWaitableTimer.argtypes = [HANDLE, POINTER(LARGE_INTEGER), LONG, LPVOID, LPVOID, BOOL] # TIMERAPCPROC
_kernel32.WaitForSingleObject.restype = DWORD _kernel32.WaitForSingleObject.restype = DWORD

View File

@ -294,8 +294,7 @@ class Sprite(event.EventDispatcher):
batch=None, batch=None,
group=None, group=None,
usage='dynamic', usage='dynamic',
subpixel=False, subpixel=False):
program=None):
"""Create a sprite. """Create a sprite.
:Parameters: :Parameters:
@ -322,8 +321,6 @@ class Sprite(event.EventDispatcher):
`subpixel` : bool `subpixel` : bool
Allow floating-point coordinates for the sprite. By default, Allow floating-point coordinates for the sprite. By default,
coordinates are restricted to integer values. coordinates are restricted to integer values.
`program` : `~pyglet.graphics.shader.ShaderProgram`
A custom ShaderProgram.
""" """
self._x = x self._x = x
self._y = y self._y = y

View File

@ -22,8 +22,13 @@ os.chdir('..')
from Difficult_Rocket.guis.format import html from Difficult_Rocket.guis.format import html
try_texts = [ try_texts = [
# 'abcaaaa啊啊啊啊', 'abcaaaa啊啊啊啊',
# '从前有座山~', '从前*有座*山~',
'**挼**aaaaa[awda](123123)', '**挼**aaaaa[awda](123123)',
'[aaaa](嗷嗷喊)' '[aaaa](嗷嗷喊)'
] ]
for text in try_texts:
print(text)
print(html.decode_text2HTML(text))
print('------')