/*
* WPCleaner: A tool to help on Wikipedia maintenance tasks.
* Copyright (C) 2013 Nicolas Vervelle
*
* See README.txt file for licensing information.
*/
package org.wikipediacleaner.api.data;
import org.wikipediacleaner.api.constants.EnumCaseSensitiveness;
import org.wikipediacleaner.api.constants.EnumWikipedia;
/**
* Class containing information about a category link ([[category:name|sort]]).
*/
public class PageElementCategory extends PageElement {
public final static String DEFAULT_NAME = "Category";
private final String categoryNotTrimmed;
private final String category;
private final String nameNotTrimmed;
private final String name;
private final String sortNotTrimmed;
private final String sort;
/**
* Analyze contents to check if it matches a language link.
*
* @param wikipedia Wikipedia.
* @param contents Contents.
* @param index Block start index.
* @return Block details it there's a block.
*/
public static PageElementCategory analyzeBlock(
EnumWikipedia wikipedia, String contents, int index) {
// Verify arguments
if (contents == null) {
return null;
}
// Look for '[['
int tmpIndex = index;
if ((tmpIndex >= contents.length()) ||
(!contents.startsWith("[[", tmpIndex))) {
return null;
}
tmpIndex += 2;
int beginIndex = tmpIndex;
// Possible white spaces characters
while ((tmpIndex < contents.length()) && (contents.charAt(tmpIndex) == ' ')) {
tmpIndex++;
}
// Search for :
while ((tmpIndex < contents.length()) &&
(contents.charAt(tmpIndex) != ':') &&
(contents.charAt(tmpIndex) != '|') &&
(contents.charAt(tmpIndex) != ']') &&
(contents.charAt(tmpIndex) != '[')) {
tmpIndex++;
}
if ((tmpIndex >= contents.length()) || (contents.charAt(tmpIndex) != ':')) {
return null;
}
// Check that name space is a category
int colonIndex = tmpIndex;
Namespace categoryNS = wikipedia.getWikiConfiguration().getNamespace(Namespace.CATEGORY);
if (!categoryNS.isPossibleName(contents.substring(beginIndex, colonIndex).trim())) {
return null;
}
// Search for |
while ((tmpIndex < contents.length()) &&
(contents.charAt(tmpIndex) != '|') &&
(contents.charAt(tmpIndex) != ']')) {
tmpIndex++;
}
if (tmpIndex >= contents.length()) {
return null;
}
String categoryName = contents.substring(colonIndex + 1, tmpIndex);
// Simple language tag [[lang:link]]
if (contents.charAt(tmpIndex) == ']') {
if (!contents.startsWith("]]", tmpIndex)) {
return null;
}
return new PageElementCategory(
index, tmpIndex + 2,
contents.substring(beginIndex, colonIndex),
categoryName, categoryNS.getCaseSensitiveness(), null);
}
// Find elements of image
int endIndex = contents.indexOf("]]", colonIndex);
if (endIndex < 0) {
return null;
}
return new PageElementCategory(
index, endIndex + 2,
contents.substring(beginIndex, colonIndex),
categoryName, categoryNS.getCaseSensitiveness(),
contents.substring(tmpIndex + 1, endIndex));
}
public String getCategory() {
return category;
}
public String getCategoryNotTrimmed() {
return categoryNotTrimmed;
}
public String getName() {
return name;
}
public String getNameNotTrimmed() {
return nameNotTrimmed;
}
public String getSort() {
return sort;
}
public String getSortNotTrimmed() {
return sortNotTrimmed;
}
private PageElementCategory(
int beginIndex, int endIndex,
String category, String name,
EnumCaseSensitiveness caseSensitive,
String sort) {
super(beginIndex, endIndex);
this.categoryNotTrimmed = category;
this.category = (category != null) ? caseSensitive.normalize(category.trim()) : null;
this.nameNotTrimmed = name;
this.name = (name != null) ? name.trim() : null;
this.sortNotTrimmed = sort;
this.sort = (sort != null) ? sort.trim() : null;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[[");
sb.append(categoryNotTrimmed);
sb.append(':');
if (nameNotTrimmed != null) {
sb.append(nameNotTrimmed);
}
if (sortNotTrimmed != null) {
sb.append('|');
sb.append(sortNotTrimmed);
}
sb.append("]]");
return sb.toString();
}
/**
* Create a category.
*
* @param wiki Wiki.
* @param category Category name.
* @param sortKey Sort key.
* @return Category.
*/
public static String createCategory(
EnumWikipedia wiki,
String category, String sortKey) {
StringBuilder sb = new StringBuilder();
sb.append("[[");
Namespace categoryNamespace = wiki.getWikiConfiguration().getNamespace(Namespace.CATEGORY);
sb.append(categoryNamespace.getTitle());
sb.append(":");
sb.append(category);
if (sortKey != null) {
sb.append("|");
sb.append(sortKey.trim());
}
sb.append("]]");
return sb.toString();
}
}