четверг, 13 октября 2011 г.

Как открыть документ в OpenOffice oowriter сразу на чтение через Nautilus (локальный и удалённый)

Готовой фишки я не видел, поэтому решил написать самостоятельно. В интернете советуют через макросы для oowriter, но, как оказалось, можно и проще. Проверялось на Ubuntu 10.04. На компьютере должен быть установлен perl.

Кому интересен процесс - читаем по порядку, кому нужен результат - идём в конец заметки.
Допустим, у нас есть возможность смотреть .doc*/.odt на чужом компьютере, но нам нужно только смотреть его и не мешать другим редактировать.

Если файл уже редактируется, когда мы его открываем - проблем нет, а если наоборот?

Нужно каким-то образом сразу открывать в режиме "для чтения". В интернете чаще встречаются предложения делать через макросы OOWriter'а - лично для меня эта идея показалась сложной. Да и потом, это будет работать только для редактора текстов - нет расширяемости.
Я решил идти через bash ^).
Собственно, основная идея - передавать нужные файлы в OOWriter через контекстное меню Nautilus'а, благодаря чему можно попросить oowriter открыть файл в режиме read-only. Для этого oowriter располагает опцией командной строки -view.

oowriter -view "имя файла"
Дело за малым, осталось всё это сделать :).

В Nautilus есть возможность подключать собственноручно написанные shell-сценарии, для этого они должны быть расположены в специальном каталоге, который Наутилус покажет сам, если его попросить через "Файл"->"Сценарии"->"Открыть папку сценариев" или через контекстное меню в окне "Сценарии"->"Открыть папку сценариев". В открывшейся папке нужно создать shell-скрипт, имя которого будет показываться в пункте "Сценарии" контекстного меню Наутилуса.
Как только папка откроется, Наутилус тут же выдаст окошко со справкой, в подробностях которой можно узнать, как скрипт, создаваемый в этой папке, будет знать, что ему передаётся.

Опытным путём установлено, что лучше использовать переменную NAUTILUS_SCRIPT_SELECTED_URIS - в ней содержатся имена как локальных, так и удалённых (например, через smb://) файлов.
 NAUTILUS_SCRIPT_SELECTED_URIS: список адресов (URI) выделенных файлов, разделённых переводом строки
Практика показала, что файлы на самом деле разделены пробелами, но это не фатально.
Итак, имена выделенных файлов есть, редактор текстов на чтение вызвать можно - в принципе достаточно. Но хотелось бы работы с файлами, которые просматриваются, например, на сервере, и не хотелось бы случайно их "отредактировать" ненужным образом. Проблема в том, что oowriter не понимает ссылок вида
smb://localhost/%D0%BE%D0%B1%D1%89%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B%D0%B5/%D0%B1%D0%B0%D0%BB%D0%BB%D0%B0%D0%B4%D0%B0%20%D0%BE.doc
 что выражается в том, что он их попросту не открывает, и ни о чём не жалуется. Как будто ничего и не было :).
Казалось, всё становится сложнее, но тут помог просмотр переменных окружения. Выяснилось (кто-то конечно же и раньше знал, а для кого-то это будет очевидно), что Наутилус монтирует каталог, который отображает, в срытых каталогах пользователя:
PWD=$'/home/user/.gvfs/\320\276\320\261\321\211\320\265\320\264\320\276\321\201\321\202\321\203\320\277\320\275\321\213\320\265 \320\275\320\260 localhost'
Отлично, у нас есть полное имя выделенного файла и  есть путь к смонтированному удалённому каталогу. Можно воспользоваться $(basename ...) для определения голого имени файла, склеить его с $PWD и дело с концом, да не тут-то было. Если в наутилусе выбрано отображение в виде списка, то имеющиеся каталоги можно раскрывать. А это значит, что текущий отображаемый каталог (записанный в $PWD) не меняется, равно как и текущий открытый (записанный $NAUTILUS_SCRIPT_CURRENT_URI), из-за чего $NAUTILUS_SCRIPT_SELECTED_URIS отличается от $NAUTILUS_SCRIPT_CURRENT_URI больше чем на имя файла.

Поэтому для корректности нужно выделить эту различающуюся часть и склеить с $PWD - тогда мы получим корректный путь к файлу в локально-подмонтированном каталоге, соответствующему выделенному в наутилусе.

Финал уже виднеется ). Осталось наложить одну примочку - перевести url-закодированные имена файлов типа
%D0%BE%D0%B1%D1%89%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B%D0%B5/%D0%B1%D0%B0%D0%BB%D0%BB%D0%B0%D0%B4%D0%B0%20%D0%BE.doc
к
общедоступные/баллада о.doc
Для чего можно воспользоваться перловым кодом:
perl -MURI::Escape -pe '$_ = uri_unescape($_)'
принимающим на вход закодированное имя.
Ну, вот вроде бы и всё.

 


Скрипт для наутилуса (/home/<username>/.gnome2/nautilus-scripts/):
#!/bin/bash

for f in $NAUTILUS_SCRIPT_SELECTED_URIS; do

       cur_uri=$NAUTILUS_SCRIPT_CURRENT_URI
       l=1

       while [ "${cur_uri#${f:0:$l}}" != "$cur_uri" ]
       do
         (( l = l + 1 ))
       done
       (( l = l - 1 ))

       filename="${f:$l:${#f}}"

       file2open=`echo "${PWD}/${filename}" | perl -MURI::Escape -pe '$_ = uri_unescape($_)'`
#        notify-send "Opening $file2open"
       oowriter -view "$file2open"
done;

Благодарности: cverutin (за помощь в поиске нужной информации :), а также за код url-декодирования )

P.S. с помощью полученного скрипта можно открывать и локальные файлы, не только удалённые :).

Комментариев нет: