Скрипт напомнил утилиту SpecChar, которой раньше пользовался. Её минусы: нельзя было сделать обрамление текста тегами и у меня почему-то не вставлялись длинные составные теги, например, quote
Cкрипт DD хорош, но не устраивало, что он делает замену в буфере. Если текст не выделен и буфер не пуст, для меня лучше было бы вставлять теги. Ну и еще в SpecChar было несколько столбцов.
Попробовал переделать под себя. Вот так пока выглядит окно:
Скрипт:
#SingleInstance force
^sc052:: ;Ctrl + Num 0
menuHTMLify =
(
«Франц. елочки»%A_Tab%Alt+0171/0187
«(&c&)»`t`t«(&c&)»
„Нем. лапки“%A_Tab%Alt+0132/0147
„(&c&)“`t`t„(&c&)“
“Англ. двойные”%A_Tab%Alt+0147/0148
“(&c&)”`t`t“(&c&)”
‘Англ. одинарные’%A_Tab%Alt+0145/0146
‘(&c&)’`t`t‘(&c&)’
Ударение%A_Tab%́
́
Среднее тире%A_Tab%–
–
Длинное тире%A_Tab%—
—
Параграф%A_Tab%§ Alt+21
§
Градус%A_Tab%°
°
Символ пробела%A_Tab%(нижняя скобка)
␣
&Bold
[b](&c&)[/b]`t`t<b>(&c&)</b>
&Italic
[i](&c&)[/i]`t`t<i>(&c&)</i>
<p>
<p>(&c&)</p>
<br>
<br>
<strong>
<strong>(&c&)</strong>
<pre>
<pre>(&c&)</pre>
<blockquote>
<blockquote>(&c&)</blockquote>
©
©
∞
∞
≈
≈
±
±
≠
≠
≤ / ≥
≤`t`t≥
×
×
÷
÷
√
√
∑
∑
) ; и прочая, и прочая, и прочая...
MenuBreakItem01:=10
MenuBreakItem02:=21
ControlGetFocus, CurControl, A
VarSetCapacity(SelStart, 4), VarSetCapacity(SelEnd, 4)
SendMessage, 0xB0, &SelStart, &SelEnd, %CurControl%, A ;EM_GETSEL
SelStart := NumGet(SelStart), SelEnd := NumGet(SelEnd)
ClipSave:=ClipboardAll ; Save original clipboard
Clipboard = ;
; Send Ctrl+C, to copy selection to clipboard
Send, {CTRL DOWN}{sc02E}{CTRL UP} ;c
Sleep 200 ; Wait to be sure there is something copied
; Create a menu
CreateMenu("mHTML", menuHTMLify, "HTMLify")
; Create menu column
MenuHandle := GetMenuHandle("mHTML")
VarSetCapacity(mii,48,0),NumPut(48,mii)
NumPut(0x100,mii,4) ; fMask = MIIM_FTYPE
NumPut(0x20,mii,8) ; fType = MFT_MENUBARBREAK
DllCall("SetMenuItemInfo","uint",MenuHandle,"uint",MenuBreakItem01,"uint",1,"uint",&mii)
DllCall("SetMenuItemInfo","uint",MenuHandle,"uint",MenuBreakItem02,"uint",1,"uint",&mii)
; And show it
Menu mHTML, Show
Clipboard:=ClipSave
ExitApp
Return
HTMLify:
; Go here when choosing a menu item
RunMenuItem(menuHTMLify, A_ThisMenuItemPos)
If (SelStart>0 and SelStart!=SelEnd)
{
PostMessage, 0xB1, SelStart, SelStart + StrLen(Clipboard), %CurControl%, A ; EM_SETSEL
PostMessage, 0xB7,,, %CurControl%, A ; EM_SCROLLCARET
}
Return
CreateMenu(_menuName, _menuDef, _menuLabel)
{
Loop Parse, _menuDef, `n
{
If (Mod(A_Index, 2) = 1) ; Odd
Menu %_menuName%, Add, %A_LoopField%, %_menuLabel%
}
}
RunMenuItem(_menuDef, _index)
{
Loop Parse, _menuDef, `n
{
If (_index * 2 = A_Index)
{
If GetKeyState("Shift")
{
html := A_LoopField
html := RegExReplace(html, ".*\t\t", "$2")
pos := 0
If Clipboard =
pos := StrLen(html)-Instr(html,"(&c&)")-4
StringReplace html, html, (&c&), %Clipboard%, All
Clipboard := html
Sleep 200 ; Wait to be sure there is something copied
Send, {Ctrl Down}{sc02F}{Ctrl Up} ;v
; Send ^{vk56sc02F} ; Ctrl+V
If (pos>0)
Send, {Left %pos%}
Break
Return
}
; Get HTML
html := A_LoopField
html := RegExReplace(html, "\t.*", "$2")
pos := 0
If Clipboard =
pos := StrLen(html)-Instr(html,"(&c&)")-4
; Substitute special tag with clipboard content
StringReplace html, html, (&c&), %Clipboard%, All
; Update the clipboard
Clipboard := html
Sleep 200 ; Wait to be sure there is something copied
Send, {Ctrl Down}{sc02F}{Ctrl Up} ;v
; Send ^{vk56sc02F} ; Ctrl+V
If (pos>0)
Send, {Left %pos%}
Break
}
}
}
GetMenuHandle(menu_name) ;from MenuIcons v2
{
static h_menuDummy
; v2.2: Check for !h_menuDummy instead of h_menuDummy="" in case init failed last time.
If !h_menuDummy
{
Menu, menuDummy, Add
Menu, menuDummy, DeleteAll
Gui, 99:Menu, menuDummy
; v2.2: Use LastFound method instead of window title. [Thanks animeaime.]
Gui, 99:+LastFound
h_menuDummy := DllCall("GetMenu", "uint", WinExist())
Gui, 99:Menu
Gui, 99:Destroy
; v2.2: Return only after cleaning up. [Thanks animeaime.]
if !h_menuDummy
return 0
}
Menu, menuDummy, Add, :%menu_name%
h_menu := DllCall( "GetSubMenu", "uint", h_menuDummy, "int", 0 )
DllCall( "RemoveMenu", "uint", h_menuDummy, "uint", 0, "uint", 0x400 )
Menu, menuDummy, Delete, :%menu_name%
return h_menu
}
Итог отличается от указанного на скриншоте, т.к. пришлось поудалять примеры для тегов code, url, img и quote и не помогало обрамление текста тегами pre.
Для составного пункта меню вызов осуществляется при зажатом Shift, а не Ctrl, уже не помню почему переделал.
Если текст не выделен, то при вставке кавычек или двойного тега (открывающего и закрывающего) курсор устанавливается после открывающей кавычки (тега).
Если текст выделен и выбран одиночный тег или символ, он заместит выделенное.
После обрамления выделенного текста тегами, он снова выделяется уже с ними для случая, когда текст нужно обрамить несколькими тегами.
Еще хорошо было бы вынести содержимое меню в отдельный ini-файл, чтобы было проще пользоваться другим и как было в SpecChar, в нем добавить спецсимволы, указывающие, откуда начинать новый столбец. Но в этом не силен. Не знаю, как оно вообще заработало. Может быть кто-то возьмется "допилить".