...
This commit is contained in:
145
herolib/core/heroscript/tools.py
Normal file
145
herolib/core/heroscript/tools.py
Normal file
@@ -0,0 +1,145 @@
|
||||
|
||||
from typing import List
|
||||
import os
|
||||
from colorama import Fore, Style
|
||||
from herotools.texttools import dedent
|
||||
import textwrap
|
||||
|
||||
#load the heroscripts from filesystem
|
||||
def heroscript_blocks(path: str) -> List[str]:
|
||||
|
||||
heroscript_blocks = list()
|
||||
|
||||
for root, dirs, files in os.walk(path):
|
||||
for file in files:
|
||||
if file.endswith(".md"):
|
||||
file_path = os.path.join(root, file)
|
||||
with open(file_path, "r") as f:
|
||||
content = f.read()
|
||||
blocks = _extract_heroscript_blocks(content)
|
||||
heroscript_blocks.extend(blocks)
|
||||
|
||||
return heroscript_blocks
|
||||
|
||||
|
||||
def _extract_heroscript_blocks(content: str):
|
||||
content=dedent(content)
|
||||
blocks = []
|
||||
lines = content.split("\n")
|
||||
|
||||
in_block = False
|
||||
block_lines : List[str] = list()
|
||||
|
||||
for line in lines:
|
||||
if line.startswith("```hero"):
|
||||
in_block = True
|
||||
block_lines = []
|
||||
elif line.startswith("```") and in_block:
|
||||
in_block = False
|
||||
block = "\n".join(block_lines)
|
||||
blocks.append(block)
|
||||
elif in_block:
|
||||
block_lines.append(line)
|
||||
return blocks
|
||||
|
||||
|
||||
def action_blocks(path: str = "", content:str = "") -> List[str]:
|
||||
if content!="":
|
||||
return __action_blocks_get(content)
|
||||
res : List[str] = list()
|
||||
for hscript in heroscript_blocks(path):
|
||||
for actionscript in __action_blocks_get(hscript):
|
||||
res.append(actionscript)
|
||||
return res
|
||||
|
||||
def __action_blocks_get(content: str) -> List[str]:
|
||||
content=dedent(content)
|
||||
blocks = list()
|
||||
lines = content.split("\n")
|
||||
|
||||
block_lines : List[str] = list()
|
||||
herofound=False
|
||||
|
||||
for line in lines:
|
||||
# print(line)
|
||||
if line.startswith("!!"):
|
||||
herofound=True
|
||||
if block_lines: #means we found before
|
||||
block = "\n".join(block_lines)
|
||||
blocks.append(block)
|
||||
block_lines = []
|
||||
# print("f1")
|
||||
block_lines.append(line)
|
||||
elif line.strip() and not line.startswith(" ") and not line.startswith("\t") and block_lines:
|
||||
block = "\n".join(block_lines)
|
||||
blocks.append(block)
|
||||
block_lines = []
|
||||
herofound=False
|
||||
elif herofound:
|
||||
block_lines.append(line)
|
||||
# print("append")
|
||||
|
||||
if block_lines:
|
||||
block = "\n".join(block_lines)
|
||||
blocks.append(block)
|
||||
|
||||
return blocks
|
||||
|
||||
def myprint(obj):
|
||||
class_name = f"{Fore.YELLOW}{obj.__class__.__name__}{Style.RESET_ALL}"
|
||||
fields = [field for field in obj.__fields__ if field in obj.__dict__]
|
||||
attributes = ', '.join(f"{Fore.LIGHTBLACK_EX}{field}{Style.RESET_ALL}={Fore.GREEN}'{getattr(obj, field)}'{Style.RESET_ALL}" for field in fields)
|
||||
print( f"{class_name}({attributes})" )
|
||||
|
||||
|
||||
#format text to be ready to be set in heroscript
|
||||
def format_multiline_text(text: str) -> str:
|
||||
|
||||
text = dedent(text)
|
||||
text = textwrap.indent(text, " ")
|
||||
|
||||
# Join the formatted lines with newline characters and add the required indentation
|
||||
formatted_text = "'\n" + text + "\n '"
|
||||
|
||||
return formatted_text
|
||||
|
||||
|
||||
|
||||
#representation with colors of heroscript
|
||||
def heroscript_repr(content:str) ->str:
|
||||
lines = content.split("\n")
|
||||
formatted_lines = []
|
||||
|
||||
for line in lines:
|
||||
if line.startswith("!!"):
|
||||
formatted_line = f"{Fore.RED}{line}{Style.RESET_ALL}"
|
||||
elif ":" in line:
|
||||
prop, value = line.split(":", 1)
|
||||
prop = prop.strip()
|
||||
value = value.strip()
|
||||
|
||||
if value.startswith("'") and value.endswith("'"):
|
||||
value = f" {Fore.GREEN}{value}{Style.RESET_ALL}"
|
||||
else:
|
||||
value = f" {Fore.YELLOW}{value}{Style.RESET_ALL}"
|
||||
|
||||
formatted_line = f" {Fore.CYAN}{prop}{Style.RESET_ALL}:{value}"
|
||||
else:
|
||||
formatted_line = line
|
||||
|
||||
formatted_lines.append(formatted_line)
|
||||
|
||||
return "\n".join(formatted_lines)
|
||||
|
||||
def heroscript_print(content:str):
|
||||
o=heroscript_repr(content)
|
||||
print(o)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
t=" something\n a\n\n bbbb"
|
||||
|
||||
print(dedent(t))
|
||||
|
||||
print(format_multiline_text(t))
|
Reference in New Issue
Block a user