<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: CN Organizer - скрипт, расширяющий функции CintaNotes]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10162</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10162&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: CN Organizer - скрипт, расширяющий функции CintaNotes».]]></description>
		<lastBuildDate>Wed, 15 Apr 2015 10:09:22 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: CN Organizer - скрипт, расширяющий функции CintaNotes]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=93389#p93389</link>
			<description><![CDATA[<p>Доработанная версия. Помимо исправленных багов и улучшенной совместимости с программами, по сравнению со старой версией изменения в следующем:</p><p>1. Добавлена возможность оптического распознавания текста с помощью Tesseract OCR, дающая возможность делать заметки из лишенных текстового слоя pdf и djvu книг, защищенных от копирования документов и страниц, текстовых картинок и пр.. Качество распознавания довольно приличное, поддерживаются двуязычные тексты. Для улучшения рекомендуется использовать естественный масштаб документа и выделение текста с минимальными полями. Качество распознавания резко падает при обработке менее пяти-шести строк текста, поэтому часто бывает лучше не экономить на выделении, а после удалить лишнее.</p><p>Помимо CintaNotes, скрипт может быть использован как простое и удобное приложение для распознавания скриншотов, поиска и перевода полученного текста, имеющее ряд дополнительных возможностей.</p><p>Как это работает. Зажимая Shift, щелкаем средней кнопкой мыши. Под курсором появляется прямоугольное полупрозрачное окошко. Перетаскивая его мышью и масштабируя за углы и края, накрываем интересующий участок текста. Щелчок правой кнопкой мыши по окну выделения - подтверждение, Escape или щелчок правой кнопкой вне окна - отмена операции.<br />После секундного размышления появляется окно с распознанным текстом:</p><p><span class="postimg"><img src="http://savepic.su/5520350.png" alt="http://savepic.su/5520350.png" /></span></p><p>Здесь:<br />Search - поиск выделенного текста в Google.</p><p>Translate - отправка всего текста в Google Translate.</p><p>RUS+ENG - выпадающее меню наборов языков распознавания. Можно создавать собственные наборы языков из числа имеющихся языковых пакетов (смотри &quot;Настройки OCR&quot; скрипта). Выбор другого языка перезапускает процесс распознавания и сохраняется до следующего запуска.</p><p>Add to next - запоминает распознанный текст и добавляет его автоматически при следующем распознавании. Это позволяет собирать в одну заметку текст из нескольких кусков, что удобно, например, при конспектировании или обработке текста, расположенного на границе двух страниц, где распознавание в один прием невозможно.</p><p>Delete old - удаляет старые, созданные клавишей Add to next фрагменты и оставляет только текущий.</p><p>OCR history - выпадающее меню, в котором можно скопировать в буфер любой из распознанных с момента запуска скрипта фрагментов.</p><p>Sep - чекбокс, управляющий удалением разделителей фрагментов, имеющих вид &quot;### Дата Время Имя документа или страницы ###&quot;. По умолчанию (это можно изменить в настройках) при копировании или создании заметки разделители удаляются и фрагменты идут встык. При конспектировании их можно оставить для разделения цитат и указания источников.</p><p>Undo - возвращает окно к виду, бывшему при последнем закрытии.</p><p>Copy - копирование текста окна.</p><p>CintaNotes - отправляет распознанный текст в новую заметку CintaNotes с оригинальным заголовком, при этом окно c распознанным текстом закрывается автоматически. (Тот же результат дает нажатие Ctrl+F12). Нажатие RShift+F12 открывает его вновь с текстом, бывшем в нем на момент закрытия.</p><p>Если при открытом окне распознавания использовать скриптовое сочетание клавиш (RCtrl+RShift+клавиша), будет создана заметка в оответствии со связанными с клавишей правилами. При этом сгенерированные переменные ($title, $cmd, $cmt, $proc) будут относиться к исходному окну распознаваемого документа.</p><p><strong>Собранный набор скрипт+Tesseract OCR с 5-ю великими европейскими языками можно скачать здесь:</strong> <a href="https://yadi.sk/d/QLsPY1YFfr2YR">https://yadi.sk/d/QLsPY1YFfr2YR</a></p><p>Чтобы сделать все самостоятельно, идем сюда: <a href="http://code.google.com/p/tesseract-ocr/downloads/list">http://code.google.com/p/tesseract-ocr/downloads/list</a> ,<br />качаем tesseract-ocr-3.02-win32-portable.zip и потребные языковые пакеты. Распаковываем дистрибутив и помещаем папку Tesseract-OCR в каталог скрипта. В нее же распаковываем архивы языковых пакетов. Если удалить множество ненужных файлов и папок, в итоге должно получиться дерево примерно такого вида:&nbsp; </p><p>|-- Tesseract-OCR &lt;DIR&gt;<br />|&nbsp; &nbsp;|-- tessdata &lt;DIR&gt;<br />|&nbsp; &nbsp;|&nbsp; &nbsp;|-- deu.traineddata<br />|&nbsp; &nbsp;|&nbsp; &nbsp;|-- eng.traineddata<br />|&nbsp; &nbsp;|&nbsp; &nbsp;|-- fra.traineddata<br />|&nbsp; &nbsp;|&nbsp; &nbsp;|-- rus.traineddata<br />|&nbsp; &nbsp;|&nbsp; &nbsp;|-- spa.traineddata<br />|&nbsp; &nbsp;|-- tesseract.exe<br />|-- CN Organizer.ahk </p><p>2. Добавлен функционал для изучения языков (собственные словари изучаемых слов и словосочетаний), а так же алфавитных каталогов<br />терминов, энциклопедических статей и пр..<br />Для этого используется переменная $dict. При ее использовании начальная часть статьи идет в заголовок заметки, а сама переменная заменяется первой буквой в верхнем регистре. Так если добавить в конфигурационный файл строку &quot;1,English/%dict,F5&quot;, при нажатии RCtrl+RShift+F5 из словарной статьи со словом godspeed в 1-й секции будет создана заметка с заголовком godspeed и тэгом English/G.<br />Имеет смысл выделить для таких каталогов отдельную секцию с сортировкой заметок по алфавиту.</p><p>ВАЖНО: для правильного отображения знаков транскрипции следует открыть файл настроек cintanotes.settings (каталог скрипта для портативной версии или Application Data\CintaNotes для инсталлятора)<br />и в параметре app.mainframe.notetextfont заменть Verdana на Tahoma или любой другой шрифт, установленный в системе и имеющий соответствыющий набор символов.</p><div class="codebox"><pre><code>
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance, force
Menu, Tray, Icon, shell32.dll, 21
CoordMode Mouse
CoordMode ToolTip
goto Start

; Настройки горячих клавиш программы должны быть: Ctrl+F12 - создание, CTRL+ALT+F12 - показать главное окно.
; В Настройках - Захват текста - После захвата должно стоять &quot;Открыть на редактирование&quot; 

; Скрипт связывает клавишу с номером (существующей!) вкладки и набором тэгов. Комбинация RCtrl+RShift+клавиша создает заметку, RCtrl+RAlt+клавиша - открывает соответствующую вкладку и тэг.

; При запуске в каталоге скрипта создается одноименный cfg-файл, задающий эти соответствия.
;             Синтаксис строк предельно прост:
;     номер секции,тэг или набор тэгов,имя клавиши или ее код (виртуальный или скан),пояснение (необязательно).

;     Например:
;    1,,1 - первая секция без тэга по 1 (строки такого вида добавляются автоматически)
;    1,Comp,vk43,c - тэг Comp в первой секции по клавише c
;     1,Soft Comp,vk53,s - два тэга там же по s
;     1,Books/читать,sc30,b - дочерний тэг &quot;читать&quot; в Books по b
;   1,Книги Books/читать,F6 - комбинация двух предыдущих возможностей по F6 (использование &quot;,&quot; и &quot;;&quot; как разделителя не допускается - только пробел)

; Для применения изменений следует перезапустить скрипт!

;~ Кроме постоянных значений, для записи в тэг возможно использование следующих переменных:

;~ $time - при создании заметки выводится окно ввода даты и времени с календарем, которые подставляются в тэг (8,Дела/$time,vkC0,~)
;~ $site - подставляет в тэг корневой адрес сайта, открытого в браузере
;~ $cmd - имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы.  
;~ $title - название или имя файла без расширения, взятое из заголовка окна; ищет там и полный путь.
;~ $cmt - переменная, совмещающая возможности двух предыдущих: сначала ищется путь файла в командной строке, а если он отсутствует, используется заголовок окна.
;~ $file - файл под курсором в проводнике или файловом менеджере 
;~ $proc - имя процесса активного окна без расширения
;~ $dict - создание алфавитных каталогов. Текст из начала заметки идет в заголовок, переменная заменяется его начальной буквой в верхнем регистре(например, при записи 1,English/%dict,F5, слово godspeed по F5 получит тэг English/G) 
;~ $z - наличие в любом месте автоматически сохраняет заметку и закрывает окно с секундной задержкой

; В файле конфигурации допускаются пустые строки, лишние пробелы - только в пояснениях. Временно ненужное можно закоментировать &quot;;&quot;.

; --------- Горячие клавиши ---------- 
;   В открытом окне заметки:
; RCtrl+клавиша - замена секции и тэга  данными, связанными с клавишей
; RShift+клавиша - дополнение текущего тэга связанным с клавишей (производится проверка, связан ли он с текущей секцией)
; По L/RCtrl+Space и L/RShift+Space - добавляются настраиваемые тэги, суффиксы или дочерние тэги (см. ниже)
; Чтобы сделать заметку из распознанного текста, зажимаем Shift и щелкаем средней кнопкой мыши. Под курсором появляется прямоугольное полупрозрачное окошко.Перетаскивая его мышью и масштабируя за углы и края, накрываем интересующий участок текста. Щелчок правой кнопкой мыши по окну выделения - подтверждение, Escape или щелчок правой кнопкой вне окна - отмена операции. Далее делается заметка клавишей CintaNotes или скриптовым сочетание клавишю
;~ RShift+F12 - открытие интерфейса программы с текстом, бывшим в момент закрытия.

&gt;^&gt;+F12::Run % &quot;Notepad.exe &quot; cfg ; RCtrl+RShift+F12 - окрытие конфигурационного файла

&gt;^&gt;+Space::goto Last_add ; RCtrl+RShift+Space - создание заметки в той же секции и с теми же тэгами, что и в последний раз

$&gt;^&gt;!Space::goto Last_open ; RCtrl+RAlt+Space - открытие последних созданных заметок

; -------- Мышь (в главном окне программы) --------
#IfWinActive ahk_class CintaNotes.MainFrame
MButton::Send {LButton}{F7} ; Cредняя кнопка - открытие ссылки заметки под курсором
#IfWinActive
Start:

;------------ Настройки скрипта -------------
ctrl_tag:=&quot;_ToDo&quot; ; Суффикс, прописывающийся при секундном зажатии правого Ctrl в тэг при создании заметки. Если вписать &quot; ToDo&quot;, будет добавляться дополнительный тэг, если &quot;/ToDo&quot; - дочерний

lctrl_space:=&quot;_rem&quot; ; суффикс, дополнительный или дочерний тэг дописывающийся к текущему тэгу по LCtrl+Space в окне редактирования

rctrl_space:=&quot;_ToDo&quot; ; то же для RCtrl+Space

lshift_space:=&quot; !Смотреть&quot; ; то же для LShift+Space

rshift_space:=&quot;_Old&quot; ; то же для RShift+Space

t_tree:=&quot;yyyy_MM/dd_dddd&quot; ; комбинация, подставляющаяся в тэг вместо даты при использовании $time. Определяет вид дерева дат в боковой панели

dir_path:=0 ; при использовании $cmd, $title, $cmt и $file создавать ссылку на каталог вместо ссылки на файл

max_empty_str:=2 ; максимальное число последовательных пустых строк в скопированном в заметку тексте

end_note:=&quot;Больше информации на http|Читайте далее: http|Читать далее: http|Подробности: http|Источник: http&quot; ; начала обрезаемых хвостов, добавляемых при копировании текста скриптами на веб-страницах, разделенные &quot;|&quot;

clip:=2 ; сохранять в буфере обмена после создания заметки: 1 - текст заметки, 2 - первую непустую строку в виде, пригодном для переименования файлов (заметки о файлах, ставящихся на закачку); 0 - прежнее содержимое

link2rem:=1 ; копировать адреса и пути из раздела ссылки в примечания

;------------ Настройки OCR -------------
; Наборам языков сопоставляются переменные lng_%n%, отображаемые в выпадающем меню. Коды языков соответствуют именам файлов языковых пакетов в папке tessdata. Не более 2-х языков одновременно через &quot;+&quot;.
lng_1:=&quot;rus+eng&quot; ; дефолтный язык распознавания
lng_2:=&quot;rus&quot;
lng_3:=&quot;eng&quot;
lng_4:=&quot;deu&quot;
lng_5:=&quot;fra&quot;
lng_6:=&quot;spa&quot;

opaque:=130 ; непрозрачность окна выделения текста (1-255)

color:=&quot;FFDC00&quot; ; его цвет

ft:=16 ; размер шрифта окна распознанного текста

sep:=0 ; сохранение разделителей фрагментов по умолчанию

search:=&quot;https://www.google.ru/search?client=opera&amp;q=%s&amp;sourceid=opera&amp;ie=utf-8&amp;oe=utf-8&amp;channel=suggest&amp;gws_rd=ssl&quot; ; строка поиска текста

translate:=&quot;www.translate.google.com/#auto|ru|%s&quot; ; строка перевода текста

;-----------------------------------------------
SysGet, M, MonitorWorkArea
text:=&quot;&quot;, lng:=lng_1
history:=&quot;OCR history&quot; A_Tab . A_Tab
SplitPath A_ScriptName, , , , cfg
cfg:=cfg &quot;.cfg&quot;
IfNotExist % cfg
    FileAppend , % &quot;1,,1`r`n2,,2`r`n3,,3`r`n4,,4`r`n5,,5`r`n6,,6`r`n7,,7`r`n8,,8`r`n9,,9`r`n0,,0&quot;, % cfg, utf-8
Loop Read, % cfg
{
    If A_LoopReadLine contains `;
        continue
    If A_LoopReadLine=`r`n
        continue
    Loop Parse, A_LoopReadLine, CSV
    {
        If (A_Index=1)            
            tab:=A_LoopField
        If (A_Index=2)
            tag:=A_LoopField    
        If (A_Index=3)
            key:=A_LoopField
    }
    tab_%key%:=tab
    tag_%key%:=tag
    Hotkey % &quot;&gt;^&gt;+&quot; key, Note
    Hotkey IfWinActive, ahk_class Cinta.ModelessDialog
    Hotkey % &quot;&gt;^&quot; key, Note
    Hotkey % &quot;&gt;+&quot; key, Note
    Hotkey IfWinActive
    Hotkey % &quot;&gt;^&gt;!&quot; key, Open
}
n:=1, lng_string:=lng_1
Loop
{
    n+=1
    If lng_%n%
        lng_string.=A_Tab . lng_%n%     
    If (n&gt;20)
        break
}
return

#IfWinActive ahk_class Cinta.ModelessDialog
&lt;^Space::Addtag(lctrl_space)
&gt;^Space::Addtag(rctrl_space)
&lt;+Space::Addtag(lshift_space)
&gt;+Space::Addtag(rshift_space)
#IfWinActive

Addtag(tt)
{
    KeyWait Ctrl, T1
    KeyWait Shift, T1
    ControlGetText tag, Cinta.Edit2
    s:=SubStr(tag,0)
    If (s=&quot; &quot;)
        StringTrimRight tag, tag, 1
    ControlSetText Cinta.Edit2, % tag . tt &quot; &quot;
    Send {End}
    return
}
;------------------------------------------------
&gt;+F12::
text:=undo_text
goto Int

+MButton::
start_key:=2
WinGetActiveTitle source_title
WinGet, source_id, ID, A
ToolTip Правый клик в области выделения - подтверждение`nEscape или правый клик вне области выделения - отмена, % MRight*0.4, 0
MouseGetPos mx, my
w:=MRight//5, h:=w//4, x:=mx-w//2, y:=my-h//2
Gui Destroy        
Gui +Lastfound  +Resize AlwaysOnTop -Caption +Border +ToolWindow -DPIScale +MinSize60x20        
Gui Color, % color
Gui, Add, Text, w%w% h%h% guiMove
WinSet Transparent, % opaque    
Gui, Show, x%x% y%y% w%w% h%h%, select_ocr_area
While WinExist(&quot;select_ocr_area&quot;)
{
    WinGetPos, , , ww, wh
    GuiControl, Move, Static1, w%ww% h%wh%
    Sleep 50
}
return

#IfWinActive select_ocr_area ahk_class AutoHotkeyGUI
RButton::
KeyWait RButton, T1
Tooltip
WinGetPos sx, sy, sw, sh, select_ocr_area
MouseGetPos mx, my
If (mx&gt;sx &amp;&amp; mx&lt;sx+sw &amp;&amp; my&gt;sy &amp;&amp; my&lt;sy+sh)
{
    Gui Destroy
    ToolTip
    goto OCR
}
GuiEscape:
Gui Destroy
Tooltip
return
#IfWinActive ahk_class AutoHotkeyGUI
^F12::goto 2ButtonCintaNotes
#IfWinActive

uiMove:
PostMessage, 0xA1, 2,,, A 
return

OCR:
CaptureScreen(sx &quot;|&quot; sy &quot;|&quot; sw &quot;|&quot; sh,&quot;ocr.png&quot;, 0, 0)
Recogn:
ToolTip Распознаю..., MRight/2, MBottom/2
RunWait % &quot;Tesseract-OCR\tesseract.exe ocr.png ocr -l &quot; lng, ,Min
ToolTip
Sleep 200
FileEncoding UTF-8-RAW
FileRead text, ocr.txt

text:=RegExReplace(text,&quot;m)^(\s+|:|;|!|\?|\|)&quot;)
text:=RegExReplace(text,&quot;m) +$&quot;)
text:=RegExReplace(text,&quot;\s+$&quot;)
text:=RegExReplace(text,&quot;\R{2,}&quot;,&quot;`r`n&quot;)
text:=RegExReplace(text,&quot;(\.|,|:|;)(,|:|;)&quot;,&quot;$1&quot;)
text:=RegExReplace(text,&quot; {1,3}(\.|,|:|;|!|\?|\)|]|})&quot;,&quot;$1&quot;)
text:=RegExReplace(text,&quot;(\.|,|:|;|!|-|\?) {2,3}&quot;,&quot;$1 &quot;)
text:=RegExReplace(text,&quot;(\[|\{|\() {1,3}&quot;,&quot;$1&quot;)

history:=text . A_Tab . history
FormatTime dt, , dd.MM.yyyy  HH:mm  
text:=&quot;`r`n###  &quot; dt &quot;   &quot; CleanTitle(source_title,80) &quot;  ###`r`n&quot; text &quot;`r`n&quot;
text:=RegExReplace(old_text . text,&quot;^\s+&quot;)
Int:
ed_w:=940+(MRight-1000)*0.25, ed_h:=MBottom*0.6, b_w:=(ed_w-64)//6, h_w:=b_w*3, u_w:=b_w//2, c_w:=u_w-8
Gui 2:Destroy
Gui 2:-DPIScale +DelimiterTab
Gui 2:Color, D7D7D7
Gui 2:Margin , 24
Gui 2:font, s%ft%, Arial
Gui 2:Add, Edit, vtext w%ed_w% h%ed_h%,% text
Gui 2:font
Gui 2:font, s12 
Gui 2:Add, Button, x60 y+8 w%b_w% h36 section, Canc&amp;el    
Gui 2:Add, Button, x+0 wp hp, &amp;Search
Gui 2:Add, Button, x+0 wp hp, &amp;Translate
Gui 2:Add, DDL, x+0 yp+1 wp Sort Choose1 Uppercase vlng glng, % lng_string    
Gui 2:Add, Button, x+0 yp-1 wp h36, &amp;Add to next
Gui 2:Add, Button, x+0 wp hp, Cinta&amp;Notes
Gui 2:Add, DDL, x60 y+6 xs w%h_w% vhist  gHistory, % history
Gui 2:Add, Checkbox, x+8 yp-1 w%c_w% h36 vsep Checked%sep%, &amp;Sep
Gui 2:Add, Button,x+0 w%u_w% hp, &amp;Undo
Gui 2:Add, Button, x+0 w%b_w% hp, Delete old
Gui 2:Add, Button, x+0 wp hp, &amp;Copy    
Gui 2:Show, Center, % source_title    
GuiControl 2:ChooseString, ComboBox1, % lng
Send ^{End}
return

2ButtonCancel:
2GuiEscape:
2GuiClose:
Gui 2:Submit
undo_text:=text
FileDelete ocr.*
return

2ButtonSearch:
Gui 2:Submit, NoHide
ControlGet text, Selected, ,Edit1
If !text
{
    MsgBox, 262160, Ошибка, Ничего не выделено!, 1
    return
}
url:=search
StringReplace url, url, http://
StringReplace url, url, https://  
url:=&quot;http://&quot; url
StringReplace url, url, `%s, % text
Run % url
text:=&quot;&quot;
return

2ButtonTranslate:
Gui 2:Submit, NoHide
text:=RegExReplace(text,&quot;\R?### .+? ###\R&quot;,&quot;&quot;)
url:=translate
StringReplace url, url, http://
StringReplace url, url, https://  
url:=&quot;http://&quot; url
StringReplace url, url, `%s, % text
Run % url
return

lng:
Gui 2:Submit
If !text
    return
text:=RegExReplace(text,&quot;^.*###\R&quot;,&quot;&quot;)
history:=text . A_Tab . history
goto Recogn

2ButtonUndo:
Gui 2:Submit, NoHide
If !undo_text
    return
text:=RegExReplace(undo_text,&quot;\R&quot;,&quot;`r`n&quot;)
ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
return

Sep:
sep:=!sep
return
    
2ButtonAddtonext:
Gui 2:Submit
undo_text:=old_text:=text
FileDelete ocr.*
return

2ButtonCintaNotes:
Gui 2:Submit, NoHide
undo_text:=text, old_text:=&quot;&quot;
KeyWait LButton, T1
text:=RegExReplace(text,&quot;^\R+&quot;)
If !sep
    text:=RegExReplace(text,&quot;\R?### .+? ###\R&quot;,&quot;&quot;)
text:=RegExReplace(text,&quot;\R&quot;,&quot;`r`n&quot;)
ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
ControlFocus Edit1
ControlSend Edit1, ^{vk41}
FileDelete ocr.*
KeyWait Ctrl, T1
Send ^{F12}
WinWaitActive ahk_class Cinta.ModelessDialog, , 10
Sleep 1000
Gui 2:Submit
return

2ButtonDeleteold:
Gui 2:Submit, NoHide
text:=RegExReplace(text,&quot;^.*(?=\R?### .+? ###)&quot;,&quot;&quot;)
text:=RegExReplace(text,&quot;\R&quot;,&quot;`r`n&quot;)
ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
old_text:=&quot;&quot;    
return

History:
Gui 2:Submit, NoHide
Clipboard:=hist
GuiControl Choose, ComboBox2, OCR history
ToolTip Текст в буфере!
Sleep 700
ToolTip
return

2ButtonCopy:
Gui 2:Submit, NoHide
text:=RegExReplace(text,&quot;^\R+&quot;)
If !sep
    text:=RegExReplace(text,&quot;\R?### .+? ###\R&quot;,&quot;&quot;)
Clipboard:=text
ToolTip Тект в буфере!
Sleep 700
ToolTip
return

;---------------------------------
Note:
KeyWait RShift, T1
KeyWait RCtrl, T0.7
ctrl_delay:=ErrorLevel

clip_old:=Clipboard, old_tag:=&quot;&quot;, site_add:=&quot;&quot;, site_text:=&quot;&quot;
IfWinActive select_ocr_area ahk_class AutoHotkeyGUI
    Exit
IfWinActive %source_title% ahk_class AutoHotkeyGUI
{
    Gui 2:Submit, NoHide
    old_text:=&quot;&quot;, undo_text:=text
    text:=RegExReplace(text,&quot;^\R+&quot;)
    If !sep
        text:=RegExReplace(text,&quot;\R?### .+? ###\R&quot;,&quot;&quot;)    
    ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
    ControlFocus Edit1
    ControlSend Edit1, ^{vk41}
    FileDelete ocr.*
}
else
{
    WinGetActiveTitle source_title
    WinGet, source_id, ID, A
}
gosub GetTag
If tag contains $time
{
    Gui 3:Destroy
    Gui 3:+AlwaysOnTop 
    Gui 3:Margin , 5, 5
    Gui 3:font, s12
    Gui 3:Add, Text, , используя курсорные клавиши и календарь (Alt+Down)
    Gui 3:Add, DateTime ,wp+0 vDateTime, yyyy MMMM dd, dddd   HH:mm
    Gui 3:Add, Button, y5 r2 w60 Default, OK
    Gui 3:Show, Center, Введите дату и время
    return
}
Last_add:
If A_ThisHotkey contains &gt;^&gt;+
{
    KeyWait RCtrl, T1.5
    SendEvent ^{F12}
    WinWaitNotActive % &quot;ahk_id &quot; source_id, , 5
    WinWaitActive ahk_class Cinta.ModelessDialog, , 10
}
If A_ThisHotkey contains &gt;^
{
    Control Choose, % tab, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
    end:=&quot;&quot;
    If ctrl_delay
        end:=ctrl_tag        
    ControlSetText Cinta.Edit2, % tag . end &quot; &quot;    
    If A_ThisHotkey not contains +
        return
}
else
{
    SendMessage, 0x147, 0, 0, Cinta.Combobox1
    stab:=ErrorLevel+1
    If (stab&lt;&gt;tab)
    {
        MsgBox, 262160, Ошибка, Тэг относится к другой секции!, 1.5
        return
    }
    ControlGetText old_tag, Cinta.Edit2
    s:=SubStr(old_tag,0)
    If (s=&quot; &quot;)
        StringTrimRight old_tag, old_tag, 1
    ControlSetText Cinta.Edit2, % old_tag &quot; &quot; tag &quot; &quot;
    Send {End}
    return
}
If start_tag contains $file
{
    ControlSetText Cinta.Edit1, % &quot;File: &quot; f_path
    ControlSetText Cinta.RichEdit1
}
If start_tag contains $site
{
    ControlSetText Cinta.Edit3, % site_add
    ControlSetText Cinta.RichEdit1, % site_text
}
ControlGetText add, Cinta.Edit3, ahk_class Cinta.ModelessDialog
If add &amp;&amp; link2rem
    ControlSetText Cinta.RichEdit2, % add
If ! add &amp;&amp; f_path
{
    If link2rem
        ControlSetText Cinta.RichEdit2, % f_path
    If dir_path
        SplitPath f_path, , f_path
    ControlSetText Cinta.Edit3, % f_path
}
ControlGetText n_txt, Cinta.RichEdit1
n_txt:=RegExReplace(n_txt,&quot;^\R+&quot;,&quot;&quot;)
If end_note
    n_txt:=RegExReplace(n_txt,&quot;s)(&quot; end_note &quot;).+$&quot;,&quot;&quot;)
n_txt:=MaxEmptyString(n_txt,max_empty_str)
ControlSetText Cinta.RichEdit1, % n_txt
If start_tag contains $dict
{
    RegExMatch(n_txt,&quot;^.+?(?=(\R| - |\s{3,}|\||;|\{|\(|\[))&quot;,term)
    term:=RegExReplace(term,&quot;^\s+(?=\w)&quot;,&quot;&quot;)
    ControlSetText Cinta.Edit1,% term
    StringLeft term, term, 1
    StringUpper term, term
    StringReplace tag, tag, $dict, % term
    ControlSetText Cinta.Edit2, % tag
}    
If (clip&gt;0 &amp;&amp; n_txt&lt;&gt;&quot;&quot;)
{
    If (clip=2)
    {
        Loop parse, n_txt, `n, `r 
        {
            If (A_LoopField=&quot;&quot;)
                continue
            n_txt:=A_LoopField            
            break            
        }
        n_txt:=ValidName(n_txt)
    }
    Clipboard:=n_txt
}
else
    Clipboard:=clip_old
Last_tag:
Gui 2:Submit
Loop
{
    
    SendMessage, 0x147, 0, 0, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
    tab:=ErrorLevel+1
    ControlGetText tag, Cinta.Edit2
    sl:=SubStr(tag,0)
    If (sl=&quot; &quot;)
        StringTrimRight tag, tag, 1
    Sleep 100
    If (zt &amp;&amp; n_txt &amp;&amp; A_Index=10)
        Send ^{Enter}
    IfWinNotActive ahk_class Cinta.ModelessDialog
        break
}
return

;--------------------------
3ButtonOK:
Gui 3: Submit
FormatTime DateTime, % DateTime, % t_tree . &quot;/HH:mm&quot;
StringReplace tag, tag, $time, % DateTime
WinActivate % source_title
goto Last_add

3GuiClose:
3GuiEscape:
Gui 3: Cancel
return

Open:
gosub GetTag
FormatTime DateTime, , % t_tree 
StringReplace tag, tag, $time, % DateTime
StringReplace tag, tag, /$dict
StringReplace tag, tag, $dict
Last_open:
KeyWait Alt, T1
KeyWait RCtrl, T1
KeyWait Space, T1
IfWinNotActive ahk_class CintaNotes.MainFrame
{
    SendEvent ^!{F12}
    WinWait ahk_class CintaNotes.MainFrame, , 3
    If ErrorLevel
        return
}
Send ^{%tab%}
Sleep 600
If tag
{
    ControlSetText Cinta.Edit1, % tag
    ControlSend Cinta.Edit1, {Enter}
    Sleep 200
    Send {Home}
}
KeyWait Alt, T1
If Errorlevel
    Send {Alt Up}
return

GetTag:
RegExMatch(A_ThisHotkey,&quot;[^\^\+!&gt;]+$&quot;,key)
tab:=tab_%key%
tag:=tag_%key%
f_path:=&quot;&quot;, start_tag:=tag, zt:=&quot;&quot;

If tag contains $cmd,$cmt
{
    f_path:=GetPath(&quot;ahk_id &quot; source_id)
    If !f_path
    {
        If tag contains $cmt
            goto Title
        MsgBox, 262160, Ошибка, Путь файла недоступен!, 1.5
        Exit
    }
    SplitPath f_path, , , , $cmd
    $cmd:=ValidName($cmd,&quot;_&quot;)    
    StringReplace tag, tag, $cmd, % $cmd
    StringReplace tag, tag, $cmt, % $cmd
}

Title:
If tag contains $title,$cmt
{
    $title:=ValidName(CleanTitle(source_title),&quot;_&quot;)
    StringReplace tag, tag, $title, % $title
    StringReplace tag, tag, $cmt, % $title
}

WinGet $proc, ProcessName, % &quot;ahk_id &quot; source_id
SplitPath $proc, , , , $proc
StringUpper $proc, $proc, T
StringReplace tag, tag, $proc, % ValidName($proc,&quot;_&quot;)

If tag contains $file
{
    Clipboard:=&quot;&quot;
    Send ^{vk43}
    ClipWait 2
    f_path:=Clipboard
    path_exist:=RegExMatch(f_path,&quot;i)[a-z]:\\.+?\.[a-z0-9]{2,4}&quot;)
    If !path_exist
    {
        MsgBox, 262160, Ошибка, Путь недоступен!, 1.5
        Exit
    }
    SplitPath f_path, $file
    StringReplace tag, tag, $file, % ValidName($file,&quot;_&quot;)
}

If tag contains $site
{
    If A_Thishotkey contains &gt;^
    {
        Clipboard:=&quot;&quot;
        Send ^{Ins}
        ClipWait 2
        site_text:=Clipboard
        Sleep 300
    }        
    Clipboard:=&quot;&quot;
    Send ^{vk4C}
    Sleep 500
    Send ^{Ins}
    ClipWait 2
    site_add:=Clipboard
    RegExMatch(site_add,&quot;(?&lt;=//).+?(?=/)&quot;,$site)
    If !$site
    {
        MsgBox, 262160, Ошибка, Адрес недоступен!, 1.5
        Exit
    }
    StringReplace tag, tag, $site, % $site
}

If tag contains $z
{
    StringReplace tag, tag, $z
    zt:=1
}
return

;-------------------------
FirstUppercase(t)
{
    StringLeft n, t, 1
    StringTrimLeft k, t, 1
    StringUpper n, n
    return n . k
}

CleanTitle(t,l=&quot;&quot;)
{
    global
    RegExMatch(t,&quot;i)[a-z]:\\.+?\.[a-z0-9]{2,4}&quot;,f_path)
    title:=f_path
    If !title
        RegExMatch(t,&quot;i)(?&lt;=\[).+\.[a-z0-9]{2,4}(?=])&quot;,title)
    If !title
        RegExMatch(t,&quot;i)^.+\.[a-z0-9]{2,4}(?= - )&quot;,title)
    If !title
        RegExMatch(t,&quot;i)(?&lt;= - ).+\.[a-z0-9]{2,4}$&quot;,title)
    SplitPath title, , , ,title
    If !title
        RegExMatch(t,&quot;^.+(?= - )&quot;,title)
    If !title
        title:=t
    If l
    {
        ln:=StrLen(title)
        If (ln&gt;l-3)
        {
            StringLeft title, title, % l
            StringGetPos pos, title,% &quot; &quot;, R
            If !Errorlevel
                StringLeft title, title, % pos
            title:=title &quot;...&quot;
        }
    }
    return title
}

GetPath(title)
{
    WinGet pr, ProcessName, % title
    Process, Exist, % pr
    pid := ErrorLevel
    for process in ComObjGet(&quot;winmgmts:&quot;).ExecQuery(&quot;Select * from Win32_Process&quot;)
    If (process.ProcessId = pid)
    cmdline := process.CommandLine
    If cmdline contains Explorer.exe
        cmdline:=&quot;&quot;
    fp:=RegExMatch(cmdline,&quot;i)[a-z]:\\.*\.[a-z0-9]{2,5}&quot;,f_path,6)
    return f_path
}

MaxEmptyString(text,max)
{    
    n:=&quot;&quot;
    Loop % max+1
        n.=&quot;`r`n&quot;
    text:=RegExReplace(text,&quot;(?&lt;=.)\R{&quot; max+2 &quot;,}(?=.)&quot;,n)
    return text
}

ValidName(n,r=&quot;&quot;)
{
    n:=RegExReplace(n,&quot;(:|;|,|\*|\?|\\|/|&lt;|&gt;|&quot;&quot;)&quot;,&quot; &quot;)
    n:=RegExReplace(n,&quot;\s+&quot;,&quot; &quot;)
    StringReplace n, n, |, -, All
    If r
        StringReplace n, n, % &quot; &quot;, % r, All
    return Trim(n)
}

;--------- GDI+ ----------
CaptureScreen(aRect, sFile, nQuality, Cursor)
{
    pToken := Startup()
    pBitmap := BitmapFromScreen(aRect, Cursor)
    If    sFile = 0
        SetBitmapToClipboard(pBitmap)
    Else
        SaveBitmapToFile(pBitmap, sFile, nQuality)
    DllCall(&quot;gdiplus\GdipDisposeImage&quot;, UInt, pBitmap)
    Shutdown(pToken)
}

BitmapFromScreen(Screen=0, Raster=&quot;&quot;)
{
    if (Screen = 0)
    {
        Sysget, x, 76
        Sysget, y, 77    
        Sysget, w, 78
        Sysget, h, 79
    }
    else if (SubStr(Screen, 1, 5) = &quot;hwnd:&quot;)
    {
        Screen := SubStr(Screen, 6)
        if !WinExist( &quot;ahk_id &quot; Screen)
            return -2
        WinGetPos,,, w, h, ahk_id %Screen%
        x := y := 0
        hhdc := GetDCEx(Screen, 3)
    }
    else if (Screen&amp;1 != &quot;&quot;)
    {
        Sysget, M, Monitor, %Screen%
        x := MLeft, y := MTop, w := MRight-MLeft, h := MBottom-MTop
    }
    else
    {
        StringSplit, S, Screen, |
        x := S1, y := S2, w := S3, h := S4
    }

    if (x = &quot;&quot;) || (y = &quot;&quot;) || (w = &quot;&quot;) || (h = &quot;&quot;)
        return -1

    chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc), obm := SelectObject(chdc, hbm), hhdc := hhdc ? hhdc : GetDC()
    BitBlt(chdc, 0, 0, w, h, hhdc, x, y, Raster)
    ReleaseDC(hhdc)
    
    pBitmap := CreateBitmapFromHBITMAP(hbm)
    SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)
    return pBitmap
}

CreateBitmapFromHBITMAP(hBitmap, Palette=0)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    DllCall(&quot;gdiplus\GdipCreateBitmapFromHBITMAP&quot;, Ptr, hBitmap, Ptr, Palette, A_PtrSize ? &quot;UPtr*&quot; : &quot;uint*&quot;, pBitmap)
    return pBitmap
}

SaveBitmapToFile(pBitmap, sOutput, Quality=75)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    SplitPath, sOutput,,, Extension
    if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
        return -1
    Extension := &quot;.&quot; Extension

    DllCall(&quot;gdiplus\GdipGetImageEncodersSize&quot;, &quot;uint*&quot;, nCount, &quot;uint*&quot;, nSize)
    VarSetCapacity(ci, nSize)
    DllCall(&quot;gdiplus\GdipGetImageEncoders&quot;, &quot;uint&quot;, nCount, &quot;uint&quot;, nSize, Ptr, &amp;ci)
    if !(nCount &amp;&amp; nSize)
        return -2
    
    If (A_IsUnicode){
        StrGet_Name := &quot;StrGet&quot;
        Loop, %nCount%
        {
            sString := %StrGet_Name%(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), &quot;UTF-16&quot;)
            if !InStr(sString, &quot;*&quot; Extension)
                continue
            
            pCodec := &amp;ci+idx
            break
        }
    } else {
        Loop, %nCount%
        {
            Location := NumGet(ci, 76*(A_Index-1)+44)
            nSize := DllCall(&quot;WideCharToMultiByte&quot;, &quot;uint&quot;, 0, &quot;uint&quot;, 0, &quot;uint&quot;, Location, &quot;int&quot;, -1, &quot;uint&quot;, 0, &quot;int&quot;,  0, &quot;uint&quot;, 0, &quot;uint&quot;, 0)
            VarSetCapacity(sString, nSize)
            DllCall(&quot;WideCharToMultiByte&quot;, &quot;uint&quot;, 0, &quot;uint&quot;, 0, &quot;uint&quot;, Location, &quot;int&quot;, -1, &quot;str&quot;, sString, &quot;int&quot;, nSize, &quot;uint&quot;, 0, &quot;uint&quot;, 0)
            if !InStr(sString, &quot;*&quot; Extension)
                continue
            
            pCodec := &amp;ci+76*(A_Index-1)
            break
        }
    }
    
    if !pCodec
        return -3

    if (Quality != 75)
    {
        Quality := (Quality &lt; 0) ? 0 : (Quality &gt; 100) ? 100 : Quality
        if Extension in .JPG,.JPEG,.JPE,.JFIF
        {
            DllCall(&quot;gdiplus\GdipGetEncoderParameterListSize&quot;, Ptr, pBitmap, Ptr, pCodec, &quot;uint*&quot;, nSize)
            VarSetCapacity(EncoderParameters, nSize, 0)
            DllCall(&quot;gdiplus\GdipGetEncoderParameterList&quot;, Ptr, pBitmap, Ptr, pCodec, &quot;uint&quot;, nSize, Ptr, &amp;EncoderParameters)
            Loop, % NumGet(EncoderParameters, &quot;UInt&quot;)      ;%
            {
                elem := (24+(A_PtrSize ? A_PtrSize : 4))*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
                if (NumGet(EncoderParameters, elem+16, &quot;UInt&quot;) = 1) &amp;&amp; (NumGet(EncoderParameters, elem+20, &quot;UInt&quot;) = 6)
                {
                    p := elem+&amp;EncoderParameters-pad-4
                    NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, &quot;UInt&quot;)), &quot;UInt&quot;)
                    break
                }
            }      
        }
    }

    if (!A_IsUnicode)
    {
        nSize := DllCall(&quot;MultiByteToWideChar&quot;, &quot;uint&quot;, 0, &quot;uint&quot;, 0, Ptr, &amp;sOutput, &quot;int&quot;, -1, Ptr, 0, &quot;int&quot;, 0)
        VarSetCapacity(wOutput, nSize*2)
        DllCall(&quot;MultiByteToWideChar&quot;, &quot;uint&quot;, 0, &quot;uint&quot;, 0, Ptr, &amp;sOutput, &quot;int&quot;, -1, Ptr, &amp;wOutput, &quot;int&quot;, nSize)
        VarSetCapacity(wOutput, -1)
        if !VarSetCapacity(wOutput)
            return -4
        E := DllCall(&quot;gdiplus\GdipSaveImageToFile&quot;, Ptr, pBitmap, Ptr, &amp;wOutput, Ptr, pCodec, &quot;uint&quot;, p ? p : 0)
    }
    else
        E := DllCall(&quot;gdiplus\GdipSaveImageToFile&quot;, Ptr, pBitmap, Ptr, &amp;sOutput, Ptr, pCodec, &quot;uint&quot;, p ? p : 0)
    return E ? -5 : 0
}

