1 (изменено: DD, 2015-03-01 15:02:59)

Тема: AHK: Расстановка навигации в HTML-файлах

Взялся написать скрипт расстановки возможностей переходов к следующему/предыдущему файлу, и к файлу индекса в HTML-файлах, обрабатывающим имена не только с цифрами, но и с буквенным текстом. План следующий наметился:

— получить все имена htm|html-файлов из директории; вписать после открывающего <BODY[^>]*> и перед закрывающим </BODY> (хотя не обязательно — можно однократно вписывать через FileAppend в конец файла) следующий HTML-код с переходами по файлам, в соответствии с полученным списком:

<table border="0" cellspacing="0" cellpadding="1" width="100%" align="center"><tr>
<td align="left"><a href="--back--.html" target="_self">back</a></td>
<td><p align="center"><a href="index.html" target="_self">index</a></td>
<td align="right"><a href="--next--.html" target="_self">next</a></td>
</tr></table>

Также представился и такой вариант действий: в первый раз вставить после <BODY[^>]*>

</tr></table>

Затем получить список, сместить его каким-то образом на одну строку вверх (так что строка со следующим файлом оказывается наравне с предыдущим) и последовательно вставить:

<td align="right"><a href="--NEXT--.html" target="_self">next</a></td>

С индексом милое дело, идёт как есть:

<td><p align="center"><a href="index.html" target="_self">index</a></td>

Снова получаем список и теперь смещаем его на строку вниз, так что файл поравняется со строкой из списка — на предыдущий файл. Заносим после <BODY[^>]*> со ссылкой на предыдущий:

<td align="left"><a href="--BACK--.html" target="_self">back</a></td>

И заключительная:

<table border="0" cellspacing="0" cellpadding="1" width="100%" align="center"><tr>

Ну что сказать: первый шаг проделал уверенно


   ;...
   Loop, %Fldr_Path%\*.html , 0, 1
   {
      list .= A_LoopFileLongPath "`n"
   }
   Sort, list
   ;...
return

но на втором призадумался, так что и до сих пор думаю . Может кого-нибудь видит решение, как смещать полученный список выше-ниже и совмещать с файлами директории?

2

Re: AHK: Расстановка навигации в HTML-файлах

Вероятно, мало кто понял, что Вы хотите. Что значит смещать полученный список? Это вопрос по HTML или по AutoHotkey? По координатам или по сортировке или по чередованию строк?

3

Re: AHK: Расстановка навигации в HTML-файлах

Имелось в виду смещать полученные строки относительно файлов в каталоге. Т.е. например в каталоге файлы расположены одним образом, а полученный список смещается относительно них — другим (выше-ниже). Так что там, где в каталоге такой-то файл, по списку с ним поравняется следующий или предыдущий.

4

Re: AHK: Расстановка навигации в HTML-файлах

Вроде бы понял, несмотря на то, что в первом сообщении падежи не согласованы.
В цикле чтения файлов копируйте значение переменной "A_LoopFileName" в свою переменную, часть имени которой можно взять из текущего "A_Index".
По окончанию цикла чтения файлов в "A_Index" будет храниться число файлов.

5 (изменено: DD, 2015-03-02 13:28:32)

Re: AHK: Расстановка навигации в HTML-файлах

ypppu пишет:

несмотря на то, что в первом сообщении падежи не согласованы.

Интересно, в какой цитате?)) Зная Ваше бережное отношение к русскому языка, вполне допускаю ошибку у себя.

ypppu пишет:

В цикле чтения файлов копируйте значение переменной "A_LoopFileName" в свою переменную, часть имени которой можно взять из текущего "A_Index".
По окончанию цикла чтения файлов в "A_Index" будет храниться число файлов.

Но ведь эффекта смещения относительно файлов из папки это не даст, а нужен своего рода параллельный список, производящий вставки из смещенного списка к файлам каталога.

6

Re: AHK: Расстановка навигации в HTML-файлах

"скрипт ... обрабатывающим"?

7

Re: AHK: Расстановка навигации в HTML-файлах

Очень подошел бы код, позволяющий составлять следующие списки. Например, в каталоге лежат файлы:


D:\ss2\первый-файл-каталога.htm
D:\ss2\второй-файл-каталога.htm
D:\ss2\третий-файл-каталога.htm
D:\ss2\четвертый-файл-каталога.htm
D:\ss2\пятый-файл-каталога.htm
D:\ss2\шестой-файл-каталога.htm

Получив этот список, предполагается двинуть его на одну строку вверх и свести с изначальным списком следующим образом:


