--[[ Mitchell's html/commands.lua Copyright (c) 2006-2008 Mitchell Foral. All rights reserved. SciTE-tools homepage: http://caladbolg.net/scite.php Send email to: mitchellcaladbolgnet Permission to use, copy, modify, and distribute this file is granted, provided credit is given to Mitchell. ]]-- --- -- Commands for the html module. -- There are several option variables used: -- PLATFORM: OS platform (linux or windows). -- FILE_IN: Location of the temporary file used as STDIN for various -- operations. -- FILE_OUT: Location of the temporary file that will contain output for -- various operations. -- REDIRECT: The command line symbol used for redirecting STDOUT to a file. -- PHP_CMD: The command that executes the PHP interpreter. module('modules.html.commands', package.seeall) -- platform specific options local PLATFORM = PLATFORM or 'linux' local FILE_IN, FILE_OUT, REDIRECT, PHP_CMD if PLATFORM == 'linux' then FILE_IN = '/tmp/scite_input' FILE_OUT = '/tmp/scite_output' REDIRECT = '" &> ' PHP_CMD = 'php -r "' elseif PLATFORM == 'windows' then FILE_IN = os.getenv('TEMP')..'\\scite_input.php' FILE_OUT = os.getenv('TEMP')..'\\scite_output.txt' REDIRECT = '" > ' PHP_CMD = 'php -r "' end -- end options -- local functions local php_command, get_sel_or_line --- -- Toggle block comment function for HTML. -- If a single line is being block commented, it is done so on the same line. -- If multiple lines are being block commented, the start of the comment is -- placed on a new line before the first selected line and the end of the -- comment is placed on a new line after the last selected line. function toggle_block_comment() local sep = ' ' local sline = editor:LineFromPosition(editor.CurrentPos) local eline = editor:LineFromPosition(editor.Anchor) if sline ~= eline then -- multiline comment if sline > eline then sline, eline = eline, sline end local s = editor:PositionFromLine(sline) local e = editor.LineEndPosition[eline] editor:SetSel(s, e) sep = '\n' else editor:VCHome(); editor:LineEndExtend() end local txt = editor:GetSelText() local ws1, uncommented, ws2 = txt:match('^(%s*)(%s*)$') if not uncommented then editor:ReplaceSel('') else editor:ReplaceSel(ws1..uncommented..ws2) end end --- -- Wraps the selected text inside a snippet that expands to an HTML tag. function wrap_in_tag() modules.scite.snippets.insert( "<${1:p}>$(SelectedText)") end --- -- Uses PHP to replace the selection or the contents of the current line with -- its URL-encoded equivalent. -- @see php_command. function encode_url() local txt = get_sel_or_line() editor:ReplaceSel( php_command('echo urlencode( fgets(STDIN) );', txt) ) end --- -- Uses PHP to replace the URL-encoded selection or the contents of the current -- line with its URL-decoded equivalent. -- @see php_command. function decode_url() local txt = get_sel_or_line() editor:ReplaceSel( php_command('echo urldecode( fgets(STDIN) );', txt) ) end --- -- Uses PHP to replace special characters in the selection or the contents of -- the current line with their HTML entities. -- @see php_command. function encode_html_entities() local txt = get_sel_or_line() editor:ReplaceSel( php_command('echo htmlentities( fgets(STDIN) );', txt) ) end --- -- Uses PHP to replace HTML entities in the selection or the contents of the -- current line with their ASCII equivalents. -- @see php_command. function decode_html_entities() local txt = get_sel_or_line() editor:ReplaceSel( php_command('echo html_entity_decode( fgets(STDIN) );', txt) ) end --- -- Use PHP to strip HTML and PHP tags from the selection or the contents of the -- current line and replace the text. -- @see php_command. function strip_tags() local txt = get_sel_or_line() editor:ReplaceSel( php_command('echo strip_tags( fgets(STDIN) );', txt) ) end --- -- [Local function] Execute PHP and return the result printed to STDOUT. -- @param cmd The PHP code to execute. -- @param input The text provided as STDIN for cmd. php_command = function(cmd, input) local f, out f = io.open(FILE_IN, 'w') f:write(input) f:close() os.execute(PHP_CMD..cmd..REDIRECT..FILE_OUT..' < '..FILE_IN) f = io.open(FILE_OUT) out = f:read('*all') f:close() return out end --- -- [Local function] Returns the current selection or the contents of the -- current line. get_sel_or_line = function() if editor:GetSelText() == '' then Editing.select_line() end return editor:GetSelText() end -- HTML-specific key commands local keys = _G.keys if keys and type(keys) == 'table' then keys[SCLEX_HTML].cq = { toggle_block_comment } keys[SCLEX_HTML].caw = { wrap_in_tag } end