Макросы для работы с HTML

Здесь обсуждается всё, что касается макросов.
Post Reply
wakh
Posts: 128
Joined: Wed 27 Apr, 2005 09:16
Location: Перогиреево
Has thanked: 6 times
Contact:

Макросы для работы с HTML

Post by wakh »

Пока я доделываю свои, решил спросить - может есть готовое?
Суть окружить строку/выделение тэгами ХТМЛ по хоткею.

Если готовых годных нет, то ...
Мои работают с буфером, чего хотелось бы избежать. Подскажите, как макросом
1. встать/писать в начало/конец селекшн;
2. запомнить положение курсора и после выполнения макроса вернуться в то же место.

Моя версия editor_HTML.lua:

Code: Select all

--[[
Ctrl + 1/2/3/4/B/P/E/S/L	Окружает выделение тегом h1 / h2 / h3 / h4 / b / p / em / s / li
Ctrl + U/O	Окружает выделение тегом UL/OL
Ctrl + H	Окружает выделение тегом a href=""
CtrlShift + H	Окружает выделение тегом a href="" + title
AltCtrl + H	Вставляет 2 строки в тэг А, 1-я - ссылка, 2-ю - ключевое слово
Ctrl + I	Вставляет выделение в тег img src=""
CtrlShift + I	Вставляет выделение в тег img src="" + alt
AltCtrl + I	Вставляет 2 строки в тег img, 1-ю в src, 2-ю в alt
Alt + A	Окружает текущую строку тегом из буфера обмена
Ctrl + X	Удаляет тег в начале и конце строки
]]--

-- Simple HTML Tags in pairs ["HotKey"]="T a g"
tk = {
	["1"] = "h 1",
	["2"] = "h 2",
	["3"] = "h 3",
	["4"] = "h 4",
	["B"] = "b",
	["P"] = "p",
	["E"] = "e m",
	["S"] = "s",
	["L"] = "l i"
};
for key, tag in pairs(tk) do
 Macro {
  area="Editor";   key="Ctrl"..key;   flags="";   description="HTML: Окружает выделение тегом" .. tag;   action = function()
   s = Object.Selected
   Keys(s and '' or 'Home ShiftEnd')
   Keys('ShiftDel < ' .. tag .. ' > ShiftIns < Divide ' .. tag .. ' >')
   Keys(s and '' or 'Home Down')
  end;
 }
end


-- HTML Lists
tk2 = {
	["O"] = "o l",
	["U"] = "u l"
};
for key, tag in pairs(tk2) do
 Macro {
  area="Editor";   key="Ctrl"..key;   flags="";   description="HTML: Окружает выделение тегом" .. tag;   action = function()
   Keys('ShiftDel < ' .. tag .. ' > Enter ShiftIns < Divide ' .. tag .. ' > Enter')
  end;
 }
end


-- HTML links & images = A & IMG
-- tk3 = {
-- 	["H"] = "",
-- 	["I"] = ""
-- };

Macro {
 area="Editor";   key="CtrlH";   flags="";   description="HTML: Окружает выделение тегом a href";   action = function()
  Keys('ShiftDel < a Space h r e f = " " > ShiftIns < Divide a >')
 end;
}
Macro {
 area="Editor";   key="CtrlShiftH";   flags="";   description="HTML: Окружает выделение тегом a href + title";   action = function()
  Keys('ShiftDel < a Space h r e f = " " Space t i t l e = " " > ShiftIns < Divide a >')
 end;
}
Macro {
 area="Editor";   key="AltCtrlH";   flags="";   description="HTML: Вставляет 2 строки в тэг А, 1-я - ссылка, 2-ю - ключевое слово";   action = function()
  Keys('Home ShiftEnd ShiftDel < a Space h r e f = " ShiftIns Down Home ShiftEnd ShiftDel Up End " > ShiftIns < Divide a >')
 end;
}