FileAppend, второй-файл-каталога.htm, D:\ss2\первый-файл-каталога.htm
FileAppend, третий-файл-каталога.htm, D:\ss2\второй-файл-каталога.htm
FileAppend, четвертый-файл-каталога.htm, D:\ss2\третий-файл-каталога.htm
FileAppend, пятый-файл-каталога.htm, D:\ss2\четвертый-файл-каталога.htm
FileAppend, шестой-файл-каталога.htm, D:\ss2\пятый-файл-каталога.htm

а у шестого файла нет следующего и поэтому он пропускается

Т.е., в каждый файл добавляется имя следующего из директории, что позволит переходить из одного HTML-файла в следующий. Соответственно в первой колонке файлы без первой строки, а во второй без последней.

8

Re: AHK: Расстановка навигации в HTML-файлах

DD пишет:

"скрипт ... обрабатывающим"?

Да, оно.


Но ведь эффекта смещения относительно файлов из папки это не даст

Зато у Вас появится ряд переменных вида file%n%

file1 := "D:\ss2\первый-файл-каталога.htm"
file2 := "D:\ss2\второй-файл-каталога.htm"
file3 := "D:\ss2\третий-файл-каталога.htm"
file4 := "D:\ss2\четвертый-файл-каталога.htm"
file5 := "D:\ss2\пятый-файл-каталога.htm"
file6 := "D:\ss2\шестой-файл-каталога.htm"

Теперь можно производить с ними любые манипуляции.

9 (изменено: DD, 2015-03-02 14:50:03)

Re: AHK: Расстановка навигации в HTML-файлах

Всё-таки это не решает задачи сведения списков, т.к. переменные file1,file2,file3 и тд. располагаются на одной строке с соответствующими им файлами из каталога, а нужно что-то типа такого:


file2 := D:\ss2\первый-файл-каталога.htm
file3 := "D:\ss2\второй-файл-каталога.htm"
file4 := "D:\ss2\третий-файл-каталога.htm"
file5 := "D:\ss2\четвертый-файл-каталога.htm"
file6 := "D:\ss2\пятый-файл-каталога.htm"

10

Re: AHK: Расстановка навигации в HTML-файлах

Если я правильно понял...

#Persistent
#SingleInstance, Force

file1 := "D:\ss2\первый-файл-каталога.htm"
file2 := "D:\ss2\второй-файл-каталога.htm"
file3 := "D:\ss2\третий-файл-каталога.htm"
file4 := "D:\ss2\четвертый-файл-каталога.htm"
file5 := "D:\ss2\пятый-файл-каталога.htm"
file6 := "D:\ss2\шестой-файл-каталога.htm"
; file_number := A_Index
file_number := 6



Loop, % file_number - 1
{
next := A_Index+1, file%A_Index% := file%next%
}
ListVars

Вы что, делаете web-сервер на движке AutoHotkey?

11 (изменено: DD, 2015-03-03 03:43:23)

Re: AHK: Расстановка навигации в HTML-файлах

ypppu, в коде Вы вроде используете готовый параллельный список, а предполагалось его составление, т.е. что-то вроде этого, зацените моё творение (я шёл доступными мне другими путями)))) —


^vk51::     ;CTRL + Q для запуска в каталоге с HTM-файлами
   gosub, GetExplPath

   Loop, %File_Path%\*.htm , 0, 1
   {
      list1 .= A_LoopFileLongPath "`n"
   }
   list1=%list1%
   list2=%list1%
   StringReplace, list1, list1, `n, `|`n, All
   StringReplace, list2, list2, `n, ###`n, All
   all = %list1%%list2%
   Sort, all
   all := RegExReplace(all, "U)(^.*\R)")                   ; удал перв строку
   all := RegExReplace(all, "m`a)^.*\\(.*)###(`n)|^\R", "FileAppend, $1$2") ; отрез пути
   StringReplace, all, all, `|`n, `|, All
   StringReplace, all, all, `,, ```,, All
   all := RegExReplace(all, "m`a)^(.*)\|(.*)", "$2, $1") ; отрез пути
   all := RegExReplace(all, "(`n`, \w:.*$)", "`n")       ; удал послед строку

   msgbox % all
list1 =
list2 =
all =
return



GetExplPath:
    File_Path := GetExplorerPath()
Return
GetExplorerPath() {
  hWnd := WinExist("A")
  WinGetClass wClass, ahk_id %hWnd%
    currentDir := GetWindowsExplorerPath(hWnd)     ;Explorer_GetPath()
  Return %currentDir%
}

