Scite Comment Box

lua-users home
wiki

A script that allows you to comment code (configured for php / cpp, but easy adaptable to other languages I think). Place following text in a file:

--~ Welcome, reader

--~ This script is used to comment parts of a text in a nicely formatted box.
--~ It is quite configurable (try different settings, experiment!), and I tried
--~ to add some comments in the whole script, to make it a bit more understandable.
--~ Anyhow, if you have any comments, please mail to jerous gmail com
--~ Have fun!
--~ ]erous.

--~ to use, make sure this script is loaded, add following in the userproperties
--~ and press F11 when done!
--~ command.name.3.*=Box-comment
--~ command.3.*=comment_type1
--~ command.subsystem.3.*=3
--~ command.mode.3.*=savebefore:no
--~ command.shortcut.3.*=F11

--~ char(s) indicating start of comment for 1 line
com_start_char = '|  '
com_end_char = '|'
--~ char(s) indicating commentblock
com_block_start_char = '/*\\'
com_block_end_char = '*/'
--~ character to use at the top line
com_topline_char = '_'
--~ character to use at the ending line
com_endline_char = '_'
--~ add following lines to the front/end of the commentbox
--~ as an array; e.g. com_add_to_front = {"Author: ]erous", "Date: today"}
com_add_to_front = {"Commented on "..os.date("%d-%m-%yT%H:%M:%S"), "By Me", ""}
com_add_to_end = {}


--~ create a comment box for the currently selected text
--~ if no text is selected, the current line will be 'box-commented'
function comment_type1()
--~ 	retrieve selected region...
	p1=editor:LineFromPosition(editor.SelectionStart);
	p2=editor:LineFromPosition(editor.SelectionEnd);
	
--~ 	if nothing selected, then take the line we are working on
	if p1==p2 then
		p2=p1+1
	end
	
--~ 	read the lines in the selection to an array
--~ 	 + add some new text to start and end (view config up here)
	lines = read_lines(p1,p2)
	
--~ 	get the length of the longest line
	max_str_len=get_longest_line(lines)+1

--~ 	create the start and endstrings
	header_len=(max_str_len+string.len(com_start_char..com_end_char)-string.len(com_block_start_char))/string.len(com_topline_char)
	footer_len=(max_str_len+string.len(com_start_char..com_end_char)-string.len(com_block_end_char))/string.len(com_endline_char)
	str_header = com_block_start_char..string.rep(com_topline_char, header_len).."\n"
	str_footer = string.rep(com_endline_char, footer_len)..com_block_end_char
	
--~ 	format the text...
	text = format_text(lines, max_str_len)
	
--~ 	... and add the header and footer
	text=str_header..text..str_footer
	
--~ 	and replace!
	editor:ReplaceSel(text)
--~ 	print(text)
end

--~ format the text, by adding com_start_char and com_end_char to respectively front and end
--~ and formatting it nicely
--~  lines: array containing the lines (without carriage returns etc)
--~  max_str_len: length of the longest line
--~  return: string formatted text
function format_text(lines, max_str_len)
	ret = ""
	
	for i=1,table.getn(lines) do
		ret=ret..com_start_char
                    ..lines[i]
                    ..string.rep(" ", string.len(str_header)-string.len(lines[i]..com_end_char..com_start_char)-1)
                    ..com_end_char.."\n"
	end
	
	return ret
end


--~ read the lines from the current selection
--~ and add some stuff to the front and end
--~  *_line: the lines from which the selection respectively starts and ends
--~  return: table containing all lines to be displayed, with returns removed, and tabs replaced by spaces
function read_lines(start_line, end_line)
	local ret = {}
	
--~ 	add things to add to the front
	for i=1,table.getn(com_add_to_front) do
		table.insert(ret,table.getn(ret)+1,com_add_to_front[i])
	end
	
--~ 	add the text
	for i=start_line,end_line-1 do
		line=editor:GetLine(i)
		
--~ 		remove returns, and replace tabs by the userdefined nr of spaces
		line=string.gsub(line, "\n", "")
		line=string.gsub(line, "\r", "")
		line=string.gsub(line, "\t", string.rep(" ", props['tabsize']))
		
		table.insert(ret,table.getn(ret)+1,line)
	end
	
--~ 	add things to add to the end
	for i=1,table.getn(com_add_to_end) do
		table.insert(ret,table.getn(ret)+1,com_add_to_end[i])
	end
	
	return ret
end

--~ retrieve the length of the longest line
--~  lines: array containing the lines to get longest line from
--~  return: int containing the length; -1 if failed
function get_longest_line(lines)
	max=-1
	
	for i=1,table.getn(lines) do
		if (string.len(lines[i])>max) then
			max=string.len(lines[i])
		end
	end
	
	return max
end 

RecentChanges · preferences
edit · history
Last edited February 28, 2008 6:35 pm GMT (diff)