Macro {
 area="Editor";   key="CtrlI";   flags="";   description="HTML: Вставляет выделение в тег img src=";   action = function()
  Keys('ShiftDel < i m g Space s r c = " ShiftIns " >')
 end;
}
Macro {
 area="Editor";   key="CtrlShiftI";   flags="";   description="HTML: Вставляет выделение в тег img src + alt";   action = function()
  Keys('ShiftDel < i m g Space s r c = " ShiftIns " Space a l t = " " >')
 end;
}
Macro {
 area="Editor";   key="AltCtrlI";   flags="";   description="HTML: Вставляет 2 строки в тег img, 1-ю в src, 2-ю в alt";   action = function()
  Keys('Home ShiftEnd ShiftDel < i m g Space s r c = " ShiftIns Down Home ShiftEnd ShiftDel Up End " Space a l t = " ShiftIns " >')
 end;
}


-- Mix HTML macros
Macro {
 area="Editor";  key="AltA";  flags="";  description="HTML: Окружает текущую строку тегом из буфера обмена";
 code="Keys(\'Home < ShiftIns > End < Divide ShiftIns > Home Down\')";
}

-- Remove Tag
Macro {
 area="Editor";  key="CtrlX";  flags="";  description="HTML: Удаляет тег в начале и конце строки";
 code="Keys(\'Home CtrlShiftRight Del Del End CtrlShiftLeft Del BS BS Home\')";
}
-- Object.Selected.pos
Занимаюсь роликами и SEO, обращайтесь :)
User avatar
John Doe
Бюрократ
Posts: 13855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

Макросы для работы с ХТМЛ

Post by John Doe »

Ответы на ваши вопросы есть в документации.
wakh wrote: Мои работают с буфером, чего хотелось бы избежать.
И для этого тоже есть функция.

P.S.
wakh wrote: Пока я доделываю свои, решил спросить - может есть готовое?
Да есть один плагинчик: http://plugring.farmanager.com/plugin.php?pid=196&l=ru
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Макросы для работы с ХТМЛ

Post by zg »

вот как-то навскидку так:
scripts\htmlmenu.moon:

Code: Select all

ShowMenu=->
  config=require"htmlmenu"
  result=far.Menu{Id:win.Uuid"6197E3BA-3E73-4b0a-B991-9A47A5002D79"},config
  if result then result.call(result.tag)
Macro
  area:"Editor"
  key:"CtrlT"
  filemask:"*.html"
  description:"HTML tags"
  action:ShowMenu
modules\htmltools.moon:

Code: Select all

inserttag=(line,tag,pos)->
  with line
    pos1=pos and .SelEnd+1 or .SelStart
    one,two=.StringText\sub(1,pos1-1),.StringText\sub(pos1)
    editor.SetString -1,.StringNumber,one..tag..two,.StringEOL
default1=(tag1,tag2)->
  info=editor.GetSelection!
  if info
    line2=editor.GetString -1,info.EndLine
    inserttag line2,tag2,true
    line1=editor.GetString -1,info.StartLine
    inserttag line1,tag1
default=(tag)->
  default1 "<"..tag..">","</"..tag..">"
A=(tag)->
  link=far.InputBox win.Uuid"E369D367-251F-4ea5-8035-B32134F4BD12"
  default1 "<"..tag..[[ href="]]..link..[[">]],"</"..tag..">"
{
  _:default
  A:A
}
и собственно настройки — modules\htmlmenu.moon:

Code: Select all

_=require"htmltools"
{
  {
    text:"&A"
    tag:"a"
    call:_.A
  }
  {
    text:"&B"
    tag:"b"
    call:_._
  }
  {
    text:"&I"
    tag:"i"
    call:_._
  }
  {
    text:"&HTML"
    tag:"html"
    call:_._
  }
}
wakh
Posts: 128
Joined: Wed 27 Apr, 2005 09:16
Location: Перогиреево
Has thanked: 6 times
Contact:

Макросы для работы с ХТМЛ

Post by wakh »

zg, Спасибо, изучу на досуге, а это какой язык?
пока кину свою версию Editor_HTML.lua

Code: Select all