GetWindowsExplorerPath(_hWnd) 
{ 
   local pid, hMem, pv, pidl, pidl_, explorerPath 
   If (A_OSType = "WIN32_NT") 
   { 
      pid := DllCall("GetCurrentProcessId") 
      SendMessage 0x400 + 12, pid, 0,, ahk_id %_hWnd% 
      hMem := ErrorLevel 
      if (hMem != 0) 
      { 
         pv := DllCall("Shell32\SHLockShared", "UInt", hMem, "UInt", pid) 
         if (pv != 0) 
         { 
            pidl := DllCall("Shell32\ILClone", "UInt", pv) 
            DllCall("Shell32\SHUnlockShared", "UInt", pv) 
         } 
         DllCall("Shell32\SHFreeShared", "UInt", hMem, "UInt", pid) 
      } 
   } 
   Else ; Win9x 
   { 
      SendMessage 0x400 + 12, 0, 0, , ahk_id %_hWnd% 
      pidl_ := ErrorLevel 
      if (pidl_ != 0) 
      { 
         pidl := DllCall("Shell32\ILClone", "UInt", pidl_) 
         DllCall("Shell32\ILGlobalFree", "UInt", pidl_) 
      } 
   } 
   VarSetCapacity(explorerPath, 512, 0) 
   DllCall("Shell32\SHGetPathFromIDList" (A_IsUnicode ?"W":"A"), "UInt", pidl, "Str", explorerPath) 
   Return explorerPath 
}
Return

Тут название следующего файла добавляется в текст предыдущего.

12

Re: AHK: Расстановка навигации в HTML-файлах

Я в 4-ом сообщении написал, как можно запросто получить ряд переменных, содержащих перечень файлов. В DllCall что-то не хочется нырять.

13

Re: AHK: Расстановка навигации в HTML-файлах

Очень возможно, но я не ухватываю, как там сводить списки.

14

Re: AHK: Расстановка навигации в HTML-файлах

Что значит "сводить списки"?

15 (изменено: DD, 2015-03-03 15:39:47)

Re: AHK: Расстановка навигации в HTML-файлах

Чтобы строки со следующими файлами, шли в строку с предыдущими (или наоборот), как по действию кода из 11 поста.

16

Re: AHK: Расстановка навигации в HTML-файлах

Мне так вообще ничего непонятно.
Нужен пример с исходными файлами и что в итоге надо получить.

17

Re: AHK: Расстановка навигации в HTML-файлах

Если я правильно понял задачу, то как-то так:

^vk51::     ;CTRL + Q для запуска в каталоге с HTM-файлами
   File_Path := GetActiveFolderPath()

   list := PrevPath := ""
   Loop, %File_Path%\*.htm
   {
      if A_Index != 1
         list .= (list = "" ? "" : "`n") . "FileAppend, " . A_LoopFileName . ", " . PrevPath
      PrevPath := A_LoopFileLongPath
   }

   MsgBox, % list
   Return

GetActiveFolderPath()
{
   hActiveHwnd := WinExist("A")
   for item in ComObjCreate("Shell.Application").Windows
      if (hActiveHwnd = item.hwnd)
         Return item.Document.Folder.Self.Path
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder
+ DD

18

Re: AHK: Расстановка навигации в HTML-файлах

Когда запускал, не ожидал виденное увидеть))) Спасибо тебе!

19

Re: AHK: Расстановка навигации в HTML-файлах

А возможна ли рекурсия в подпапки, чтобы при этом программа не рассматривала весь список с подфайлами в качестве единого, а поочередно заглядывая в папки и подпапки, дописывала бы результат по содержанию каждой из них в один определенный файл?

Т.е. например папка содержит:


D:\dir\001.htm
D:\dir\002.htm
D:\dir\003.htm
D:\dir\004.htm
D:\dir\005.htm
D:\dir\006.htm

Её подпапка содержит:


D:\dir\sub\001.htm
D:\dir\sub\002.htm
D:\dir\sub\003.htm
D:\dir\sub\004.htm
D:\dir\sub\005.htm
D:\dir\sub\006.htm

А содержание файла, в который собираются результаты, был бы таким:


FileAppend, 002.htm, D:\dir\001.htm
FileAppend, 003.htm, D:\dir\002.htm
FileAppend, 004.htm, D:\dir\003.htm
FileAppend, 005.htm, D:\dir\004.htm
FileAppend, 006.htm, D:\dir\005.htm
FileAppend, 007.htm, D:\dir\006.htm
FileAppend, 002.htm, D:\dir\sub\001.htm
FileAppend, 003.htm, D:\dir\sub\002.htm
FileAppend, 004.htm, D:\dir\sub\003.htm
FileAppend, 005.htm, D:\dir\sub\004.htm
FileAppend, 006.htm, D:\dir\sub\005.htm
FileAppend, 007.htm, D:\dir\sub\006.htm

