--[[--------------------------------------------------
SortText.lua
Authors: Tugarinov Sergey, mozers™, Tymur Gubayev
version 2.1
------------------------------------------------------
Sorting selected lines_tbl alphabetically and vice versa
Сортировка выделенных строк по алфавиту и наоборот

Connection:
	Set in a file .properties:
		command.name.37.*=Sorting of lines_tbl A… z / z… A
		command.37.*=dofile $(SciteDefaultHome)\tools\SortText.lua
		command.mode.37.*=subsystem:lua,savebefore:no
--]]--------------------------------------------------

local lines_tbl = {} -- Таблица со строками нашего текста
local sort_direction_decreasing = false -- Обратный порядок сортировки
local patt = [[^[%s'"`«]*]] -- патерн для сортировки без учета пробелов и кавычек в начале строки

-- сравниваем две строки
local function CompareTwoLines(line1, line2)
	line1 = line1:gsub(patt, '')
	line2 = line2:gsub(patt, '')
	if sort_direction_decreasing then
		return (line1:lower() > line2:lower())
	else
		return (line1:lower() < line2:lower())
	end
end

-- автоматически определяем направление сортировки, последовательно сравнивая строки с последней строкой
local function GetSortDirection()
	local end_line = lines_tbl[#lines_tbl]:gsub(patt, '')
	for i = 1, #lines_tbl-1 do
		local comp_line = lines_tbl[i]:gsub(patt, '')
		if comp_line ~= end_line then
			return CompareTwoLines(comp_line, end_line)
		end
	end
end

local sel_text = editor:GetSelText()
local sel_start = editor.SelectionStart
local sel_end = editor.SelectionEnd
if sel_text ~= '' then
	local current_line = ''
	-- разделяем на строки и загоняем их в таблицу
	for current_line in sel_text:gmatch('[^\n]+') do
		lines_tbl[#lines_tbl+1] = current_line
	end
	if #lines_tbl > 1 then
		sort_direction_decreasing = GetSortDirection()
		-- сортируем строки в таблице
		table.sort(lines_tbl, CompareTwoLines)
		-- соединяем все строки из таблицы вместе
		local out_text = table.concat(lines_tbl, '\n')..'\n'
		editor:ReplaceSel(out_text)
	end
end
-- восстанавливаем выделение
editor:SetSel(sel_start, sel_end)