CN Organizer - скрипт Autohotkey, расширяющий функции CintaNotes
Помимо исправленных багов и улучшенной совместимости с программами, по сравнению со
старой версией изменения в следующем:
1. Добавлена возможность оптического распознавания текста с помощью Tesseract OCR, дающая возможность делать заметки из лишенных текстового слоя pdf и djvu книг, защищенных от копирования документов и страниц, текстовых картинок и пр.. Качество распознавания довольно приличное, поддерживаются двуязычные тексты. Для улучшения рекомендуется использовать естественный масштаб документа и выделение текста с минимальными полями. Качество распознавания резко падает при обработке менее пяти-шести строк текста, поэтому часто бывает лучше не экономить на выделении, а после удалить лишнее.
Помимо CintaNotes, скрипт может быть использован как простое и удобное приложение для распознавания скриншотов, поиска и перевода полученного текста, имеющее ряд дополнительных возможностей.
Как это работает. Зажимая Shift, щелкаем средней кнопкой мыши. Под курсором появляется прямоугольное полупрозрачное окошко. Перетаскивая его мышью и масштабируя за углы и края, накрываем интересующий участок текста. Щелчок правой кнопкой мыши по окну выделения - подтверждение, Escape или щелчок правой кнопкой вне окна - отмена операции.
После секундного размышления появляется окно с распознанным текстом:
Здесь:
Search - поиск выделенного текста в Google.
Translate - отправка всего текста в Google Translate.
RUS+ENG - выпадающее меню наборов языков распознавания. Можно создавать собственные наборы языков из числа имеющихся языковых пакетов (смотри "Настройки OCR" скрипта). Выбор другого языка перезапускает процесс распознавания и сохраняется до следующего запуска.
Add to next - запоминает распознанный текст и добавляет его автоматически при следующем распознавании. Это позволяет собирать в одну заметку текст из нескольких кусков, что удобно, например, при конспектировании или обработке текста, расположенного на границе двух страниц, где распознавание в один прием невозможно.
Delete old - удаляет старые, созданные клавишей Add to next фрагменты и оставляет только текущий.
OCR history - выпадающее меню, в котором можно скопировать в буфер любой из распознанных с момента запуска скрипта фрагментов.
Sep - чекбокс, управляющий удалением разделителей фрагментов, имеющих вид "### Дата Время Имя документа или страницы ###". По умолчанию (это можно изменить в настройках) при копировании или создании заметки разделители удаляются и фрагменты идут встык. При конспектировании их можно оставить для разделения цитат и указания источников.
Undo - возвращает окно к виду, бывшему при последнем закрытии.
Copy - копирование текста окна.
CintaNotes - отправляет распознанный текст в новую заметку CintaNotes с оригинальным заголовком, при этом окно c распознанным текстом закрывается автоматически. (Тот же результат дает нажатие Ctrl+F12). Нажатие RShift+F12 открывает его вновь с текстом, бывшем в нем на момент закрытия.
Если при открытом окне распознавания использовать скриптовое сочетание клавиш (RCtrl+RShift+клавиша), будет создана заметка в оответствии со связанными с клавишей правилами. При этом сгенерированные переменные ($title, $cmd, $cmt, $proc) будут относиться к исходному окну распознаваемого документа.
Собранный набор скрипт+Tesseract OCR с 5-ю великими европейскими языками можно скачать здесь Чтобы сделать все самостоятельно, идем
сюда, качаем tesseract-ocr-3.02-win32-portable.zip и потребные языковые пакеты. Распаковываем дистрибутив и помещаем папку Tesseract-OCR в каталог скрипта. В нее же распаковываем архивы языковых пакетов. Если удалить множество ненужных файлов и папок, в итоге должно получиться дерево примерно такого вида:
|-- Tesseract-OCR <DIR>
| |-- tessdata <DIR>
| | |-- deu.traineddata
| | |-- eng.traineddata
| | |-- fra.traineddata
| | |-- rus.traineddata
| | |-- spa.traineddata
| |-- tesseract.exe
|-- CN Organizer.ahk
2. Добавлен функционал для изучения языков (собственные словари изучаемых слов и словосочетаний), а так же алфавитных каталогов
терминов, энциклопедических статей и пр..
Для этого используется переменная $dict. При ее использовании начальная часть статьи идет в заголовок заметки, а сама переменная заменяется первой буквой в верхнем регистре. Так если добавить в конфигурационный файл строку "1,English/%dict,F5", при нажатии RCtrl+RShift+F5 из словарной статьи со словом godspeed в 1-й секции будет создана заметка с заголовком godspeed и тэгом English/G.
Имеет смысл выделить для таких каталогов отдельную секцию с сортировкой заметок по алфавиту.
ВАЖНО: для правильного отображения знаков транскрипции следует открыть файл настроек cintanotes.settings (каталог скрипта для портативной версии или Application Data\CintaNotes для инсталлятора) и в параметре app.mainframe.notetextfont заменть Verdana на Tahoma или любой другой шрифт, установленный в системе и имеющий соответствыющий набор символов.
[more=Скрипт]
Код: #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 - показать главное окно.
; В Настройках - Захват текста - После захвата должно стоять "Открыть на редактирование"
; Скрипт связывает клавишу с номером (существующей!) вкладки и набором тэгов. Комбинация RCtrl+RShift+клавиша создает заметку, RCtrl+RAlt+клавиша - открывает соответствующую вкладку и тэг.
; При запуске в каталоге скрипта создается одноименный cfg-файл, задающий эти соответствия.
; Синтаксис строк предельно прост:
; номер секции,тэг или набор тэгов,имя клавиши или ее код (виртуальный или скан),пояснение (необязательно).
; Например:
; 1,,1 - первая секция без тэга по 1 (строки такого вида добавляются автоматически)
; 1,Comp,vk43,c - тэг Comp в первой секции по клавише c
; 1,Soft Comp,vk53,s - два тэга там же по s
; 1,Books/читать,sc30,b - дочерний тэг "читать" в Books по b
; 1,Книги Books/читать,F6 - комбинация двух предыдущих возможностей по F6 (использование "," и ";" как разделителя не допускается - только пробел)
; Для применения изменений следует перезапустить скрипт!
;~ Кроме постоянных значений, для записи в тэг возможно использование следующих переменных:
;~ $time - при создании заметки выводится окно ввода даты и времени с календарем, которые подставляются в тэг (8,Дела/$time,vkC0,~)
;~ $site - подставляет в тэг корневой адрес сайта, открытого в браузере
;~ $cmd - имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы.
;~ $title - название или имя файла без расширения, взятое из заголовка окна; ищет там и полный путь.
;~ $cmt - переменная, совмещающая возможности двух предыдущих: сначала ищется путь файла в командной строке, а если он отсутствует, используется заголовок окна.
;~ $file - файл под курсором в проводнике или файловом менеджере
;~ $proc - имя процесса активного окна без расширения
;~ $dict - создание алфавитных каталогов. Текст из начала заметки идет в заголовок, переменная заменяется его начальной буквой в верхнем регистре(например, при записи 1,English/%dict,F5, слово godspeed по F5 получит тэг English/G)
;~ $z - наличие в любом месте автоматически сохраняет заметку и закрывает окно с секундной задержкой
; В файле конфигурации допускаются пустые строки, лишние пробелы - только в пояснениях. Временно ненужное можно закоментировать ";".
; --------- Горячие клавиши ----------
; В открытом окне заметки:
; RCtrl+клавиша - замена секции и тэга данными, связанными с клавишей
; RShift+клавиша - дополнение текущего тэга связанным с клавишей (производится проверка, связан ли он с текущей секцией)
; По L/RCtrl+Space и L/RShift+Space - добавляются настраиваемые тэги, суффиксы или дочерние тэги (см. ниже)
; Чтобы сделать заметку из распознанного текста, зажимаем Shift и щелкаем средней кнопкой мыши. Под курсором появляется прямоугольное полупрозрачное окошко.Перетаскивая его мышью и масштабируя за углы и края, накрываем интересующий участок текста. Щелчок правой кнопкой мыши по окну выделения - подтверждение, Escape или щелчок правой кнопкой вне окна - отмена операции. Далее делается заметка клавишей CintaNotes или скриптовым сочетание клавишю
;~ RShift+F12 - открытие интерфейса программы с текстом, бывшим в момент закрытия.
>^>+F12::Run % "Notepad.exe " cfg ; RCtrl+RShift+F12 - окрытие конфигурационного файла
>^>+Space::goto Last_add ; RCtrl+RShift+Space - создание заметки в той же секции и с теми же тэгами, что и в последний раз
$>^>!Space::goto Last_open ; RCtrl+RAlt+Space - открытие последних созданных заметок
; -------- Мышь (в главном окне программы) --------
#IfWinActive ahk_class CintaNotes.MainFrame
MButton::Send {LButton}{F7} ; Cредняя кнопка - открытие ссылки заметки под курсором
#IfWinActive
Start:
;------------ Настройки скрипта -------------
ctrl_tag:="_ToDo" ; Суффикс, прописывающийся при секундном зажатии правого Ctrl в тэг при создании заметки. Если вписать " ToDo", будет добавляться дополнительный тэг, если "/ToDo" - дочерний
lctrl_space:="_rem" ; суффикс, дополнительный или дочерний тэг дописывающийся к текущему тэгу по LCtrl+Space в окне редактирования
rctrl_space:="_ToDo" ; то же для RCtrl+Space
lshift_space:=" !Смотреть" ; то же для LShift+Space
rshift_space:="_Old" ; то же для RShift+Space
t_tree:="yyyy_MM/dd_dddd" ; комбинация, подставляющаяся в тэг вместо даты при использовании $time. Определяет вид дерева дат в боковой панели
dir_path:=0 ; при использовании $cmd, $title, $cmt и $file создавать ссылку на каталог вместо ссылки на файл
max_empty_str:=2 ; максимальное число последовательных пустых строк в скопированном в заметку тексте
end_note:="Больше информации на http|Читайте далее: http|Читать далее: http|Подробности: http|Источник: http" ; начала обрезаемых хвостов, добавляемых при копировании текста скриптами на веб-страницах, разделенные "|"
clip:=2 ; сохранять в буфере обмена после создания заметки: 1 - текст заметки, 2 - первую непустую строку в виде, пригодном для переименования файлов (заметки о файлах, ставящихся на закачку); 0 - прежнее содержимое
link2rem:=1 ; копировать адреса и пути из раздела ссылки в примечания
;------------ Настройки OCR -------------
; Наборам языков сопоставляются переменные lng_%n%, отображаемые в выпадающем меню. Коды языков соответствуют именам файлов языковых пакетов в папке tessdata. Не более 2-х языков одновременно через "+".
lng_1:="rus+eng" ; дефолтный язык распознавания
lng_2:="rus"
lng_3:="eng"
lng_4:="deu"
lng_5:="fra"
lng_6:="spa"
opaque:=130 ; непрозрачность окна выделения текста (1-255)
color:="FFDC00" ; его цвет
ft:=16 ; размер шрифта окна распознанного текста
sep:=0 ; сохранение разделителей фрагментов по умолчанию
search:="https://www.google.ru/search?client=opera&q=%s&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest&gws_rd=ssl" ; строка поиска текста
translate:="www.translate.google.com/#auto|ru|%s" ; строка перевода текста
;-----------------------------------------------
SysGet, M, MonitorWorkArea
text:="", lng:=lng_1
history:="OCR history" A_Tab . A_Tab
SplitPath A_ScriptName, , , , cfg
cfg:=cfg ".cfg"
IfNotExist % cfg
FileAppend , % "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", % 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 % ">^>+" key, Note
Hotkey IfWinActive, ahk_class Cinta.ModelessDialog
Hotkey % ">^" key, Note
Hotkey % ">+" key, Note
Hotkey IfWinActive
Hotkey % ">^>!" key, Open
}
n:=1, lng_string:=lng_1
Loop
{
n+=1
If lng_%n%
lng_string.=A_Tab . lng_%n%
If (n>20)
break
}
return
#IfWinActive ahk_class Cinta.ModelessDialog
<^Space::Addtag(lctrl_space)
>^Space::Addtag(rctrl_space)
<+Space::Addtag(lshift_space)
>+Space::Addtag(rshift_space)
#IfWinActive
Addtag(tt)
{
KeyWait Ctrl, T1
KeyWait Shift, T1
ControlGetText tag, Cinta.Edit2
s:=SubStr(tag,0)
If (s=" ")
StringTrimRight tag, tag, 1
ControlSetText Cinta.Edit2, % tag . tt " "
Send {End}
return
}
;------------------------------------------------
>+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("select_ocr_area")
{
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>sx && mx<sx+sw && my>sy && my<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 "|" sy "|" sw "|" sh,"ocr.png", 0, 0)
Recogn:
ToolTip Распознаю..., MRight/2, MBottom/2
RunWait % "Tesseract-OCR\tesseract.exe ocr.png ocr -l " lng, ,Min
ToolTip
Sleep 200
FileEncoding UTF-8-RAW
FileRead text, ocr.txt
text:=RegExReplace(text,"m)^(\s+|:|;|!|\?|\|)")
text:=RegExReplace(text,"m)A_Space+$")
text:=RegExReplace(text,"\s+$")
text:=RegExReplace(text,"\R{2,}","`r`n")
text:=RegExReplace(text,"(\.|,|:|;)(,|:|;)","$1")
text:=RegExReplace(text," {1,3}(\.|,|:|;|!|\?|\)|]|})","$1")
text:=RegExReplace(text,"(\.|,|:|;|!|\?)A_Space{2,3}","$1A_Space")
text:=RegExReplace(text,"(\[|\{|\()A_Space{1,3}","$1")
history:=text . A_Tab . history
FormatTime dt, , dd.MM.yyyy HH:mm
text:="`r`n### " dt " " CleanTitle(source_title,80) " ###`r`n" text "`r`n"
text:=RegExReplace(old_text . text,"^\s+")
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&el
Gui 2:Add, Button, x+0 wp hp, &Search
Gui 2:Add, Button, x+0 wp hp, &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, &Add to next
Gui 2:Add, Button, x+0 wp hp, Cinta&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%, &Sep
Gui 2:Add, Button,x+0 w%u_w% hp, &Undo
Gui 2:Add, Button, x+0 w%b_w% hp, Delete old
Gui 2:Add, Button, x+0 wp hp, &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:="http://" url
StringReplace url, url, `%s, % text
Run % url
text:=""
return
2ButtonTranslate:
Gui 2:Submit, NoHide
text:=RegExReplace(text,"\R?### .+? ###\R","")
url:=translate
StringReplace url, url,
http:// StringReplace url, url,
https:// url:="http://" url
StringReplace url, url, `%s, % text
Run % url
return
lng:
Gui 2:Submit
If !text
return
text:=RegExReplace(text,"^.*###\R","")
history:=text . A_Tab . history
goto Recogn
2ButtonUndo:
Gui 2:Submit, NoHide
If !undo_text
return
text:=RegExReplace(undo_text,"\R","`r`n")
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:=""
KeyWait LButton, T1
text:=RegExReplace(text,"^\R+")
If !sep
text:=RegExReplace(text,"\R?### .+? ###\R","")
text:=RegExReplace(text,"\R","`r`n")
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,"^.*(?=\R?### .+? ###)","")
text:=RegExReplace(text,"\R","`r`n")
ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
old_text:=""
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,"^\R+")
If !sep
text:=RegExReplace(text,"\R?### .+? ###\R","")
Clipboard:=text
ToolTip Тект в буфере!
Sleep 700
ToolTip
return
;---------------------------------
Note:
KeyWait RShift, T1
KeyWait RCtrl, T0.7
ctrl_delay:=ErrorLevel
clip_old:=Clipboard, old_tag:="", site_add:="", site_text:=""
IfWinActive select_ocr_area ahk_class AutoHotkeyGUI
Exit
IfWinActive %source_title% ahk_class AutoHotkeyGUI
{
Gui 2:Submit, NoHide
old_text:="", undo_text:=text
text:=RegExReplace(text,"^\R+")
If !sep
text:=RegExReplace(text,"\R?### .+? ###\R","")
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 >^>+
{
KeyWait RCtrl, T1.5
SendEvent ^{F12}
WinWaitNotActive % "ahk_id " source_id, , 5
WinWaitActive ahk_class Cinta.ModelessDialog, , 10
}
If A_ThisHotkey contains >^
{
Control Choose, % tab, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
end:=""
If ctrl_delay
end:=ctrl_tag
ControlSetText Cinta.Edit2, % tag . end " "
If A_ThisHotkey not contains +
return
}
else
{
SendMessage, 0x147, 0, 0, Cinta.Combobox1
stab:=ErrorLevel+1
If (stab<>tab)
{
MsgBox, 262160, Ошибка, Тэг относится к другой секции!, 1.5
return
}
ControlGetText old_tag, Cinta.Edit2
s:=SubStr(old_tag,0)
If (s=" ")
StringTrimRight old_tag, old_tag, 1
ControlSetText Cinta.Edit2, % old_tag " " tag " "
Send {End}
return
}
If start_tag contains $file
{
ControlSetText Cinta.Edit1, % "File: " 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 && link2rem
ControlSetText Cinta.RichEdit2, % add
If ! add && 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,"^\R+","")
If end_note
n_txt:=RegExReplace(n_txt,"s)(" end_note ").+$","")
n_txt:=MaxEmptyString(n_txt,max_empty_str)
ControlSetText Cinta.RichEdit1, % n_txt
If start_tag contains $dict
{
RegExMatch(n_txt,"^.+?(?=(\R| - |\s{3,}|\||;|\{|\(|\[))",term)
term:=RegExReplace(term,"^\s+(?=\w)","")
ControlSetText Cinta.Edit1,% term
StringLeft term, term, 1
StringUpper term, term
StringReplace tag, tag, $dict, % term
ControlSetText Cinta.Edit2, % tag
}
If (clip>0 && n_txt<>"")
{
If (clip=2)
{
Loop parse, n_txt, `n, `r
{
If (A_LoopField="")
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=" ")
StringTrimRight tag, tag, 1
Sleep 100
If (zt && n_txt && A_Index=10)
Send ^{Enter}
IfWinNotActive ahk_class Cinta.ModelessDialog
break
}
return
;--------------------------
3ButtonOK:
Gui 3: Submit
FormatTime DateTime, % DateTime, % t_tree . "/HH:mm"
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,"[^\^\+!>]+$",key)
tab:=tab_%key%
tag:=tag_%key%
f_path:="", start_tag:=tag, zt:=""
If tag contains $cmd,$cmt
{
f_path:=GetPath("ahk_id " source_id)
If !f_path
{
If tag contains $cmt
goto Title
MsgBox, 262160, Ошибка, Путь файла недоступен!, 1.5
Exit
}
SplitPath f_path, , , , $cmd
$cmd:=ValidName($cmd,"_")
StringReplace tag, tag, $cmd, % $cmd
StringReplace tag, tag, $cmt, % $cmd
}
Title:
If tag contains $title,$cmt
{
$title:=ValidName(CleanTitle(source_title),"_")
StringReplace tag, tag, $title, % $title
StringReplace tag, tag, $cmt, % $title
}
WinGet $proc, ProcessName, % "ahk_id " source_id
SplitPath $proc, , , , $proc
StringUpper $proc, $proc, T
StringReplace tag, tag, $proc, % ValidName($proc,"_")
If tag contains $file
{
Clipboard:=""
Send ^{vk43}
ClipWait 2
f_path:=Clipboard
path_exist:=RegExMatch(f_path,"i)[a-z]:\\.+?\.[a-z0-9]{2,4}")
If !path_exist
{
MsgBox, 262160, Ошибка, Путь недоступен!, 1.5
Exit
}
SplitPath f_path, $file
StringReplace tag, tag, $file, % ValidName($file,"_")
}
If tag contains $site
{
If A_Thishotkey contains >^
{
Clipboard:=""
Send ^{Ins}
ClipWait 2
site_text:=Clipboard
Sleep 300
}
Clipboard:=""
Send ^{vk4C}
Sleep 500
Send ^{Ins}
ClipWait 2
site_add:=Clipboard
RegExMatch(site_add,"(?<=//).+?(?=/)",$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="")
{
global
RegExMatch(t,"i)[a-z]:\\.+?\.[a-z0-9]{2,4}",f_path)
title:=f_path
If !title
RegExMatch(t,"i)(?<=\[).+\.[a-z0-9]{2,4}(?=])",title)
If !title
RegExMatch(t,"i)^.+\.[a-z0-9]{2,4}(?= - )",title)
If !title
RegExMatch(t,"i)(?<= - ).+\.[a-z0-9]{2,4}$",title)
SplitPath title, , , ,title
If !title
RegExMatch(t,"^.+(?= - )",title)
If !title
title:=t
If l
{
ln:=StrLen(title)
If (ln>l-3)
{
StringLeft title, title, % l
StringGetPos pos, title,% " ", R
If !Errorlevel
StringLeft title, title, % pos
title:=title "..."
}
}
return title
}
GetPath(title)
{
WinGet pr, ProcessName, % title
Process, Exist, % pr
pid := ErrorLevel
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
If (process.ProcessId = pid)
cmdline := process.CommandLine
If cmdline contains Explorer.exe
cmdline:=""
fp:=RegExMatch(cmdline,"i)[a-z]:\\.*\.[a-z0-9]{2,5}",f_path,6)
return f_path
}
MaxEmptyString(text,max)
{
n:=""
Loop % max+1
n.="`r`n"
text:=RegExReplace(text,"(?<=.)\R{" max+2 ",}(?=.)",n)
return text
}
ValidName(n,r="")
{
n:=RegExReplace(n,"(:|;|,|\*|\?|\\|/|<|>|"")"," ")
n:=RegExReplace(n,"\s+"," ")
StringReplace n, n, |, -, All
If r
StringReplace n, n, % " ", % 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("gdiplus\GdipDisposeImage", UInt, pBitmap)
Shutdown(pToken)
}
BitmapFromScreen(Screen=0, Raster="")
{
if (Screen = 0)
{
Sysget, x, 76
Sysget, y, 77
Sysget, w, 78
Sysget, h, 79
}
else if (SubStr(Screen, 1, 5) = "hwnd:")
{
Screen := SubStr(Screen, 6)
if !WinExist( "ahk_id " Screen)
return -2
WinGetPos,,, w, h, ahk_id %Screen%
x := y := 0
hhdc := GetDCEx(Screen, 3)
}
else if (Screen&1 != "")
{
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 = "") || (y = "") || (w = "") || (h = "")
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 ? "UPtr" : "UInt"
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", Ptr, hBitmap, Ptr, Palette, A_PtrSize ? "UPtr*" : "uint*", pBitmap)
return pBitmap
}
SaveBitmapToFile(pBitmap, sOutput, Quality=75)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
SplitPath, sOutput,,, Extension
if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
return -1
Extension := "." Extension
DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize)
VarSetCapacity(ci, nSize)
DllCall("gdiplus\GdipGetImageEncoders", "uint", nCount, "uint", nSize, Ptr, &ci)
if !(nCount && nSize)
return -2
If (A_IsUnicode){
StrGet_Name := "StrGet"
Loop, %nCount%
{
sString := %StrGet_Name%(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
if !InStr(sString, "*" Extension)
continue
pCodec := &ci+idx
break
}
} else {
Loop, %nCount%
{
Location := NumGet(ci, 76*(A_Index-1)+44)
nSize := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "uint", 0, "int", 0, "uint", 0, "uint", 0)
VarSetCapacity(sString, nSize)
DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "str", sString, "int", nSize, "uint", 0, "uint", 0)
if !InStr(sString, "*" Extension)
continue
pCodec := &ci+76*(A_Index-1)
break
}
}
if !pCodec
return -3
if (Quality != 75)
{
Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality
if Extension in .JPG,.JPEG,.JPE,.JFIF
{
DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, "uint*", nSize)
VarSetCapacity(EncoderParameters, nSize, 0)
DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, "uint", nSize, Ptr, &EncoderParameters)
Loop, % NumGet(EncoderParameters, "UInt") ;%
{
elem := (24+(A_PtrSize ? A_PtrSize : 4))*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6)
{
p := elem+&EncoderParameters-pad-4
NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt")
break
}
}
}
}
if (!A_IsUnicode)
{
nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sOutput, "int", -1, Ptr, 0, "int", 0)
VarSetCapacity(wOutput, nSize*2)
DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sOutput, "int", -1, Ptr, &wOutput, "int", nSize)
VarSetCapacity(wOutput, -1)
if !VarSetCapacity(wOutput)
return -4
E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &wOutput, Ptr, pCodec, "uint", p ? p : 0)
}
else
E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &sOutput, Ptr, pCodec, "uint", p ? p : 0)
return E ? -5 : 0
}
SetBitmapToClipboard(pBitmap)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
off1 := A_PtrSize = 8 ? 52 : 44, off2 := A_PtrSize = 8 ? 32 : 24
hBitmap := CreateHBITMAPFromBitmap(pBitmap)
DllCall("GetObject", Ptr, hBitmap, "int", VarSetCapacity(oi, A_PtrSize = 8 ? 104 : 84, 0), Ptr, &oi)
hdib := DllCall("GlobalAlloc", "uint", 2, Ptr, 40+NumGet(oi, off1, "UInt"), Ptr)
pdib := DllCall("GlobalLock", Ptr, hdib, Ptr)
DllCall("RtlMoveMemory", Ptr, pdib, Ptr, &oi+off2, Ptr, 40)
DllCall("RtlMoveMemory", Ptr, pdib+40, Ptr, NumGet(oi, off2 - (A_PtrSize ? A_PtrSize : 4), Ptr), Ptr, NumGet(oi, off1, "UInt"))
DllCall("GlobalUnlock", Ptr, hdib)
DllCall("DeleteObject", Ptr, hBitmap)
DllCall("OpenClipboard", Ptr, 0)
DllCall("EmptyClipboard")
DllCall("SetClipboardData", "uint", 8, Ptr, hdib)
DllCall("CloseClipboard")
}
BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster="")
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
return DllCall("gdi32\BitBlt"
, Ptr, dDC
, "int", dx
, "int", dy
, "int", dw
, "int", dh
, Ptr, sDC
, "int", sx
, "int", sy
, "uint", Raster ? Raster : 0x00CC0020)
}
CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff)
{
DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", A_PtrSize ? "UPtr" : "UInt", pBitmap, A_PtrSize ? "UPtr*" : "uint*", hbm, "int", Background)
return hbm
}
CreateCompatibleDC(hdc=0)
{
return DllCall("CreateCompatibleDC", A_PtrSize ? "UPtr" : "UInt", hdc)
}
CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
hdc2 := hdc ? hdc : GetDC()
VarSetCapacity(bi, 40, 0)
NumPut(w, bi, 4, "uint")
, NumPut(h, bi, 8, "uint")
, NumPut(40, bi, 0, "uint")
, NumPut(1, bi, 12, "ushort")
, NumPut(0, bi, 16, "uInt")
, NumPut(bpp, bi, 14, "ushort")
hbm := DllCall("CreateDIBSection"
, Ptr, hdc2
, Ptr, &bi
, "uint", 0
, A_PtrSize ? "UPtr*" : "uint*", ppvBits
, Ptr, 0
, "uint", 0, Ptr)
if !hdc
ReleaseDC(hdc2)
return hbm
}
DeleteDC(hdc)
{
return DllCall("DeleteDC", A_PtrSize ? "UPtr" : "UInt", hdc)
}
DeleteObject(hObject)
{
return DllCall("DeleteObject", A_PtrSize ? "UPtr" : "UInt", hObject)
}
GetDC(hwnd=0)
{
return DllCall("GetDC", A_PtrSize ? "UPtr" : "UInt", hwnd)
}
GetDCEx(hwnd, flags=0, hrgnClip=0)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
return DllCall("GetDCEx", Ptr, hwnd, Ptr, hrgnClip, "int", flags)
}
ReleaseDC(hdc, hwnd=0)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
return DllCall("ReleaseDC", Ptr, hwnd, Ptr, hdc)
}
SelectObject(hdc, hgdiobj)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
return DllCall("SelectObject", Ptr, hdc, Ptr, hgdiobj)
}
Startup()
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
if !DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
DllCall("LoadLibrary", "str", "gdiplus")
VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
DllCall("gdiplus\GdiplusStartup", A_PtrSize ? "UPtr*" : "uint*", pToken, Ptr, &si, Ptr, 0)
return pToken
}
Shutdown(pToken)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
DllCall("gdiplus\GdiplusShutdown", Ptr, pToken)
if hModule := DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
DllCall("FreeLibrary", Ptr, hModule)
return 0
}