/*
*
*/
package org.smartly.packages.htmlparser.impl.vtools;
import org.smartly.Smartly;
import org.smartly.commons.lang.CharEncoding;
import org.smartly.commons.network.URLUtils;
import org.smartly.commons.util.StringUtils;
import org.smartly.packages.htmlparser.impl.HtmlParser;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* HTML Tool.
*
* @author angelo.geminiani
*/
public class HtmlTool {
public static final String NAME = "html";
private static final String DOCTYPE_HTML5 = "<!DOCTYPE html>";
private static final String HEAD_OPEN = "<HEAD>";
private static final String HEAD_CLOSE = "</HEAD>";
private static final String VIEWPORT = "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
private static final String VIEWPORT_TAG = "<meta name=\"viewport\"";
// ------------------------------------------------------------------------
// Variables
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
public HtmlTool() {
}
public String getName() {
return NAME;
}
// ------------------------------------------------------------------------
// p u b l i c
// ------------------------------------------------------------------------
public String charset() {
return getDefaultCharset();
}
public InputStream connect(final String uri) {
try{
return URLUtils.getInputStream(uri);
}catch(Throwable t){
return new ByteArrayInputStream(new byte[0]);
}
}
public HtmlParser open(final String uri) {
return new HtmlParser(uri);
}
/**
* Returns HTML markup as text
*
* @param uri Valid URL
* @return HTML markup as String
*/
public String markup(final String uri) {
final String html = URLUtils.getUrlContent(uri);
return html;
}
public String head(final InputStream is) {
final HtmlParser parser = new HtmlParser(is);
return parser.getHead().outerHtml();
}
public String head(final InputStream is, final String excludeTags) {
final HtmlParser parser = new HtmlParser(is);
final String head = parser.getHead().outerHtml();
if (StringUtils.hasText(excludeTags)) {
return HtmlParser.remove(head, StringUtils.split(excludeTags, ","));
}
return head;
}
public String body(final InputStream is) {
final HtmlParser parser = new HtmlParser(is);
return parser.getBody().outerHtml();
}
public String body(final InputStream is, final String excludeTags) {
final HtmlParser parser = new HtmlParser(is);
final String body = parser.getBody().outerHtml();
if (StringUtils.hasText(excludeTags)) {
return HtmlParser.remove(body, StringUtils.split(excludeTags, ","));
}
return body;
}
public String select(final InputStream is, final String cssQuery) {
final HtmlParser parser = new HtmlParser(is);
return parser.selectAsString(cssQuery);
}
public String select(final InputStream is, final String cssQuery, final String excludeTags) {
final HtmlParser parser = new HtmlParser(is);
final String html_result = parser.selectAsString(cssQuery);
if (StringUtils.hasText(excludeTags)) {
return HtmlParser.remove(html_result, StringUtils.split(excludeTags, ","));
}
return html_result;
}
/**
* @param html String
* @param scripts Text or List. This content will be appended to 'HEAD' tag.
* @return
*/
public String head(final String html, final Object scripts) {
return this.head(html, scripts, true);
}
public String head(final String html, final Object contents, final boolean append) {
// retrieve HTML
String result = html;
if (null != contents) {
int headIndex = -1;
if (append) {
headIndex = this.indexOfHeadClose(result);
} else {
final String headerTag = this.getHeadOpen(result);
if (StringUtils.hasText(headerTag)) {
headIndex = result.indexOf(headerTag) + headerTag.length();
}
}
if (headIndex > -1) {
if (contents instanceof String) {
result = StringUtils.insert((String) contents, headIndex, result);
} else if (contents instanceof List) {
for (final Object script : (List) contents) {
result = StringUtils.insert(script.toString(), headIndex, result);
headIndex = this.indexOfHeadClose(result);
}
}
}
}
return result;
}
// ------------------------------------------------------------------------
// p r i v a t e
// ------------------------------------------------------------------------
private String getHeadOpen(final String html) {
final String lower = html.toLowerCase();
final int start = lower.indexOf("<head ");
if (start > -1) {
final int end = html.indexOf(">", start + 1);
return html.substring(start, end + 1);
}
return "";
}
private int indexOfHeadOpen(final String html) {
final String header = this.getHeadOpen(html);
if (StringUtils.hasText(header)) {
return html.indexOf(header);
}
return -1;
}
private int indexOfHeadClose(final String html) {
int result = html.indexOf(HEAD_CLOSE.toLowerCase());
if (result == -1) {
result = html.indexOf(HEAD_CLOSE);
}
return result;
}
// --------------------------------------------------------------------
// S T A T I C
// --------------------------------------------------------------------
private static String __CHARSET;
private String getDefaultCharset() {
if (null == __CHARSET) {
final String charset = Smartly.getConfiguration().getString("mobilizer.charset");
__CHARSET = StringUtils.hasText(charset) && CharEncoding.isSupported(charset) ? charset : CharEncoding.getDefault();
}
return __CHARSET;
}
}