20

Re: AHK: Расстановка навигации в HTML-файлах

Loop, D:\test\*.txt, 0, 1
{
   if (A_LoopFileDir != Dir)
      msgbox, novaja papka
   Dir := A_LoopFileDir
   msgbox % A_LoopFileLongPath
}

21 (изменено: DD, 2015-03-07 14:52:03)

Re: AHK: Расстановка навигации в HTML-файлах

Всё-таки, как не кручу, а мозаика не складывается. Как это должно быть на конкретном примере, например, том, что ниже? От кода нашего teadrinker'а пришлось отказаться, пот что некоторые моменты не удавалось задействовать. Внимание: код реально меняет HTML докУменты, добавляя в конец каждого переходы на следующий/предыдущий. Кодировка файлов должна быть ANSI:


#SingleInstance Force

^vk51::     ;CTRL + Q для запуска в каталоге (БЕЗ ПОДКАТАЛОГОВ) с HTM-файлами
   File_Path := GetActiveFolderPath()

   FileDelete, %a_desktop%\HTM_NAV.AHK

   Loop, %File_Path%\*.htm*
   {
      list1 .= A_LoopFileLongPath "`n"
   }
   back1=%list1%
   back2=%list1%
   next1=%list1%
   next2=%list1%

;==========================================================================
   StringReplace, back1, back1, `n, :::`n, All
   allback = %back1%%back2%
   Sort, allback
   allback := RegExReplace(allback, "U)(^.*\R)")                     ; удал перв строку
   StringReplace, allback, allback, `,, ```,, All
   StringReplace, allback, allback, `%, ```%, All
   allback := RegExReplace(allback, "m`a)^.*\\(.*):::(`n)|^\R", "FileAppend, <table  border=""0"" cellspacing=""0"" cellpadding=""1"" width=""100```%"" align=""center""><tr>``r``n<td align=""left""><a href=""$1"" target=""_self"">&larr;</a></td>``r``n`, ")   ; отрез пути
   StringReplace, allback, allback, :::`n, `,%a_space%, All
   allback := RegExReplace(allback, "m`a).*?, $")                    ; удал послед строку

   FileAppend % allback, %a_desktop%\HTM_NAV.AHK, UTF-8
;==========================================================================

   StringReplace, next1, next1, `n, `|`n, All
   StringReplace, next2, next2, `n, :::`n, All
   allnext = %next1%%next2%
   Sort, allnext
   allnext := RegExReplace(allnext, "U)(^.*\R)")                   ; удал перв строку
   StringReplace, allnext, allnext, `,, ```,, All
   StringReplace, allnext, allnext, `%, ```%, All
   allnext := RegExReplace(allnext, "m`a)^.*\\(.*):::(`n)|^\R", "FileAppend, <td align=""right""><a href=""$1"" target=""_self"">&rarr;</a></td>``r``n</tr></table>``r``n$2") ; отрез пути
   StringReplace, allnext, allnext, `|`n, `|, All
   allnext := RegExReplace(allnext, "m`a)^(.*)\|(.*)", "$2, $1") ; отрез пути
   allnext := RegExReplace(allnext, "(`n`, \w:.*$)", "`n")       ; удал послед строку

   ;в первом файле перед первым next - чтобы открывалась таблица:
   allnext = :%allnext%
   StringReplace, allnext, allnext, :FileAppend`, <td align="right, FileAppend`, <table  border="0" cellspacing="0" cellpadding="1" width="100```%" align="center"><tr>``r``n<td align="right, All

   FileAppend % allnext, %a_desktop%\HTM_NAV.AHK, UTF-8
;==========================================================================

   sleep 1000
   Run, %a_desktop%\HTM_NAV.AHK

   list1 =
   back1 =
   back2 =
   allback =
   next1 =
   next2 =
   allnext =
return

GetActiveFolderPath()
{
   hActiveHwnd := WinExist("A")
   for item in ComObjCreate("Shell.Application").Windows
      if (hActiveHwnd = item.hwnd)
         Return item.Document.Folder.Self.Path
}

22

Re: AHK: Расстановка навигации в HTML-файлах

Напиши на абстрактном примере, что имеешь и что хочешь получить.
А иначе вряд ли кто-то поможет.
Типа: имею 3 файла.

1.txt
1stroka1
1stroka2
1stroka3

2.txt
2stroka1
2stroka2
2stroka3

3.txt
3stroka1
3stroka2
3stroka3

Хочу получить:

4.txt

1stroka1
1stroka2
1stroka3
2stroka1
2stroka2
2stroka3
3stroka1
3stroka2
3stroka3

23

Re: AHK: Расстановка навигации в HTML-файлах

Скрипт из моего предыдущего поста по горячей клавише обрабатывает файлы активной папки без подкаталогов, а не худо бы, чтоб файлы и из подпапок обрабатывал.

24

Re: AHK: Расстановка навигации в HTML-файлах

А чем не устроил код из 20 сообщения?

Loop, D:\test\*.txt, 0, 1
{
   if (A_LoopFileDir != Dir)
      n++
   a%n% .= A_LoopFileLongPath "`n"
   Dir := A_LoopFileDir
}
loop %n%
   msgbox % a%A_Index%

25

Re: AHK: Расстановка навигации в HTML-файлах

Любезный Мальцев, а можно показать на примере кода из №21 сообщения, потому что пробовал подставлять, но это не работает?

26

Re: AHK: Расстановка навигации в HTML-файлах

Не проверял.

#SingleInstance Force

^vk51::     ;CTRL + Q для запуска в каталоге (БЕЗ ПОДКАТАЛОГОВ) с HTM-файлами
   File_Path := GetActiveFolderPath()

   FileDelete, %a_desktop%\HTM_NAV.AHK
   n = 0
   Loop, %File_Path%\*.htm, 0, 1
  {
      if (A_LoopFileDir != Dir)
      n++
      list%n% .= A_LoopFileLongPath "`n"
      Dir := A_LoopFileDir
   }
   loop %n%
   {
   back1 := back2 := next1 := next2 := list%A_Index%


;==========================================================================
   StringReplace, back1, back1, `n, :::`n, All
   allback = %back1%%back2%
   Sort, allback
   allback := RegExReplace(allback, "U)(^.*\R)")                     ; удал перв строку
   StringReplace, allback, allback, `,, ```,, All
   StringReplace, allback, allback, `%, ```%, All
   allback := RegExReplace(allback, "m`a)^.*\\(.*):::(`n)|^\R", "FileAppend, <table  border=""0"" cellspacing=""0"" cellpadding=""1"" width=""100```%"" align=""center""><tr>``r``n<td align=""left""><a href=""$1"" target=""_self"">&larr;</a></td>``r``n`, ")   ; отрез пути
   StringReplace, allback, allback, :::`n, `,%a_space%, All
   allback := RegExReplace(allback, "m`a).*?, $")                    ; удал послед строку

   FileAppend % allback, %a_desktop%\HTM_NAV.AHK, UTF-8
;==========================================================================

   StringReplace, next1, next1, `n, `|`n, All
   StringReplace, next2, next2, `n, :::`n, All
   allnext = %next1%%next2%
   Sort, allnext
   allnext := RegExReplace(allnext, "U)(^.*\R)")                   ; удал перв строку
   StringReplace, allnext, allnext, `,, ```,, All
   StringReplace, allnext, allnext, `%, ```%, All
   allnext := RegExReplace(allnext, "m`a)^.*\\(.*):::(`n)|^\R", "FileAppend, <td align=""right""><a href=""$1"" target=""_self"">&rarr;</a></td>``r``n</tr></table>``r``n$2") ; отрез пути
   StringReplace, allnext, allnext, `|`n, `|, All
   allnext := RegExReplace(allnext, "m`a)^(.*)\|(.*)", "$2, $1") ; отрез пути
   allnext := RegExReplace(allnext, "(`n`, \w:.*$)", "`n")       ; удал послед строку

   ;в первом файле перед первым next - чтобы открывалась таблица:
   allnext = :%allnext%
   StringReplace, allnext, allnext, :FileAppend`, <td align="right, FileAppend`, <table  border="0" cellspacing="0" cellpadding="1" width="100```%" align="center"><tr>``r``n<td align="right, All

   FileAppend % allnext, %a_desktop%\HTM_NAV.AHK, UTF-8
;==========================================================================

   sleep 1000
   RunWait, %a_desktop%\HTM_NAV.AHK
   FileDelete, %a_desktop%\HTM_NAV.AHK
   list1 =
   back1 =
   back2 =
   allback =
   next1 =
   next2 =
   allnext =
}
return

GetActiveFolderPath()
{
   hActiveHwnd := WinExist("A")
   for item in ComObjCreate("Shell.Application").Windows
      if (hActiveHwnd = item.hwnd)
         Return item.Document.Folder.Self.Path
}
+ DD

27

Re: AHK: Расстановка навигации в HTML-файлах

Malcev пишет:

Не проверял.

Я проверил: работает как часы)) Большое спасибо.