SetBitmapToClipboard(pBitmap)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    off1 := A_PtrSize = 8 ? 52 : 44, off2 := A_PtrSize = 8 ? 32 : 24
    hBitmap := CreateHBITMAPFromBitmap(pBitmap)
    DllCall(&quot;GetObject&quot;, Ptr, hBitmap, &quot;int&quot;, VarSetCapacity(oi, A_PtrSize = 8 ? 104 : 84, 0), Ptr, &amp;oi)
    hdib := DllCall(&quot;GlobalAlloc&quot;, &quot;uint&quot;, 2, Ptr, 40+NumGet(oi, off1, &quot;UInt&quot;), Ptr)
    pdib := DllCall(&quot;GlobalLock&quot;, Ptr, hdib, Ptr)
    DllCall(&quot;RtlMoveMemory&quot;, Ptr, pdib, Ptr, &amp;oi+off2, Ptr, 40)
    DllCall(&quot;RtlMoveMemory&quot;, Ptr, pdib+40, Ptr, NumGet(oi, off2 - (A_PtrSize ? A_PtrSize : 4), Ptr), Ptr, NumGet(oi, off1, &quot;UInt&quot;))
    DllCall(&quot;GlobalUnlock&quot;, Ptr, hdib)
    DllCall(&quot;DeleteObject&quot;, Ptr, hBitmap)
    DllCall(&quot;OpenClipboard&quot;, Ptr, 0)
    DllCall(&quot;EmptyClipboard&quot;)
    DllCall(&quot;SetClipboardData&quot;, &quot;uint&quot;, 8, Ptr, hdib)
    DllCall(&quot;CloseClipboard&quot;)
}

BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster=&quot;&quot;)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    return DllCall(&quot;gdi32\BitBlt&quot;
                    , Ptr, dDC
                    , &quot;int&quot;, dx
                    , &quot;int&quot;, dy
                    , &quot;int&quot;, dw
                    , &quot;int&quot;, dh
                    , Ptr, sDC
                    , &quot;int&quot;, sx
                    , &quot;int&quot;, sy
                    , &quot;uint&quot;, Raster ? Raster : 0x00CC0020)
}

CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff)
{
    DllCall(&quot;gdiplus\GdipCreateHBITMAPFromBitmap&quot;, A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;, pBitmap, A_PtrSize ? &quot;UPtr*&quot; : &quot;uint*&quot;, hbm, &quot;int&quot;, Background)
    return hbm
}

CreateCompatibleDC(hdc=0)
{
   return DllCall(&quot;CreateCompatibleDC&quot;, A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;, hdc)
}

CreateDIBSection(w, h, hdc=&quot;&quot;, bpp=32, ByRef ppvBits=0)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    hdc2 := hdc ? hdc : GetDC()
    VarSetCapacity(bi, 40, 0)
    
    NumPut(w, bi, 4, &quot;uint&quot;)
    , NumPut(h, bi, 8, &quot;uint&quot;)
    , NumPut(40, bi, 0, &quot;uint&quot;)
    , NumPut(1, bi, 12, &quot;ushort&quot;)
    , NumPut(0, bi, 16, &quot;uInt&quot;)
    , NumPut(bpp, bi, 14, &quot;ushort&quot;)
    
    hbm := DllCall(&quot;CreateDIBSection&quot;
                    , Ptr, hdc2
                    , Ptr, &amp;bi
                    , &quot;uint&quot;, 0
                    , A_PtrSize ? &quot;UPtr*&quot; : &quot;uint*&quot;, ppvBits
                    , Ptr, 0
                    , &quot;uint&quot;, 0, Ptr)

    if !hdc
        ReleaseDC(hdc2)
    return hbm
}

