UverseWiki

Ссылки

Ссылки задаются парой либо круглых, либо квадратных скобок. Ссылка кроме собственно страницы (локальной, URL, интервики и т. д.) может иметь также и название, которое будет отображаться в тексте вместо голого URL — название, как и в терминах и ассоциативных списках, отделяется от URL либо двойным «равно» ==, либо пробелом, если двойного «равно» не задано.

При ссылках на локальные страницы можно использовать относительные пути как в обычных путях файловых систем:

  • две точки — папка выше;
  • одна точка — текущая папка;
  • прямой или обратный слеш в начале адреса — ссылка на корень сайта (либо документации — зависит от настроек вики-процессора).

Часто «папки» на вики-сайте называют кластерами. В качестве разделителя пути можно использовать любой из слешей (прямой / или обратный \).

  * ((/ Главная страница)).
  * ((.. Содержимое верхнего кластера)).
  * [[..\WackoWiki Highlighters == Подсветчики WackoWiki]].

Естественно, пути на внешних сайтах остаются как есть:
  * ((http://google.com Внешняя ссылка)).
  * [[http://a-site/path\path\ Некий сайт]]

Естественно, пути на внешних сайтах остаются как есть:

Обычно к локальным ссылкам добавляется расширение файла (UWikiSettings->$linkExt). Папки определяются автоматически, и к ним оно не добавляется — но несмотря на это рекомендуется явно показывать, что это кластер, добавив в конец прямой или обратный слеш — особенно это удобно, когда ещё не все разделы созданы и ссылка без слеша в конце будет рассмотрена как ссылка на файл и к нему будет добавлено расширение.

  * ((. Начало раздела));
  * ((..\ Основная секция));
  * ((..\Classes Классы));

Интересная особенность в том, что если путь выходит за границы корневого пути (UWikiFilePager), то даже к папке без слеша в конце будет добавлено расширение — ведь не известно, папка ли это или файл, если они находятся за пределом корня документов:

  * ((../../../../.. Всё выше и выше...));
  * ((../../../../../ А здесь расширение не добавлено)).

В зависимости от темы оформления ссылки на несуществующие страницы и кластеры могут выделяться по-другому:

  * ((Несуществующая_страница));
  * ((некая_страница#якорь));
  * ((Syntax Эта страница существует));
  * ((Syntax#Ссылки Она же, с якорем));
  * ((Несуществующий_кластер/));
  * ((несуществующая:интервики)).

Внутри названия ссылки можно использовать любую строчную вики-разметку:

  * ((. == Содержание //этого// кластера)).
  * [[http://php.net/function.substr %%substr()%%]]

Отменить создание ссылки можно тильдой:

  * ~((Не ссылка)), ~[[тоже не ссылка]].
  * ((Ссылка с названием со ~)) скобками)).
  • ((Не ссылка)), [[тоже не ссылка]].
  • .

Обратите внимание, что при включении документа в другой с помощью Include ссылки на вложенный документ будут скорректированы так, что они будут ссылаться не на его отдельную страницу, а на его включённую копию. Тоже самое касается и якорных ссылок.
Также, относительные ссылки во включённых документах корректируются так, что продолжают ссылаться на правильные страницы — относительно пути включённого, а не родительского, документа.

Якорные ссылки

Якоря ссылаются на конкретное положение на странице вместо ссылки на её верхнюю часть. Задаётся якорь через решётку #. Якорь можно указывать и для внешних, и внутренних адресов. При ссылке на якорь в текущем документе указывать страницу ни к чему — можно сразу начинать с # (см. также Адресация в ссылках). Для внутренних ссылок регистр символов в имени якорей не важен.
Названия для ссылок задаются как обычно — через двойное равно == или пробел.

  * ссылка на раздел "((#Форматтеры форматтеры))" тут же.
  * а вот - на якорь в другом локальном документе:
    ((../Classes/UWikiSettings#Static methods == Статические методы класса %%UWikiSettings%%)).
  * ((http://uverse.i-forge.net/doc/#bottom Внешняя ссылка с якорем))

Обратите внимание, что в зависимости от настройки UWikiSettings->$inlineAnchors поведение якорной ссылки изменяется — она может создавать строчный якорь вместо ссылки на документ, если заглавие ссылки не задано явно — см. раздел о якорях.

Адресация в ссылках

Ссылки могут указывать на внешний ресурс (когда указан протокол, например http://google.com) или на внутренний. Для обоих типов адресации существую свои правила адресации:

Интервики и цифрови́ки

Оба понятния обозначают краткие имена для адресации — вроде ярлыков на файлы. Интервики и цифрови́ки задаются в ссылке вместо адреса.

  * ((go:UverseWiki Искать UverseWiki в Гугле));
  * ((ВП:wiki==Спросить о "вики" у Википедии));
  * ((Codenet:#4444 Сообщение №4444 на CodeNet.ru)).

Итак, интервики-адрес состоит двух частей, разделённых двоеточием: слева — краткое имя ресурса, справо — собственно поисковая фраза или запрос. С цифрови́ки тоже самое, только разделитель — :#, после которого идёт номер сообщения или ещё какой-то идентификатор (обязательно цифра).
В остальном синтаксис тот же, что и при зщадании ссылок.

Интервики задаются в файле interwiki.conf, а цифрови́ки — в numberlinks.conf.

Внешние ссылки

Внешние ссылки — это URL, содержащие имя протокола, например: http://i-forge.net, file:///usr/local/etc/svn-repos. Для внешних ссылок, в отличии от внутренних, существует всего два правила генерации автозаглавия, если оно не было задано в ссылке явно:

  1. Получением его из тега <title> для удалённых HTML-страниц;
  2. Подстановкой имени домена: ((http://not-existing-domain.net))[not-existing-domain.net].

((#fetchRemoteTitles Автозаглавие из <title>

При не заданном явно отображаемом названии для вики-ссылки и если включена настройка UWikiSettings->$fetchRemoteTitles (по умолчанию включена), вики-процессор попытается получить удалённый документ и прочитать заглавие из его тега <title>, расположенном внутри тега <head>.

Если сервер отправит Content-Type в заголовках ответа, а также если установлен модуль iconv для PHP, то будет произведена конверсия заглавия в UTF-8. Если одно из условий не выполнено, iconv() вернула ошибку а также если полученное заглавие не находится в UTF-8, то этот метод не срабатывает и используются другие способы генерации автоназвания.

Вики-процессор будет читать не более первых 4-х Кб удалённой страницы (значение по умолачнию настройки UWikiSettings->$fetchRemoteTitlesMaxSize) — если <title> не был найден в этом интервале либо тег <head> закрылся, этот метод определения не срабатывает.

Примеры:

  * ((http://google.com))
  * ((http://uverse.i-forge.net))
  * ((http://not-existing-domain.net))
  * ((http://www.google.ru/intl/en_com/images/srpr/logo1w.png))

Внутренние ссылки

Компоненты ссылки

Локальные ссылки имеют три части (возьмём для примера адрес форум:99#1.1-2):

  • интервики — часть пути ссылки от его начала до первого двоеточия («:»). В нашем примере это «форум».
  • путь — часть пути ссылки после первого двоеточия (разделитель интервики), либо от её начала если интервики не задана, и до первого знака «#» (разделитель якоря). В нашем примере это «99».
  • якорь — часть пути ссылки после первого знака «#» и до её конца. В нашем примере это «1.1-2».

Любой компонент ссылки может отсутствовать, хотя по крайней мере один всегда задан. Примеры:

((гугл:поиск))              - задана интервики "гугл" и путь "поиск".
Наш ((форум:))              - задана только интервики "форум" без пути.
((/Главная#начало))         - задан путь "/Главная" и якорь "начало".

Кроме этого, ссылки могут содержать название, которое отделяется от собственно пути (страницы, на которую ссылаются) либо знаком двойного равно (==), либо пробелом, если такого знака нет. Если нет ни ==, ни пробела, ссылка считается заданной с пустым заглавием. Тоже самое происходит, если знак == стоит в конце ссылки и он не экранирован тильдой:

((гугл:поиск))              - пустое заглавие.
((гугл:поиск заглавие))     - заглавие указано, разделитель - пробел.
((гугл:поисковая фраза==))  - пустое заглавие.
См. ((Имя документа == здесь))  - пробелы вокруг "==" игнорируются.

Разделитель - двойное равно (==), путь ссылки - "поисковая фраза":
((гугл:поисковая фраза==название))

Автозаглавие

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

Заданное явно заглавие не изменяется и отображается как есть; пустое заглавие включает механизм автоподстановки:

…по частям пути

Пути локальных ссылок имеют 3 компонентаинтервики, путь и якорь. Каждый из них может отсутствовать, но как минимум один всегда есть.

При автоподстановке названия берётся самая значимая заданная часть пути ссылки и используется как отображаемое заглавие для неё.

Значимость частей пути в порядке убывания следующая:

  1. Якорь — если задан якорь, то он используется как название: ((Документ#якорь)) эквивалентно написанию ((Документ#якорь якорь)) или ((Документ#якорь==якорь)).
  2. Путь — если ссылка указывает на документ, то берётся его имя (либо по его заглавию, если он не часть интервики, либо имя его файла); если ссылка указывает на кластер, то либо заглавие кластера, либо последний компонент кластера.
    • примеры: ((ссылка/на/страницу))((ссылка/на/страницу==страницу)); ((ссылка/на/кластер/))((ссылка/на/страницу/кластер/==кластер)).
  3. Интервики — наконец, если ни якорь, ни путь не определены, то берётся имя интервики (без двоеточия за ним): ((гугл:)) эквивалентно ((гугл: гугл)) или ((гугл:==гугл)).

…по заглавию документа

При ссылках на локальный вики-документ (страницу или кластер) можно не указывать название для ссылки — в этом случае оно будет прочитано из документа (его заглавие), либо из заглавия файла-огловления кластера (см. This {{Action}} has wrong syntax and can't be executed.).

Этот метод работает только для существующих и доступных (по правам доступа) документов — если это не так, либо документ/оглавление не содержит заглавия, то используются другие способы получения автоназвания для ссылки.

Примеры:

  * ((Markers)), ((Line breaks==)) - по заглавию страницы.
  * ((.)), ((/Blog)) - по заглавию кластера.
  * ((Несуществующая_страница)), ((Неизвестный_формат.rar)).

…заменой окончания

Как часто вам приходилось два раза писать имя страницы целиком и только менять окончание в её названии? Что ж, мы с этим встречались достаточно, поэтому добавили возможность быстрой замены окончания в ссылке (на интервики, страницу или якорь — см. компоненты ссылки) без повторного ввода всего её названия-пути.

Для английского и других языков, мало использующих окончания, эта проблема практически не стоит, а вот в русском окончания меняются в зависимости от фразы, то есть почти всегда будут отличаться от утвердительной формы, используемой в заголовке или якоре.
В самом деле, не писать же на английский манер вместо См. раздел о ((якорях)) что-то вроде См. раздел "((Якори))" из-за того, что надоедает каждый раз писать ((якори якорях)).

Замена окончания делается с помощью значка «плюс» (+), поставленного внутри адреса. Проще всего его поведение объяснить на примерах:

  * См. раздел о ((#якор+и))ях.
    - Идентично написанию "...о ((#якори якорях))."
  * На нашей ((стен+а))е чего только не понаписано...
    - Идентично "На нашей ((стена стене))..."
  * Давайте ((игра+))ть!
    - Эквивалентно "Давайте ((игра играть))!"
  * Стреляйте, братец, там ваш ((враг+и)).
    - Тоже самое, что и "...ваш ((враги враг))."
  * ((#Якор+я))ная ссылка.
  * Ссылка на раздел с ((функция+:))ми.
    - Тоже самое, что и "...с ((функция: функциями))."
  • См. раздел о якорях.
    • Идентично написанию «…о якорях
  • На нашей стене чего только не понаписано…
    • Идентично «На нашей стене…»
  • Давайте играть!
  • Стреляйте, братец, там ваш враг.
    • Тоже самое, что и «…ваш враг
  • Якорная ссылка.
  • Ссылка на раздел с функциями.
    • Тоже самое, что и «…с функциями

Схематично это выглядит так: ((ссылка+окончание_ссылки))окончание_названия. Указано может быть либо окончание ссылки, либо названия, либо оба, но не ни одного. Кроме этого, окончание заменяется не обязательно в последнем слове — это может быть любое слово:

Это указано в описании ((Функци+и обработки строк))й.
- эквивалентно "((Функции обработки строк==Функций обработки строк))".

Это указано в описании обработки строкй. — эквивалентно «Функций обработки строк».

Слишком длинные окончания игнорируются во избежание ложных срабатываний — зависит от настройки UWikiSettings->$longestLinkEnding, по-умолчанию 3 символа. Наличие нескольких неэкранированных плюсиков также приводит к его игнорированию для всей ссылки:

  * рабочая ссылка с заменённым ((окончание+))м;
  * тоже рабочая ссылка с ((оконча+ние))м;
  * а у этой окончание уже не распознано: ((оконч+ание))м;
  * тоже самое здесь: ((окончание+))мммм.
  * ((Од+ин дв+а))три.

Замена окончаний работает только для внутренних адресов и ссылок без явно указанных названий:

  * ((http://google.co+m));
  * ((Ссылка Заголово+к)).
  * ((Ссылка == Заголово+к)).

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

  * ((Ссыл+ка==Ссылка));
  * ((Ссылка+ Ссылка)) - пробел также разделяет адрес и название;
  * ((Нек~+ая ссылк+а==))и.
  * ((Нек~+ая ссылка==)) - а здесь и так всего один плюсик.