Macro {
area="Editor";	key="Ctrl1";	flags="";	description="";	action = function()
Keys('ShiftDel < h 1 > < Divide h 1 > Left Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="Ctrl2";	flags="";	description="";	action = function()
Keys('ShiftDel < h 2 > < Divide h 2 > Left Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="Ctrl3";	flags="";	description="";	action = function()
Keys('ShiftDel < h 3 > < Divide h 3 > Left Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="Ctrl4";	flags="";	description="";	action = function()
Keys('ShiftDel < h 4 > < Divide h 4 > Left Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="CtrlB";	flags="";	description="";	action = function()
Keys('ShiftDel < b > < Divide b > Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="CtrlI";	flags="";	description="";	action = function()
Keys('ShiftDel < i > < Divide i > Left Left Left Left ShiftIns')
  end;
}

Macro {
area="Editor";	key="CtrlL";	flags="";	description="";	action = function()
Keys('ShiftDel < l i > < Divide l i > Left Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="CtrlO";	flags="";	description="";	action = function()
Keys('ShiftDel < o l > < Divide o l > Left Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="CtrlU";	flags="";	description="";	action = function()
Keys('ShiftDel < u l > < Divide u l > Left Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="CtrlS";	flags="";	description="";	action = function()
Keys('ShiftDel < s > < Divide s > Left Left Left Left ShiftIns')
  end;
}

Macro {
area="Editor";	key="CtrlH";	flags="";	description="";	action = function()
Keys('ShiftDel < a Space h r e f = " " > < Divide a > Left Left Left Left ShiftIns')
  end;
}
Macro {
area="Editor";	key="CtrlShiftH";	flags="";	description="";	action = function()
Keys('ShiftDel < a Space h r e f = " " Space t i t l e = " " > < Divide a > Left Left Left Left ShiftIns')
  end;
}
ЗЫ
а в фаре можно на php/js/c макросы писать?
Занимаюсь роликами и SEO, обращайтесь :)
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Макросы для работы с ХТМЛ

Post by zg »

wakh wrote:zg, Спасибо, изучу на досуге, а это какой язык?
moonscript
wakh wrote:а в фаре можно на php/js/c макросы писать?
если для них есть транслятор в lua, то можно.
User avatar
Aidar
Posts: 541
Joined: Mon 09 Mar, 2009 22:43
Location: Kazan
Has thanked: 8 times
Been thanked: 7 times
Contact:

Макросы для работы с ХТМЛ

Post by Aidar »

Есть такой вариант:
eum_j_html.png
eum_j_html.png (17.27 KiB) Viewed 8775 times

Но это не макрос, а скрипт для LuaFAR for Editor. Макрос можно легко "навесить".
wakh
Posts: 128
Joined: Wed 27 Apr, 2005 09:16
Location: Перогиреево
Has thanked: 6 times
Contact:

Макросы для работы с HTML

Post by wakh »

подскажите как на луа "распарсить выделение"
к примеру есть три выделенных строки:
текст1
текст2
текст3
мне надо чтобы макрос выдал строку/строки:
блаблабла текст1 блаблабла текст2 блаблабла текст3
Занимаюсь роликами и SEO, обращайтесь :)
wakh
Posts: 128
Joined: Wed 27 Apr, 2005 09:16
Location: Перогиреево
Has thanked: 6 times
Contact:

Макросы для работы с HTML

Post by wakh »

Обновил свою версию в первом посте. Может кому сгодиться.
Занимаюсь роликами и SEO, обращайтесь :)
User avatar
Wave
Posts: 1887
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

Макросы для работы с HTML

Post by Wave »

wakh, как минимум чтобы не портить буфер обмена тем текстом, который вы выделяете, перед тем как делать ShiftDel с последующим ShiftEnter, надо вызвать
mf.clip(5);

Ну и понятно, что макрос вы делали для себя и плохо зная Lua и макроязык FAR’а, но для справки, ваш макрос не учитыват как минимум ту ситуацию, когда у человека настроено автозакрытие скобок и кавычек. Скажем, печатает человек открывающую <, а умный плагин [esc] тут же пропечатывает закрывающую >.
При использовании вашего макроса

Code: Select all

В список
превращает в

Code: Select all

<ul>
В список</ul>>>
Этого можно избежать, если использовать print('Печатаемая строка') вместо Keys('П е ч а т а е м а я Space с т р о к а')


P.s. Удаление тегов тоже получилось капризным. Теги с атрибутами — в пролёте. Советую, раз уж нет надежды на CtrlShiftRight и вы не можете приспособить регулярное выражение, то подключите плагин Brackets из стандартной поставки.
Keys('F11') Menu.Select('Парные скобки') Keys('Enter Down Enter')
Утрирую, тут тоже многого не учитывается, но такое действие гарантированно выделит тег вида <div class="col-lg-4"> или ту же ссылку со всеми href, rel и title.
Пользуюсь ФАРом больше 20 лет © собирательный.
wakh
Posts: 128
Joined: Wed 27 Apr, 2005 09:16
Location: Перогиреево
Has thanked: 6 times
Contact:

Макросы для работы с HTML

Post by wakh »

Спасибо за подсказки, жаль что ваши советы носят характер РТФМ, а значит - фьючерсы.
Макросы дописываются по мере необходимости, с print() была мысль, но необходимость не возникла, а про буфер обмена я как раз обмолвился в первом посте. Это нужно будет исправить, ибо при многозадачной работе - ситуация может возникнуть плачевная. В идеале вообще нужно обходится без него в моих макросах.
Удаление было написано (за 3 минуты) для конкретной ситуации, даже стандартное Ф7 > Интер, было бы вернее.
В общем есть чем заняться :)
Занимаюсь роликами и SEO, обращайтесь :)
User avatar
Wave
Posts: 1887
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

Макросы для работы с HTML

Post by Wave »

Понятно, что это делается чисто для себя, а потом выкладывается «вдруг кому пригодится».
Небольшой пример:

Code: Select all

Macro {
  area="Editor"; key = "CtrlH"; description = "HTML: Окружает выделение тегом a href"; action = function()
    mf.clip(5);
    Keys('ShiftDel');
    print('<a href=""></a>');
    Keys('Left Left Left Left ShiftIns');
    Editor.Sel(1, 0);
    Keys('CtrlU Left Left');
  end;
}
Окружает выделенный текст тегом A и ставит курсор между кавычками в href. Не портит буфер обмена, не глючит при наличии автоскобок-автокавычек.

Code: Select all

-- HTML Lists
tk2 = {
   ["O"] = "ol",
   ["U"] = "ul"
};
for key, tag in pairs(tk2) do
  Macro {
    area="Editor"; key = "Ctrl" .. key; description = "HTML: Окружает выделение тегом " .. tag; action = function()
      mf.clip(5);
      Keys("ShiftDel");
      print('<' .. tag .. '>' .. "\n" .. '</' .. tag .. '>');
      Keys('Up Left Enter ShiftIns');
      eval('Tab', 2);
    end;
  }
end
eval('Tab', 2); — вызов макроса, висящего на Tab, который сдвигает блок на таб вправо.
Пользуюсь ФАРом больше 20 лет © собирательный.
wakh
Posts: 128
Joined: Wed 27 Apr, 2005 09:16
Location: Перогиреево
Has thanked: 6 times
Contact:

Макросы для работы с HTML

Post by wakh »

Вот спасибо! Где ж вы были 27.11.2014? кучу времени бы мне сэкономили :)
Занимаюсь роликами и SEO, обращайтесь :)
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Макросы для работы с HTML

Post by citRiks »

zg,

Code: Select all

..\scripts\htmlmenu.moon
..\modules\htmltools.moon:
..\modules\htmlmenu.moon
это откуда? есть ли где-то на ГитХабе, поновее?
Выглядит интересно
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Макросы для работы с HTML

Post by zg »

citRiks wrote: Mon 16 Mar, 2020 10:08это откуда? есть ли где-то на ГитХабе, поновее?
это отсюда, это пример, как можно просто такие вещи реализовывать. развития нет, я html не редактирую.
Post Reply

Return to “Обсуждение макросов”