DeleteDC(hdc)
{
   return DllCall(&quot;DeleteDC&quot;, A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;, hdc)
}

DeleteObject(hObject)
{
   return DllCall(&quot;DeleteObject&quot;, A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;, hObject)
}

GetDC(hwnd=0)
{
    return DllCall(&quot;GetDC&quot;, A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;, hwnd)
}

GetDCEx(hwnd, flags=0, hrgnClip=0)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    return DllCall(&quot;GetDCEx&quot;, Ptr, hwnd, Ptr, hrgnClip, &quot;int&quot;, flags)
}

ReleaseDC(hdc, hwnd=0)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    return DllCall(&quot;ReleaseDC&quot;, Ptr, hwnd, Ptr, hdc)
}

SelectObject(hdc, hgdiobj)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    return DllCall(&quot;SelectObject&quot;, Ptr, hdc, Ptr, hgdiobj)
}

Startup()
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    if !DllCall(&quot;GetModuleHandle&quot;, &quot;str&quot;, &quot;gdiplus&quot;, Ptr)
        DllCall(&quot;LoadLibrary&quot;, &quot;str&quot;, &quot;gdiplus&quot;)
    VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
    DllCall(&quot;gdiplus\GdiplusStartup&quot;, A_PtrSize ? &quot;UPtr*&quot; : &quot;uint*&quot;, pToken, Ptr, &amp;si, Ptr, 0)
    return pToken
}

Shutdown(pToken)
{
    Ptr := A_PtrSize ? &quot;UPtr&quot; : &quot;UInt&quot;
    
    DllCall(&quot;gdiplus\GdiplusShutdown&quot;, Ptr, pToken)
    if hModule := DllCall(&quot;GetModuleHandle&quot;, &quot;str&quot;, &quot;gdiplus&quot;, Ptr)
        DllCall(&quot;FreeLibrary&quot;, Ptr, hModule)
    return 0
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Krot66)]]></author>
			<pubDate>Wed, 15 Apr 2015 10:09:22 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=93389#p93389</guid>
		</item>
		<item>
			<title><![CDATA[AHK: CN Organizer - скрипт, расширяющий функции CintaNotes]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=88438#p88438</link>
			<description><![CDATA[<p>Скрипт позволяет автоматизировать создание записей в популярном менеджере заметок по горячим клавишам без необходимости ручного ввода тэгов и номеров секций. Кроме того, он позволяет извлекать различную информацию из активного окна и подставлять ее в тэги. Делает возможным использование программы в качестве планировщика заданий.</p><p>Скрипт настраивается с помощью записей в простейшем конфигурационном файле, связывающем клавишу с номером секции и тэгом (RCtrl+RSift+клавиша - создание записии, RCtrl+RAlt+клавиша - открытие). Помимо одиночных тэгов возможно задание набора, например, вида &quot;Books Книги/читать&quot;. </p><p><em>Кроме постоянных значений, для записи в тэг, возможно использование следующих переменных:</em></p><p><strong>$time</strong> - при создании заметки выводится окно ввода даты и времени с календарем, которые подставляются в тэг вместо переменной. RCtrl+RAlt+клавиша показывает заметки, относящиеся к сегодняшнему дню. Можно создавать различные списки от дел до телепрограмм и быстро просматривать текущие. Вид дерева дат в боковой панели настраиваем.</p><p><strong>$site</strong> - подставляет в тэг корневой адрес сайта, открытого в браузере. Это позволяет отмечать конкретные страницы сайтов, интересующие ветки форумов, покупки в интернет-магазинах, фильмы, слова в онлайн словарях и пр., а потом мгновенно к ним возвращаться при открытии сайта, без создания закладок и привязки к конкретному браузеру.</p><p><strong>$cmd </strong>- имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы. Путь файла подставляется в ссылку для открытия по F7, RCtrl+RAlt+клавиша открывает заметки, привязанные к открытому файлу. Удобно для собирания цитат из книг - можно параллельно работать со множеством материалов, не путая их содержимое и сортируя заметки по мере необходимости.</p><p><strong>$title</strong> - название или имя файла без расширения, взятое из заголовка окна. Если в заголовке найден полный путь, он подставляется в ссылку для открытия. Назначение то же.</p><p><strong>$cmt</strong> - совмещающает возможности двух предыдущих: сначала ищется имя файла в командной строке, а если он отсутствует, используется заголовок окна. </p><p><strong>$file</strong> - файл под курсором в проводнике или файловом менеджере (FAR, Total, etc.). Путь подставляется в ссылку и заголовок заметки. Можно отмечать файлы для последующего просмотра, а потом быстро возвращаться к ним из CN. RCtrl+RAlt+клавиша открывает заметки к выделенному в проводнике файлу, если они есть</p><p><strong>$proc</strong> - имя процесса активного окна без расширения. Позволяет быстро писать заметки к изучаемым программам и возвращаться к ним по горячей клавише, когда окно программы активно</p><br /><p>Дополнительные возможности:<br /></p><ul><li><p>RCtrl+RShift+Space - создание заметки в той же секции и с тем же набором тэгов, что и в последний раз, RCtrl+RAlt+Space - открытие последних созданных заметок</p></li><li><p>В окне редактирования заметки RCtrl+клавиша заменяет секцию и тэг с ней связанными (быстрая сортировка), RShift+клавиша дополняет тэг заданным</p></li><li><p>В главном окне программы щелчок средней кнопки - открытие ссылки выделенной заметки</p></li><li><p>Секундное зажатие правого Ctrl при создании заметки добавляет к тэгу настраиваемый суффикс, дополнительный или дочерний тэг (например, &quot;_ToDo&quot; или &quot;/!!!&quot;)</p></li><li><p>Так же есть возможность назначать суффиксы и дочерние тэги, добавляющееся к существующим по горячей клавише в окне редактирования по L/RCtrl+Space и L/RShift+Space</p></li><li><p>Возможность ограничения числа последовательных пустых строк в скопированном в заметку тексте (актуально для многих документов и веб-страниц)</p></li><li><p>Возможность автоматической обрезки хвостов вида &quot;Читать дальше: [ссылка]&quot;, добавляемых скриптами на вебстраницах. Можно прописать начало любого повторяющегося паразитного текста и не видеть его в заметках.</p></li><li><p>Возможность сохранения в буфере обмена текста заметки или первой непустой строки в виде, пригодном для переименования файлов (делаешь заметку о ставящемся на закачку файле и сразу же меняешь название на взятое из заголовка)</p></li><li><p>При использовании $cmdline, $file, $title, $cmt можно создавать ссылку на каталог вместо ссылки на файл</p></li><li><p>Для удобочитаемости можно копировать адреса и пути из раздела ссылки в примечания</p></li></ul><div class="codebox"><pre><code>
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance, force
Menu, Tray, Icon, shell32.dll, 21
SetTitleMatchMode, 2
SetTitleMatchMode, Slow
;~ SetKeyDelay 50, 50
goto start

; Настройки горячих клавиш программы должны быть: Ctrl+F12 - создание, CTRL+ALT+F12 - показать главное окно.
; В Настройках - Захват текста - После захвата должно стоять &quot;Открыть на редактирование&quot; 

; Скрипт связывает клавишу с номером (существующей!) вкладки и набором тэгов. Комбинация RCtrl+RShift+клавиша создает заметку, RCtrl+RAlt+клавиша - открывает соответствующую вкладку и тэг.

; При запуске в каталоге скрипта создается одноименный cfg-файл, задающий эти соответствия.
;             Синтаксис строк предельно прост:
;     номер секции,тэг или набор тэгов,имя клавиши или ее код (виртуальный или скан),пояснение (необязательно).

;     Например:
;    1,,1 - первая секция без тэга по 1 (строки такого вида добавляются автоматически)
;    1,Comp,vk43,c - тэг Comp в первой секции по клавише c
;     1,Soft Comp,vk53,s - два тэга там же по s
;     1,Books/читать,sc30,b - дочерний тэг &quot;читать&quot; в Books по b
;   1,Книги Books/читать,F6 - комбинация двух предыдущих возможностей по F6 (использование &quot;,&quot; и &quot;;&quot; как разделителя не допускается - только пробел)

; Для применения изменений следует перезапустить скрипт!

;~ Кроме постоянных значений, для записи в тэг возможно использование следующих переменных:

;~ $time - при создании заметки выводится окно ввода даты и времени с календарем, которые подставляются в тэг (8,Дела/$time,vkC0,~)
;~ $site - подставляет в тэг корневой адрес сайта, открытого в браузере
;~ $cmd - имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы.  
;~ $title - название или имя файла без расширения, взятое из заголовка окна; ищет там и полный путь.
;~ $cmt - переменная, совмещающая возможности двух предыдущих: сначала ищется путь файла в командной строке, а если он отсутствует, используется заголовок окна.
;~ $file - файл под курсором в проводнике или файловом менеджере 
;~ $proc - имя процесса активного окна без расширения 

; В файле конфигурации допускаются пустые строки, лишние пробелы - только в пояснениях. Временно ненужное можно закоментировать &quot;;&quot;.

; --------- Горячие клавиши ---------- 
;   В открытом окне заметки:
; RCtrl+клавиша - замена секции и тэга  данными, связанными с клавишей
; RShift+клавиша - дополнение текущего тэга связанным с клавишей (производится проверка, связан ли он с текущей секцией)
; По L/RCtrl+Space и L/RShift+Space - добавляются настраиваемые тэги, суффиксы или дочерние тэги (см. ниже)

&gt;^&gt;+F12::Run % &quot;Notepad.exe &quot; cfg ; RCtrl+RShift+F12 - окрытие конфигурационного файла

&gt;^&gt;+Space::goto Last_add ; RCtrl+RShift+Space - создание заметки в той же секции и с теми же тэгами, что и в последний раз

&gt;^&gt;!Space::goto Last_open ; RCtrl+RAlt+Space - открытие последних созданных заметок

; -------- Мышь (в главном окне программы) --------
#IfWinActive ahk_class CintaNotes.MainFrame
MButton::F7 ; Cредняя кнопка - открытие ссылки выделенной заметки
#IfWinActive
start:

;------------ Настройки скрипта -------------
ctrl_tag:=&quot;_ToDo&quot; ; Суффикс, прописывающийся при секундном зажатии правого Ctrl в тэг при создании заметки. Если вписать &quot; ToDo&quot;, будет добавляться дополнительный тэг, если &quot;/ToDo&quot; - дочерний

lctrl_space:=&quot;_rem&quot; ; Суффикс, дополнительный или дочерний тэг дописывающийся к текущему тэгу по LCtrl+Space в окне редактирования

rctrl_space:=&quot;_ToDo&quot; ; То же для RCtrl+Space

lshift_space:=&quot; !Смотреть&quot; ; То же для LShift+Space

rshift_space:=&quot;_Old&quot; ; То же для RShift+Space

t_tree:=&quot;yyyy_MM/dd_dddd&quot; ; Комбинация, подставляющаяся в тэг вместо даты при использовании $time. Определяет вид дерева дат в боковой панели

dir_path:=0 ; При использовании $cmd, $title, $cmt и $file создавать ссылку на каталог вместо ссылки на файл

max_empty_str:=2 ; Максимальное число последовательных пустых строк в скопированном в заметку тексте. 0 - без ограничения

endnote:=&quot;Больше информации на http,Читайте далее: http,Читать далее: http,Подробности: http&quot; ; Начала обрезаемых хвостов, добавляемых при копировании текста скриптами на веб-страницах

clip:=2 ; Сохранять в буфере обмена после создания заметки: 1 - текст заметки, 2 - первую непустую строку в виде, пригодном для переименования файлов; 0 - прежнее содержимое

link2rem:=1 ; Копировать адреса и пути из раздела ссылки в примечания

;----------------------------------
SplitPath A_ScriptName, , , , cfg
cfg:=cfg &quot;.cfg&quot;
IfNotExist % cfg
    FileAppend , % &quot;1,,1`r`n2,,2`r`n3,,3`r`n4,,4`r`n5,,5`r`n6,,6`r`n7,,7`r`n8,,8`r`n9,,9`r`n0,,0&quot;, % cfg, utf-8
Loop Read, % cfg
{
    If A_LoopReadLine contains `;
        continue
    If A_LoopReadLine=`r`n
        continue
    Loop Parse, A_LoopReadLine, CSV
    {
        If (A_Index=1)            
            tab:=A_LoopField
        If (A_Index=2)
            tag:=A_LoopField    
        If (A_Index=3)
            key:=A_LoopField
    }
    tab_%key%:=tab
    tag_%key%:=tag
    Hotkey % &quot;&gt;^&gt;+&quot; key, Note
    Hotkey IfWinActive, ahk_class Cinta.ModelessDialog
    Hotkey % &quot;&gt;^&quot; key, Note
    Hotkey % &quot;&gt;+&quot; key, Note
    Hotkey IfWinActive
    Hotkey % &quot;&gt;^&gt;!&quot; key, Open
}
return

#IfWinActive ahk_class Cinta.ModelessDialog
&lt;^Space::Addtag(lctrl_space)
&gt;^Space::Addtag(rctrl_space)
&lt;+Space::Addtag(lshift_space)
&gt;+Space::Addtag(rshift_space)
#IfWinActive

Addtag(tt)
{
    KeyWait Ctrl, T1
    KeyWait Shift, T1
    ControlGetText tag, Cinta.Edit2
    s:=SubStr(tag,0)
    If (s=&quot; &quot;)
        StringTrimRight tag, tag, 1
    ControlSetText Cinta.Edit2, % tag . tt &quot; &quot;
    Send {End}
    return
}

Note:
KeyWait RShift, T1
KeyWait RCtrl, T0.6
e:=ErrorLevel
clip_old:=Clipboard
old_tag:=&quot;&quot;
site_add:=&quot;&quot;
site_text:=&quot;&quot;
gosub GetTag
Last_add:
If tag contains $time
{
    Gui Destroy
    Gui, +AlwaysOnTop 
    Gui Margin , 5, 5
    Gui font, s12
    Gui Add, Text, , используя курсорные клавиши и календарь (Alt+Down)
    Gui Add, DateTime ,wp+0 vDateTime, yyyy MMMM dd, dddd   HH:mm
    Gui Add, Button, y5 r2 w60 Default, OK
    Gui Show, Center, Введите дату и время
    return
}
If A_Thishotkey contains &gt;^&gt;+
{
    KeyWait RCtrl
    Send ^{F12}
    If (cl=&quot;Cinta.ModelessDialog&quot;)
        WinWaitNotActive % t, , 10
    WinWaitActive ahk_class Cinta.ModelessDialog, , 10
    Sleep 200
}
If A_Thishotkey contains &gt;^
{
    Control Choose, % tab, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
    end:=&quot;&quot;
    If e
        end:=ctrl_tag        
    ControlSetText Cinta.Edit2, % tag . end &quot; &quot;
    If A_Thishotkey not contains +
        return
}
else
{
    SendMessage, 0x147, 0, 0, Cinta.Combobox1
    stab:=ErrorLevel+1
    If (stab&lt;&gt;tab)
    {
        MsgBox, 262160, Ошибка, Тэг относится к другой секции!, 1.5
        return
    }
    ControlGetText old_tag, Cinta.Edit2
    s:=SubStr(old_tag,0)
    If (s=&quot; &quot;)
        StringTrimRight old_tag, old_tag, 1
    ControlSetText Cinta.Edit2, % old_tag &quot; &quot; tag &quot; &quot;
    Send {End}
    return
}
If tt contains $file
{
    ControlSetText Cinta.Edit1, % &quot;File: &quot; f_path
    ControlSetText Cinta.RichEdit1
}
If tt contains $site
{
    ControlSetText Cinta.Edit3, % site_add
    ControlSetText Cinta.RichEdit1, % site_text
}
ControlGetText add, Cinta.Edit3, ahk_class Cinta.ModelessDialog
If add &amp;&amp; link2rem
    ControlSetText Cinta.RichEdit2, % add
If ! add &amp;&amp; f_path
{
    If link2rem
        ControlSetText Cinta.RichEdit2, % f_path
    If dir_path
        SplitPath f_path, , f_path
    ControlSetText Cinta.Edit3, % f_path
}
ControlGetText n_txt, Cinta.RichEdit1
If endnote
    n_txt:=DelTrail(n_txt,endnote)
If max_empty_str    
    n_txt:=MaxEmptyString(n_txt,max_empty_str)
ControlSetText Cinta.RichEdit1, % n_txt
If (clip&gt;0) &amp;&amp; (n_txt&lt;&gt;&quot;&quot;)
{
    If (clip=2)
    {
        Loop parse, n_txt, `n, `r 
        {
            If (A_LoopField=&quot;&quot;)
                continue
            n_txt:=A_LoopField            
            break            
        }
        n_txt:=ValidName(n_txt)
        n_txt:=FirstUppercase(n_txt)
    }
    Clipboard:=n_txt
}
else
    Clipboard:=clip_old
Last_tag:
Loop
{
    SendMessage, 0x147, 0, 0, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
    tab:=ErrorLevel+1
    ControlGetText tag, Cinta.Edit2
    sl:=SubStr(tag,0)
    If (sl=&quot; &quot;)
        StringTrimRight tag, tag, 1
    Sleep 100
    IfWinNotActive ahk_class Cinta.ModelessDialog
        break
}
return

ButtonOK:
Gui, Submit
FormatTime DateTime, % DateTime, % t_tree . &quot;/HH:mm&quot;
StringReplace tag, tag, $time, % DateTime
WinActivate % t
goto Last_add

GuiClose:
GuiEscape:
Gui Cancel
return

~^F12::
WinWaitActive ahk_class Cinta.ModelessDialog, , 3
goto Last_tag


Open:
KeyWait Alt, T1
KeyWait RCtrl, T0.6
e:=ErrorLevel
If tag contains $time
{
    FormatTime DateTime, , % t_tree 
    StringReplace tag, tag, $time, % DateTime
}    
gosub GetTag    
Last_open:
KeyWait RCtrl, T2
IfWinNotActive ahk_class CintaNotes.MainFrame
{
    Send ^!{F12}
    WinWait ahk_class CintaNotes.MainFrame, , 2
    If ErrorLevel
        return
}
Send ^{%tab%}
Sleep 600
If tag
{
    end:=&quot;&quot;
    If e
        end:=ctrl_tag
    ControlSetText Cinta.Edit1, % tag . end
    ControlSend Cinta.Edit1, {Enter}
    Sleep 200
    Send {Home}
}
KeyWait RAlt, T1
If Errorlevel
    Send {Alt Up}
return

;----------------------
GetTag:
StringGetPos  kf, A_ThisHotkey, ^
StringTrimLeft key, A_ThisHotkey, kf+1
StringGetPos  kf, key, +
StringTrimLeft key, key, kf+1
StringGetPos  kf, key, !
StringTrimLeft key, key, kf+1
tab:=tab_%key%
tag:=tag_%key%
f_path:=&quot;&quot;
tt:=tag    
WinGetActiveTitle t
WinGetClass cl, A        
If tag contains $cmd,$cmt
{
    f_path:=GetPath(t)
    If ! f_path
    {
        If tag contains $cmt
            goto Title
        else
        {
            MsgBox, 262160, Ошибка, Путь файла недоступен!, 1.5
            Exit
        }
    }
    SplitPath f_path, , , , ntag
    ntag:=ValidName(ntag)
    StringReplace ntag, ntag, % &quot; &quot;, _, All
    StringReplace ntag, ntag, `,, _, All    
    StringReplace tag, tag, $cmd, % ntag
    StringReplace tag, tag, $cmt, % ntag
}
Title:
If tag contains $title,$cmt
{
    RegExMatch(t,&quot;[A-Z]:\\.+\.[a-zA-Z0-9]{2,4}&quot;,f_path)
    ttag:=f_path
    If ! ttag
        RegExMatch(t,&quot;(?&lt;=\[).+\.[a-zA-Z0-9]{2,4}(?=])&quot;,ttag)
    If ! ttag
        RegExMatch(t,&quot;.+\.[a-zA-Z0-9]{2,4}(?= - )&quot;,ttag)
    If ! ttag
        RegExMatch(t,&quot;(?&lt;= - ).+\.[a-zA-Z0-9]{2,4}(?=$)&quot;,ttag)
    SplitPath ttag, , , ,ttag
    If ! ttag
        RegExMatch(t,&quot;.+(?= - )&quot;,ttag)
    If ! ttag
        ttag:=t
    StringReplace ttag, ttag, % &quot; &quot;, _, All
    StringReplace ttag, ttag, `,, _, All
    StringReplace tag, tag, $title, % ttag
    StringReplace tag, tag, $cmt, % ttag
}
If tag contains $file
{
    Clipboard:=&quot;&quot;
    Send, ^{vk43}
    ClipWait 2
    f_path:=Clipboard
    If f_path not contains :\
    {
        MsgBox, 262160, Ошибка, Путь недоступен!, 1.5
        Exit
    }
    SplitPath f_path, ftag
    StringReplace ftag, ftag, % &quot; &quot;, _, All
    StringReplace ftag, ftag, `,, _, All
    StringReplace tag, tag, $file, % ftag
}
If tag contains $proc
{
    WinGetActiveTitle t
    WinGet prtag, ProcessName, % t
    SplitPath prtag, , , , prtag
    prtag:=FirstUppercase(prtag)
    StringReplace tag, tag, % &quot; &quot;, _, All
    StringReplace tag, tag, $proc, % prtag
}
If tag contains $site
{
    If A_Thishotkey contains &gt;^
    {
        Clipboard:=&quot;&quot;
        Send ^{Ins}
        ClipWait 2
        site_text:=Clipboard
        Sleep 300
    }        
    Clipboard:=&quot;&quot;
    Send ^{vk4C}
    Sleep 300
    Send ^{Ins}
    ClipWait 2
    site_add:=Clipboard
    RegExMatch(Clipboard,&quot;(?&lt;=//).+?(?=/)&quot;,stag)
    If ! stag
    {
        MsgBox, 262160, Ошибка, Адрес недоступен!, 1.5
        Exit
    }
    StringReplace tag, tag, $site, % stag
}
return

;-------------------------
DelTrail(text,end)
{
    global
    Loop Parse, end, CSV
    {
        If text contains % A_LoopField
        {
            StringGetPos p, text, % A_LoopField
            StringLeft text, text, p
            break
        }
    }
    return text
}

FirstUppercase(t)
{
    StringLeft n, t, 1
    StringTrimLeft k, t, 1
    StringUpper n, n
    return n . k
}

GetPath(title)
{
    WinGet pr, ProcessName, % title
    Process, Exist, % pr
    pid := ErrorLevel
    for process in ComObjGet(&quot;winmgmts:&quot;).ExecQuery(&quot;Select * from Win32_Process&quot;)
    If (process.ProcessId = pid)
    cmdline := process.CommandLine
    If cmdline contains Explorer.exe
        cmdline:=&quot;&quot;
    fp:=RegExMatch(cmdline,&quot;[A-Z]:\\.*\.[a-zA-Z0-9]{2,5}&quot;,f_path,6)
    return f_path
}

MaxEmptyString(text,max)
{
    t:=&quot;&quot;
    n:=max
    Loop Parse, text, `n, `r
    {
        If A_LoopField
        {
            t:=t . A_LoopField  &quot;`r`n&quot;
            n:=0
            continue            
        }
        else
        {
            n:=n+1
            If (n&lt;=max)
                t:=t &quot;`r`n&quot;
        }
    }
    return t
}

ValidName(n)
{
    StringReplace n, n, `r`n,% &quot; &quot;, All
    StringReplace n, n, `n,% &quot; &quot;, All
    StringReplace n, n, \,% &quot; &quot;, All
    StringReplace n, n, /,% &quot; &quot;, All
    StringReplace n, n, :, ,All
    StringReplace n, n, *, ,All
    StringReplace n, n, ?, ,All
    StringReplace n, n, &quot;, ,All
    StringReplace n, n, &gt;,% &quot; &quot;, All
    StringReplace n, n, &lt;,% &quot; &quot;, All
    StringReplace n, n, |, -, All
    StringReplace n, n,% &quot;  &quot;, % &quot; &quot;, All
    return Trim(n)
}    
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Krot66)]]></author>
			<pubDate>Tue, 18 Nov 2014 11:31:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=88438#p88438</guid>
		</item>
	</channel>
</rss>
