Page 1 of 1

In-Editor Web Searching

Posted: Wed Jun 02, 2021 2:20 am
by jussij
The macro below can be used to initiate an in-editor Google search:

Code: Select all

--
--        Name: Web Search
--
--      Author: Jussi Jumppanen
--
--    Language: Lua Macro
--
-- Description: This Lua macro takes the current word or marked area and tries
--              to determine if the text should be loaded as a url or the text
--              details used in a web search.
--
--  How To Run: All Zeus macros can be run using the macro execute menu
--              item or they can be bound to the keyboard or they can
--              be attached to the macro drop down or popup menus.
--

local utils = require "utils"

function encodeChar(chr)
	return string.format("%%%X",string.byte(chr))
end

function encodeString(str)
	local output, t = string.gsub(str,"[^%w]",encodeChar)
	return output
end

function getLanguage()
    local language = ""
    local extension = string.lower(macro_tag("$Ext"))

    if (extension == ".ada") then
       language = "ada"
    elseif ((extension == ".asax"  ) or
            (extension == ".ascx"  ) or
            (extension == ".asmx"  ) or
            (extension == ".asp"   ) or
            (extension == ".aspx"  )) then
            language = "asp.net"
    elseif (extension == ".bat"   ) then
            language = "cmd"
    elseif ((extension == ".c"    ) or
            (extension == ".h"    )) then
            language = "clang"
    elseif ((extension == ".cpp"  ) or
            (extension == ".cxx"  ) or
            (extension == ".hpp"  ) or
            (extension == ".hxx"  ) or
            (extension == ".cppm" )) then
            language = "c++"
    elseif ((extension == ".cs"   )) then
            language = "c#"
    elseif ((extension == ".d"    )) then
            language = "dlang"
    elseif ((extension == ".f"    ) or
            (extension == ".for"  ) or
            (extension == ".f77"  ) or
            (extension == ".f90"  ) or
            (extension == ".f95"  ) or
            (extension == ".ftn"  ) or
            (extension == ".fort" )) then
            language = "fortran"
    elseif ((extension == ".go"   )) then
             language = "golang"
    elseif ((extension == ".html" ) or
            (extension == ".htm"  )) then
            language = "html"
    elseif ((extension == ".java" )) then
             language = "java"
    elseif ((extension == ".js" )) then
             language = "javascript"
    elseif ((extension == ".php"  ) or
            (extension == ".php3" ) or
            (extension == ".php4" ) or
            (extension == ".phtml")) then
            language = "php"
    elseif ((extension == ".bas"  ) or
            (extension == ".vba"  ) or
            (extension == ".vbs"  ) or
            (extension == ".frm"  )) then
            language = "VisualBasic"
    elseif (extension == ".lua") then
             language = "lua"
    elseif ((extension == ".rc"   ) or
            (extension == ".rh"   ) or
            (extension == ".dlg"  )) then
            language = "resource"
    elseif (extension == ".pas"  ) then
            language = "pascal"
    elseif ((extension == ".py"   ) or
            (extension == ".pl"   ) or
            (extension == ".pm"   )) then
            language = "python"
    elseif (extension == ".sql"   ) then
            language = "sql"
    end

    -- local message_text = ""
    -- message_text = message_text  .. "extension: " .. extension .. "\n"
    -- message_text = message_text  .. "language: " .. language .. "\n\n"
    -- message_box(1, message_text, "Language Details")

    return language
end

function key_macro()
    -- get the current word or marked area
    local current_word = macro_tag("$WEX")

    if (string.len(current_word) == 0) then
        message("To run a search place the cursor on a word or mark a region of text.")
        beep()
        return
    end

    if is_marked() == 1 then
        if string.starts(current_word, "https://", 1) or string.starts(current_word, "http://", 1) then
            message("Opening URL: " .. current_word)
            shell_execute(current_word)
            return
        end
    end

    local query = ""
    local language = getLanguage()

    if (string.len(language) > 0) then
        query = "\"" .. encodeString(language) .. "\"+"
    end

    query = query .. "\"" .. encodeString(current_word) .. "\""

    engines = { "https://www.google.com/search?q=",
                "https://duckduckgo.com/?q=",
                "https://www.bing.com/search?q=",
                "https://search.yahoo.com/search?q=" }

    for key, engine in ipairs(engines)
    do
        url = engine .. query
        message("Search URL: " .. url)
        shell_execute(url)
    end

    -- limit search to stackoverflow using google
    query = encodeString("site:stackoverflow.com") .. "+" .. query
    url = engines[1] .. query
    shell_execute(url)
end

key_macro() -- run the macro