Newer
Older
DungeonShooting / DungeonShooting_Godot / addons / script_comment_menu / sub_item / comment / comment.gd
@小李xl 小李xl on 3 Jun 2023 3 KB 引入Godot表格插件
#============================================================
#    Comment
#============================================================
# - datetime: 2022-07-17 14:49:15
#============================================================
## 脚本注释
class_name _ScriptMenu_Comments
extends _ScriptMenu_SubItem


const SEPARATE_LENGTH = 60


var util_script_editor := ScriptCommentMenuConstant.ScriptEditorUtil.new()
var util_script := ScriptCommentMenu_ScriptUtil.new()

var regex = RegEx.new()


#============================================================
#  内置
#============================================================
func _init():
	var pattern = "(?<indent>\\s*)(static\\s+)?func\\s+(?<method>[^\\(]+)"
	regex.compile(pattern)


#============================================================
#  自定义
#============================================================
#(override)
func _init_menu(menu_button: MenuButton):
	# 设置添加菜单项
	var menu : PopupMenu = menu_button.get_popup()
	add_menu_item(menu_button, "脚本注释", {}, _script_comment)
	add_separator(menu_button)
	add_menu_item(menu_button, "方法注释", {
		"key": KEY_C,
		"ctrl": true,
		"shift": true,
	}, _func_comment)
	add_menu_item(menu_button, "类别分隔", {
		"key": KEY_SLASH,
		"ctrl": true,
		"shift": true,
	}, _category_comment)


#============================================================
#  功能
#============================================================
##  方法注释
func _func_comment():
	var text_edit : TextEdit = util_script_editor.get_current_code_editor()
	var line : int = text_edit.get_caret_line()
	
	for i in range(line, text_edit.get_line_count()):
		var line_code : String = text_edit.get_line(i)
		var result = regex.search(line_code)
		if result:
			var method = result.get_string("method").strip_edges()
			printt(method
				, util_script_editor.get_current_script()
				, util_script_editor.get_current_script().resource_path
			)
			
			var indent = result.get_string("indent")
			var data = util_script.find_method_data(util_script_editor.get_current_script(), method)
			if data.size() == 0:
				printerr('没有找到', method,'方法的数据,脚本是否还未保存?')
				return
			
			var code : String = "##  %s\n" % data['name']
			if data['args'].size() > 0:
				code += (indent + "##[br]\n")
				for arg in data['args']:
					code += (indent + "##[br][code]%s[/code]  \n" % arg['name'])
			if data['return']['type'] != TYPE_NIL:
				code += (indent + "##[br][code]return[/code]  ")
			code = code.trim_suffix("\n")
			util_script_editor.insert_code_current_pos(code, true)
			break

##  脚本注释
func _script_comment():
	var script = util_script_editor.get_current_script()
	if script == null:
		return
	
	var separa = "=".repeat(SEPARATE_LENGTH)
	
	# 脚本名
	var script_name = script.resource_path.get_file().get_basename().capitalize()
	# 时间
	var datetime = Time.get_datetime_dict_from_system()
	var datetime_str = "%02d-%02d-%02d %02d:%02d:%02d" % [
		datetime['year'], datetime['month'], datetime['day'],
		datetime['hour'], datetime['minute'], datetime['second'],
	]
	
	var code = """#{sep}
#    {name}
#{sep}
# - author: zhangxuetu
# - datetime: {datetime}
# - version: 4.0
#{sep}
""".format({
	"sep": separa,
	"name": script_name,
	"datetime": datetime_str,
})
	# 插入到顶部
	var textedit = util_script_editor.get_current_code_editor()
	textedit.set_caret_line(0)
	textedit.set_caret_column(0)
	textedit.insert_text_at_caret(code)


## 类别分隔
func _category_comment():
	var separa = "=".repeat(SEPARATE_LENGTH)
	var code = """#{sep}
#  
#{sep}""".format({
		"sep": separa,
	})
	
	var textedit = util_script_editor.get_current_code_editor()
	textedit.set_caret_column(0)
	textedit.insert_text_at_caret(code)
	textedit.set_caret_line(textedit.get_caret_line() - 1)