/*
* Copyright 1998-2016 Linux.org.ru
* 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 ru.org.linux.util.bbcode;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
import ru.org.linux.util.bbcode.tags.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class DefaultParserParameters implements ParserParameters{
/**
* Множество тэгов которое содержат или текст или себе подобных
*/
private final static ImmutableSet<String> INLINE_TAGS = ImmutableSet.of(
"b", "i", "u", "s", "em", "strong", "url", "url2", "user", "br", "text", "softbr", "inline"
);
/**
* Множество тэгов которым разрешено присутствовать в тэге url с параметром, вида [url=http://some]....[/url]
*/
private final static ImmutableSet<String> URL_TAGS = ImmutableSet.of("b", "i", "u", "s", "strong", "text");
/**
* Множество тэгов которые могут содержать любые тэги
*/
private final static ImmutableSet<String> BLOCK_LEVEL_TAGS = ImmutableSet.of(
"p", "quote", "list", "pre", "code", "div", "cut"
);
/**
* Все тэги из INLINE_TAGS и BLOCK_LEVEL_TAGS
*/
private final static ImmutableSet<String> FLOW_TAGS = new Builder<String>()
.addAll(INLINE_TAGS)
.addAll(BLOCK_LEVEL_TAGS)
.build();
/**
* Тэги внутри которых работает автовыделение ссылок
*/
private final static ImmutableSet<String> AUTO_LINK_TAGS = ImmutableSet.of(
"b", "i", "u", "s", "em", "strong", "p", "quote", "div", "cut", "pre", "*"
);
/**
* Разрешенные параметры для тэга list
*/
private final static ImmutableSet<String> ALLOWED_LIST_PARAMS = ImmutableSet.of("A", "a", "I", "i", "1");
/**
* Тэги внутри которых не работает двойной перевод строк
*/
private final static ImmutableSet<String> DISALLOWED_PARAGRAPH_TAGS = ImmutableSet.of("pre", "url", "user", "code");
/**
* Тэги внутри которых двойной перенос не работает и остается
* двойным переносом
*/
private final static ImmutableSet<String> PARAGRAPHED_TAGS = ImmutableSet.of("pre", "code");
/**
* Хэш соответствия имя тэга -> класс тэга
*/
private final ImmutableMap<String, Tag> allTagsDict;
/**
* Множество всех имен тэгов
*/
private final ImmutableSet<String> allTagsNames;
public DefaultParserParameters() {
List<Tag> allTags = new ArrayList<>();
{ // <br/>
HtmlEquivTag tag = new HtmlEquivTag("br", ImmutableSet.<String>of(), "p", this, "br");
tag.setSelfClosing(true);
//tag.setDiscardable(true);
allTags.add(tag);
}
{ // <br/>, but can adapt during render ?
SoftBrTag tag = new SoftBrTag(ImmutableSet.<String>of(), this);
tag.setSelfClosing(true);
tag.setDiscardable(true);
allTags.add(tag);
}
{ // <b>
HtmlEquivTag tag = new HtmlEquivTag("b", INLINE_TAGS, "p", this, "b");
allTags.add(tag);
}
{ // <i>
HtmlEquivTag tag = new HtmlEquivTag("i", INLINE_TAGS, "p", this, "i");
allTags.add(tag);
}
{ // <u> TODO Allert: The U tag has been deprecated in favor of the text-decoration style property.
HtmlEquivTag tag = new HtmlEquivTag("u", INLINE_TAGS, "p", this, "u");
allTags.add(tag);
}
{ // <s> TODO Allert: The S tag has been deprecated in favor of the text-decoration style property.
HtmlEquivTag tag = new HtmlEquivTag("s", INLINE_TAGS, "p", this, "s");
allTags.add(tag);
}
{ // <em>
HtmlEquivTag tag = new HtmlEquivTag("em", INLINE_TAGS, "p", this, "em");
allTags.add(tag);
}
{ // <strong>
HtmlEquivTag tag = new HtmlEquivTag("strong", INLINE_TAGS, "p", this, "strong");
allTags.add(tag);
}
{ // <a>
UrlTag tag = new UrlTag(ImmutableSet.of("text"), this);
allTags.add(tag);
}
{ // <a> специальный случай с парамтром
UrlWithParamTag tag = new UrlWithParamTag(URL_TAGS, this);
allTags.add(tag);
}
{ // <a> member
MemberTag tag = new MemberTag(ImmutableSet.of("text"), this);
allTags.add(tag);
}
{ // <p>
HtmlEquivTag tag = new HtmlEquivTag("p", FLOW_TAGS, null, this, "p", ImmutableSet.of("div", "list", "quote", "cut"));
allTags.add(tag);
}
{ // <div>
HtmlEquivTag tag = new HtmlEquivTag("div", BLOCK_LEVEL_TAGS, null, this, "");
allTags.add(tag);
}
{ // <blockquote>
QuoteTag tag = new QuoteTag(BLOCK_LEVEL_TAGS, this);
allTags.add(tag);
}
{ // <ul>
ListTag tag = new ListTag(ImmutableSet.of("*", "softbr"), this);
allTags.add(tag);
}
{ // <pre>
HtmlEquivTag tag = new HtmlEquivTag("pre", INLINE_TAGS, "div", this, "pre");
allTags.add(tag);
}
{ // <pre class="code">
CodeTag tag = new CodeTag("code", INLINE_TAGS, "div", this);
allTags.add(tag);
}
{
InlineTag tag = new InlineTag(INLINE_TAGS, this);
allTags.add(tag);
}
{ // [cut]
CutTag tag = new CutTag(BLOCK_LEVEL_TAGS, this);
allTags.add(tag);
}
{ // <li>
LiTag tag = new LiTag(FLOW_TAGS, this);
allTags.add(tag);
}
ImmutableMap.Builder<String, Tag> dictBuilder = ImmutableMap.builder();
for (Tag tag : allTags) {
if (!"text".equals(tag.getName())) {
dictBuilder.put(tag.getName(), tag);
}
}
allTagsDict = dictBuilder.build();
Builder<String> allTagsBuilder = new Builder<>();
for (Tag tag : allTags) {
allTagsBuilder.add(tag.getName());
}
allTagsNames = allTagsBuilder.build();
}
@Override
public Set<String> getAllowedListParameters() {
return ALLOWED_LIST_PARAMS;
}
@Override
public Set<String> getBlockLevelTags() {
return BLOCK_LEVEL_TAGS;
}
@Override
public Map<String, Tag> getAllTagsDict() {
return allTagsDict;
}
@Override
public Set<String> getAllTagsNames() {
return allTagsNames;
}
@Override
public Set<String> getAutoLinkTags() {
return AUTO_LINK_TAGS;
}
@Override
public Set<String> getDisallowedParagraphTags() {
return DISALLOWED_PARAGRAPH_TAGS;
}
@Override
public Set<String> getParagraphedTags() {
return PARAGRAPHED_TAGS;
}
}