Markup spec/BNF/Links

From MediaWiki.org

Jump to: navigation, search

This page references elements defined in Markup spec/BNF/Fundamental elements and Markup spec/BNF/Article title

Internal and external links work fundamentally differently in MediaWiki, and should likely be treated separately. --Brion VIBBER 04:08, 29 May 2006 (UTC)
Do you mean to separate out their definitions, or to remove the <link> element and add its current definition wherever it would otherwise be used? I think it makes logical sense to keep the top-level <link> definition, but I have separated out the definitions, which I hope will aid clarity. --HappyDog 13:46, 29 May 2006 (UTC)

Contents

[edit] Link definitions

[edit] Top level definition

<link>			::= <internal-link> | <external-link>

[edit] Internal links

<internal-link>		::= <internal-link-start> <article-link>  [ "#" <section-id> ] [ <pipe> [<link-description>] ] <internal-link-end> [<extra-description>]
 
/* Parser actually considers namespace and subpages to just be part of the article-title, and deals with them later. */
<article-link>		::= [<interwiki-prefix> | ":" ] [<namespace-prefix] <article-title>
 
/* if subpages: */
/* not properly fleshed out, haven not tried all the combinations */
<article-link>          ::= [<interwiki-prefix> | ":"] [<namespace-prefix] <article-title>
                         | "/" <article-title>
                         | { "../" } [<article-title>]
 
<article-title>         ::= { [<title-legal-chars> | "%" ] } +
 
/* Specified using regex format, obviously... */
<title-legal-chars>     ::= " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+" - ":"
 
 
<interwiki-prefix>	::= <interwiki> ":"
<interwiki>		::= STRING_FROM_DB
 
<namespace-prefix>	::= [<namespace>] ":"
<namespace>		::= STRING_FROM_CONFIG
/* is it? parser.php gives it as  "[_0-9A-Za-z\x80-\xff]" */
 
<link-description>	::= LEGAL_ARTICLE_ENTITY
<extra-description>	::= <letter> [<extra-description>]
 
<internal-link-start>	::= "[["
<internal-link-end>	::= "]]"
 
<pipe>			::= "|"
 
/* Almost anything seems to be allowed, but it won't necessarily be treated as an actual section title */
<section-id>            ::= { [<title-legal-chars> | "%" | "#" ] } +
Remarks
Logically, internal-link should be matched in preference to external-link, as that's how the current parser does it. However, the current parser also explicitly checks for an accidental match of an external link in an inside link (that is, [[http://foo.com]]) and converts it back to an external link.
if (preg_match('/^\b(?:' . wfUrlProtocols() . ')/', $m[1])) { $s .= $prefix . '[[' . $line ; continue; }

[edit] Categories

In the current parser, categories are just a mildly special case of an internal link. But to the user they seem quite different, and the final behaviour is very different. So let's treat them specially.

(* section-ids are technically tolerated currently. but they do nothing and aren't used. *)
(* similarly a pipe without a sort key is technically tolerated but isn't useful. *)
<category>		::= <internal-link-start> <category-namespace> ":" <article-title> [ <pipe> <sort-key> ] <internal-link-end>

<category-namespace>    ::= NS_CATEGORY
(* set in languages/messages/MessagesXx.php. By default, "Category" *)

(* <article-title> specified above. for a category, it's possibly more restrictive. *)
(* other bits specified above. *)

Remarks
A link *to* a category is handled by internal-link above.

[edit] Rendering

A category link produces no inline text. However, the fact of the link (with possible manual sort key) is stored, and possibly rendered by the skin.

[edit] External links

<external-link>		::= <external-link-start> <url> [<whitespace>] [<link-description>] <external-link-end> 
			    | <url>
 
<url>			::= <protocol> <url-path>
<protocol>		::= ALLOWED_PROTOCOL_FROM_CONFIG (e.g. "http://", "mailto:")
<url-path>		::= <url-char> [<url-path>]
<url-char>		::= LEGAL_URL_ENTITY
 
<external-link-start>	::= "["
<external-link-end>	::= "]"

[edit] Transformations

[edit] Internal link to HTML

URL = <a href=$1?title=$2$3"$4 title="$2">$5$6</a>

Where

if <interwiki> is blank
  $1 = internal variable $wgScript
else
  $1 = looked up in DB, based on value of <interwiki>
$2 = <namespace-prefix> <article-link>
If destination page exists
  $3 = "&amp;action=edit"
  $4 = " class="new""
else
  $3 and $4 are blank
If <description> is blank
  $5 = <article-link>
else
  $5 = <description>
$6 = <extra-description>
Personal tools