Статьи

PHP Manual CLI style 2.0

Гарри упомянул удобный маленький phpm около трех лет назад. И Шон Коутс был достаточно любезен, чтобы указать, как его можно заменить на оболочку с одним вкладышем. Разве это не вызывает любовь?

Одна вещь, которую я пропустил с любым из двух, была способность видеть всю ручную запись. Довольно часто руководство содержит полезную информацию (кто бы это знал!), Поэтому я часто использую www.php.net . Или я, пока я не решил что-то сделать с этим. Теперь, написание сценариев оболочки — это не то, на что я потратил большую часть своего времени, так что не без особой гордости я представляю вам phpm два-о-о .

 

Установка его

Вам, очевидно, нужна среда bash для ее запуска (я думаю, что Cygwin подойдет). Кроме того, вам нужно множество инструментов и утилит Cli. Если вы работаете в системе на основе Debian, вам нужно запустить следующее:

#!/bin/bash # phpm # commandline php-manual interface # Kudos to Havard Eide and Sean Coates for the original idea # # author: Troels Knak-Nielsen <[email protected]> # version: 2007-11-27 # # dependencies: # wget sudo apt-get install wget # sed sudo apt-get install sed # tidy sudo apt-get install tidy # xmlstarlet sudo apt-get install xmlstarlet # konwert sudo apt-get install konwert # html2text get from http://www.aaronsw.com/2002/html2text/html2text.py # symlink to ~/bin/html2text # urlencode get from http://www.shelldorado.de/scripts/cmds/urlencode.txt # symlink to ~/bin/urlencode function print_usage { echo "USAGE: phpm <function>" echo "To clear cache: phpm --clear" exit 0 } # create cachedir on first run CACHEDIR=~/.phpm if [ ! -e $CACHEDIR ] then mkdir $CACHEDIR fi if [ $# -gt 0 ] then # parse a few options if [ $1 = "--clear" ] then echo "clearing cache" rm -r $CACHEDIR exit 0 fi if [ $1 = "--help" ] then print_usage fi if [ $1 = "-?" ] then print_usage fi URLNAME=$(echo $1 | urlencode) CACHE_FILENAME=$CACHEDIR/$URLNAME # check cache if [ ! -e $CACHE_FILENAME ] then # fetch from HTTP HREF=http://www.php.net/manual-lookup.php?function=$URLNAME RESPONSE=$(wget --quiet -O - $HREF) if [ $? != 0 ] then echo "HTTP error" 1>&2 exit $? fi # process response # test if function has direct match if echo $RESPONSE | grep -Eiq '<div([^>]*)class="refentry">' then # grap and format output # the first sed collapses blank lines, the second formats headers echo $RESPONSE | tidy -latin1 -asxhtml --input-encoding utf8 --output-xml true --numeric-entities true 2>/dev/null | xmlstarlet select --net --html -t -c "//*[@class='refentry']" 2>/dev/null | tidy -latin1 --input-encoding utf8 -asxhtml 2>/dev/null | konwert utf8-ascii | html2text 2>&1 | sed -n 'G; s/n/&&/; /^([ -~]*n).*n1/d; s/n//; h; P' | sed -e '/^# (.*)$/ { s/^# (.*)/1/p ; s/(.{1,1})/=/g }' -e '/^## (.*)$/ { s/^## (.*)/n1/p ; s/(.{1,1})/-/g }' -e '/^### (.*)$/ { s/^### (.*)/n1/p ; s/(.{1,1})/~/g }' > $CACHE_FILENAME # test if there are any "best" matches elif echo $RESPONSE | grep -Eiq '<a href="/manual/en/function[^>]*><b>' then echo "Best matches for '$1':" > $CACHE_FILENAME echo $RESPONSE | tidy -latin1 -asxhtml --input-encoding utf8 --output-xml true --numeric-entities true --wrap 0 2>/dev/null | sed -n 's/.*<a href="/manual/en/function[^>]*><b>([^<]{1,})<.*/1/p' >> $CACHE_FILENAME # test if there are any "weak" matches elif echo $RESPONSE | grep -Eiq '<a href="/manual/en/function[^>]*>[^<]+' then echo "Possible matches for '$1':" > $CACHE_FILENAME echo $RESPONSE | tidy -latin1 -asxhtml --input-encoding utf8 --output-xml true --numeric-entities true --wrap 0 2>/dev/null | sed -n 's/.*<a href="/manual/en/function[^>]*>[^<]{1,}([^<]{1,})<.*/1/p' >> $CACHE_FILENAME fi fi if [ -e $CACHE_FILENAME ] then cat $CACHE_FILENAME else echo "No matches found for '$1'" exit -1 fi else print_usage fi

Затем получите следующие два сценария:

Сохраните их (без расширения файла) в sudo apt-get install wget sed tidy xmlstarlet konwert

~/bin
chmod +x ~/bin/html2text

(Или вы можете поместить их где-нибудь, например, в chmod +x ~/bin/urlencode

Наконец, сохраните приведенный выше скрипт как ~/scripts~/bin/phpm

использование

Теперь вы сможете найти функцию в руководстве по PHP так же просто, как:

phpm substr

В качестве бонуса вы получите список предложений по несоответствиям. Например:

$ phpm substring
Best matches for 'substring':
is_string
substr

Очень удобно, когда вы помните только часть названия функции.

Сценарий запрашивает документацию на сайте php, поэтому он всегда актуален. Для повышения производительности результаты кэшируются в ~/.phpm Вы всегда можете очистить кеш, вызвав phpm:

phpm --clear

Бонус Emacs

В качестве последнего небольшого бонуса для пользователей Emacs, вот фрагмент для привязки F4 к phpm для текущего слова:

 
(defun php-manual-lookup ()
  "Shows short documentation for the word at the point."
  (interactive)
  (let ((word (current-word t))
        (buffername "*phpm*"))
    (when (get-buffer buffername)
      (kill-buffer buffername))
    (save-excursion
      (pop-to-buffer buffername)
      (shell-command (format "phpm %s"
                             (shell-quote-argument word)) buffername)
      (other-window 1))))
(global-set-key '[f4] 'php-manual-lookup)