All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sweble.wikitext.engine.PageTitle Maven / Gradle / Ivy

Go to download

A minimal engine using the Sweble Wikitext Parser to process articles in the context of a MediaWiki-like configuration.

There is a newer version: 3.1.9
Show newest version
/**
 * Copyright 2011 The Open Source Research Group,
 *                University of Erlangen-Nürnberg
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.sweble.wikitext.engine;

import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.sweble.wikitext.engine.config.Interwiki;
import org.sweble.wikitext.engine.config.Namespace;
import org.sweble.wikitext.engine.config.WikiConfig;
import org.sweble.wikitext.engine.config.WikiConfigurationException;
import org.sweble.wikitext.engine.utils.UrlService;
import org.sweble.wikitext.parser.parser.LinkTargetException;
import org.sweble.wikitext.parser.parser.LinkTargetParser;

public class PageTitle
		implements
			Serializable
{
	private static final long serialVersionUID = 1L;
	
	// =========================================================================
	
	private final WikiConfig config;
	
	// =========================================================================
	
	private final String title;
	
	private final String fragment;
	
	private final Namespace namespace;
	
	private final String namespaceAlias;
	
	private final Interwiki interwiki;
	
	private final boolean initialColon;
	
	// =========================================================================
	
	private final boolean isDefaultNs;
	
	// =========================================================================
	
	/**
	 * Returns the normalized title (" " replaced by "_").
	 */
	public String getTitle()
	{
		return title;
	}
	
	public String getFragment()
	{
		return fragment;
	}
	
	public Namespace getNamespace()
	{
		return namespace;
	}
	
	/**
	 * Returns the name of the namespace that was specified by the user. If an
	 * alias or the canonical name was used, the alias or cannonical name is
	 * returned. The alias or name as specified in the configuration is
	 * returned, which might differ in case from what the user specified.
	 */
	public String getNamespaceAlias()
	{
		if (namespaceAlias == null)
			return namespace.getName();
		return namespaceAlias;
	}
	
	public Interwiki getInterwikiLink()
	{
		return interwiki;
	}
	
	public boolean isLocal()
	{
		return interwiki == null;
	}
	
	public boolean isInterwiki()
	{
		return !isLocal();
	}
	
	public boolean hasInitialColon()
	{
		return initialColon;
	}
	
	/**
	 * Get the full title:
	 * 
	 * 
	 * "[IW_PREFIX:][NS_PREFIX:]TITLE"
	 * 
* * The TITLE itself will be in de-normalized form ("_" replaced by " "). */ public String getDenormalizedFullTitle() { String result = ""; if (interwiki != null) result += interwiki.getPrefix() + ":"; if (namespace != null && !isDefaultNs) result += getNamespaceAlias() + ":"; result += getDenormalizedTitle(); return result; } /** * Returns the de-normalized title ("_" replaced by " "). */ public String getDenormalizedTitle() { return title.replace('_', ' '); } /** * Get title string suitable for links: * *
	 * "[IW_PREFIX:][NS_PREFIX:]TITLE"
	 * 
* * The TITLE itself will be in normalized form (" " replaced by "_"). */ public String getNormalizedFullTitle() { String result = ""; if (interwiki != null) result += interwiki.getPrefix() + ":"; if (namespace != null && !isDefaultNs) result += getNamespaceAlias() + ":"; result += title; return result; } // ========================================================================= public URL getUrl() { if (this.interwiki != null) { return this.interwiki.getUrl(this); } else { try { return UrlService.makeUrlToArticle(this.config.getArticlePath(), this); } catch (MalformedURLException e) { /* This should not happen: If the URL is correctly formatted, * appending a title must not cause a MalformedURLException. */ throw new WikiConfigurationException(e); } } } public URL getUrl(String urlEncodedQuery) throws MalformedURLException { return (urlEncodedQuery != null) ? UrlService.appendQuery(getUrl(), urlEncodedQuery) : getUrl(); } public URL getUrl(Map query) throws MalformedURLException { return (query != null && !query.isEmpty()) ? UrlService.appendQuery(getUrl(), query) : getUrl(); } // ========================================================================= public PageTitle getBaseTitle() { if (!namespace.isCanHaveSubpages()) return this; int i = title.lastIndexOf('/'); if (i < 0) return this; String baseTitle = title.substring(0, i); return new PageTitle( config, baseTitle, null, namespace, namespaceAlias, interwiki, initialColon, isDefaultNs); } // ========================================================================= public PageTitle newWithNamespace(Namespace ns) { return new PageTitle( config, title, fragment, ns, null, interwiki, initialColon, ns.equals(config.getDefaultNamespace())); } public PageTitle newWithTitle(String title) { return new PageTitle( config, title, fragment, namespace, namespaceAlias, interwiki, initialColon, isDefaultNs); } // ========================================================================= protected PageTitle( WikiConfig config, String title, String fragment, Namespace namespace, String namespaceAlias, Interwiki interwiki, boolean initialColon, boolean isDefaultNs) { this.config = config; this.title = title; this.fragment = fragment; this.namespace = namespace; this.namespaceAlias = namespaceAlias; this.interwiki = interwiki; this.initialColon = initialColon; this.isDefaultNs = isDefaultNs; } public static PageTitle make( WikiConfig config, String target) throws LinkTargetException { return make(config, target, null); } public static PageTitle make( WikiConfig config, String target, Namespace defaultNamespace) throws LinkTargetException { // FIXME: Review the implementation! LinkTargetParser parser = new LinkTargetParser(); parser.parse(config.getParserConfig(), target); String title = parser.getTitle(); String fragment = parser.getFragment(); boolean initialColon = parser.isInitialColon(); Namespace namespace = null; if (parser.getNamespace() != null) namespace = config.getNamespace(parser.getNamespace()); if (namespace == null) { namespace = defaultNamespace; if (namespace == null) namespace = config.getDefaultNamespace(); } // If it's an alias, convert to the exact alias name. String namespaceAlias = null; if (namespace != null && parser.getNamespace() != null) { String lcNs = parser.getNamespace().toLowerCase(); if (!lcNs.equals(namespace.getName())) { for (String a : namespace.getAliases()) { if (lcNs.equals(a.toLowerCase())) { namespaceAlias = a; break; } } } } Interwiki interwiki = config.getInterwiki(parser.getInterwiki()); // TODO: MediaWiki limits the length of title names // Don't capitalize the first letter of a interwiki link if (interwiki == null) title = StringUtils.capitalize(title); // TODO: MediaWiki normalizes IPv6 titles boolean isDefaultNs = namespace.equals(config.getDefaultNamespace()); return new PageTitle( config, title, fragment, namespace, namespaceAlias, interwiki, initialColon, isDefaultNs); } // ========================================================================= @Override public String toString() { return getDenormalizedFullTitle(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((fragment == null) ? 0 : fragment.hashCode()); result = prime * result + (initialColon ? 1231 : 1237); result = prime * result + ((interwiki == null) ? 0 : interwiki.hashCode()); result = prime * result + (isDefaultNs ? 1231 : 1237); result = prime * result + ((namespace == null) ? 0 : namespace.hashCode()); result = prime * result + ((title == null) ? 0 : title.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PageTitle other = (PageTitle) obj; if (fragment == null) { if (other.fragment != null) return false; } else if (!fragment.equals(other.fragment)) return false; if (initialColon != other.initialColon) return false; if (interwiki == null) { if (other.interwiki != null) return false; } else if (!interwiki.equals(other.interwiki)) return false; if (isDefaultNs != other.isDefaultNs) return false; if (namespace == null) { if (other.namespace != null) return false; } else if (!namespace.equals(other.namespace)) return false; if (title == null) { if (other.title != null) return false; } else if (!title.equals(other.title)) return false; return true; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy