mirror of https://github.com/kurisufriend/Clover
parent
a14b407bf9
commit
8b7982fe41
@ -0,0 +1,248 @@ |
|||||||
|
/* |
||||||
|
* Clover - 4chan browser https://github.com/Floens/Clover/
|
||||||
|
* Copyright (C) 2014 Floens |
||||||
|
* |
||||||
|
* This program is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
package org.floens.chan.core.site.parser; |
||||||
|
|
||||||
|
import android.graphics.Typeface; |
||||||
|
import android.text.SpannableString; |
||||||
|
import android.text.style.StrikethroughSpan; |
||||||
|
import android.text.style.StyleSpan; |
||||||
|
import android.text.style.TypefaceSpan; |
||||||
|
|
||||||
|
import org.floens.chan.core.model.Post; |
||||||
|
import org.floens.chan.core.model.PostLinkable; |
||||||
|
import org.floens.chan.ui.span.AbsoluteSizeSpanHashed; |
||||||
|
import org.floens.chan.ui.span.ForegroundColorSpanHashed; |
||||||
|
import org.floens.chan.ui.theme.Theme; |
||||||
|
import org.jsoup.nodes.Element; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class StyleRule { |
||||||
|
public enum Color { |
||||||
|
INLINE_QUOTE, |
||||||
|
QUOTE |
||||||
|
} |
||||||
|
|
||||||
|
public static StyleRule tagRule(String tag) { |
||||||
|
return new StyleRule().tag(tag); |
||||||
|
} |
||||||
|
|
||||||
|
private String tag; |
||||||
|
private List<String> classes; |
||||||
|
|
||||||
|
private List<Action> actions = new ArrayList<>(); |
||||||
|
|
||||||
|
private Color color = null; |
||||||
|
private boolean strikeThrough = false; |
||||||
|
private boolean bold = false; |
||||||
|
private boolean monospace = false; |
||||||
|
private int size = 0; |
||||||
|
|
||||||
|
private PostLinkable.Type link = null; |
||||||
|
|
||||||
|
private boolean nullify = false; |
||||||
|
private boolean linkify = false; |
||||||
|
|
||||||
|
private String justText = null; |
||||||
|
|
||||||
|
public StyleRule tag(String tag) { |
||||||
|
this.tag = tag; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public String tag() { |
||||||
|
return tag; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule cssClass(String cssClass) { |
||||||
|
if (classes == null) { |
||||||
|
classes = new ArrayList<>(4); |
||||||
|
} |
||||||
|
classes.add(cssClass); |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule action(Action action) { |
||||||
|
actions.add(action); |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule color(Color color) { |
||||||
|
this.color = color; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule link(PostLinkable.Type link) { |
||||||
|
this.link = link; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule strikeThrough() { |
||||||
|
strikeThrough = true; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule bold() { |
||||||
|
bold = true; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule monospace() { |
||||||
|
monospace = true; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule size(int size) { |
||||||
|
this.size = size; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule nullify() { |
||||||
|
nullify = true; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule linkify() { |
||||||
|
linkify = true; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public StyleRule just(String justText) { |
||||||
|
this.justText = justText; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean highPriority() { |
||||||
|
return classes != null && !classes.isEmpty(); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean applies(Element element) { |
||||||
|
if (classes == null || classes.isEmpty()) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
for (String c : classes) { |
||||||
|
if (element.hasClass(c)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public CharSequence apply(Theme theme, |
||||||
|
PostParser.Callback callback, |
||||||
|
Post.Builder post, |
||||||
|
CharSequence text, |
||||||
|
Element element) { |
||||||
|
if (nullify) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
if (justText != null) { |
||||||
|
return justText; |
||||||
|
} |
||||||
|
|
||||||
|
CharSequence result = text; |
||||||
|
for (Action action : actions) { |
||||||
|
result = action.execute(theme, callback, post, text, element); |
||||||
|
} |
||||||
|
|
||||||
|
List<Object> spansToApply = new ArrayList<>(2); |
||||||
|
|
||||||
|
if (color != null) { |
||||||
|
spansToApply.add(new ForegroundColorSpanHashed(getColor(theme, color))); |
||||||
|
} |
||||||
|
|
||||||
|
if (strikeThrough) { |
||||||
|
spansToApply.add(new StrikethroughSpan()); |
||||||
|
} |
||||||
|
|
||||||
|
if (bold) { |
||||||
|
spansToApply.add(new StyleSpan(Typeface.BOLD)); |
||||||
|
} |
||||||
|
|
||||||
|
if (monospace) { |
||||||
|
spansToApply.add(new TypefaceSpan("monospace")); |
||||||
|
} |
||||||
|
|
||||||
|
if (size != 0) { |
||||||
|
spansToApply.add(new AbsoluteSizeSpanHashed(size)); |
||||||
|
} |
||||||
|
|
||||||
|
if (link != null) { |
||||||
|
PostLinkable pl = new PostLinkable(theme, result, result, link); |
||||||
|
post.addLinkable(pl); |
||||||
|
spansToApply.add(pl); |
||||||
|
} |
||||||
|
|
||||||
|
if (!spansToApply.isEmpty()) { |
||||||
|
result = applySpan(result, spansToApply); |
||||||
|
} |
||||||
|
|
||||||
|
if (linkify) { |
||||||
|
CommentParserHelper.detectLinks(theme, post, result.toString(), new SpannableString(result)); |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
private int getColor(Theme theme, Color color) { |
||||||
|
switch (color) { |
||||||
|
case INLINE_QUOTE: |
||||||
|
return theme.inlineQuoteColor; |
||||||
|
case QUOTE: |
||||||
|
return theme.quoteColor; |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
private SpannableString applySpan(CharSequence text, List<Object> spans) { |
||||||
|
SpannableString result = new SpannableString(text); |
||||||
|
int l = result.length(); |
||||||
|
|
||||||
|
for (Object span : spans) { |
||||||
|
if (span != null) { |
||||||
|
result.setSpan(span, 0, l, 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public interface Action { |
||||||
|
CharSequence execute(Theme theme, |
||||||
|
PostParser.Callback callback, |
||||||
|
Post.Builder post, |
||||||
|
CharSequence text, |
||||||
|
Element element); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue