// Path: src/com/noticeditorteam/noticeditor/io/IOUtil.java
// public final class IOUtil {
// 
//     private static final int FILENAME_LIMIT = 60;
// 
//     public static String readContent(File file) throws IOException {
//         return stringFromStream(new FileInputStream(file));
//     }
// 
//     public static void writeContent(File file, String content) throws IOException {
//         try (OutputStream os = new FileOutputStream(file);
//              Writer writer = new OutputStreamWriter(os, "UTF-8")) {
//             writer.write(content);
//         }
//     }
// 
//     public static void writeContent(File file, byte[] content) throws IOException {
//         try (OutputStream os = new FileOutputStream(file)) {
//             os.write(content);
//         }
//     }
// 
//     public static void writeJson(File file, JSONObject json) throws IOException, JSONException {
//         try (OutputStream os = new FileOutputStream(file);
//              Writer writer = new OutputStreamWriter(os, "UTF-8")) {
//             json.write(writer);
//         }
//     }
// 
//     public static void removeDirectory(File directory) {
//         if (directory.isFile() || !directory.exists())
//             return;
//         removeDirectoryHelper(directory);
//     }
// 
//     private static void removeDirectoryHelper(File file) {
//         if (file.isDirectory()) {
//             for (File f : file.listFiles()) {
//                 removeDirectoryHelper(f);
//             }
//         }
//         file.delete();
//     }
// 
//     public static String sanitizeFilename(String name) {
//         if (name == null || name.isEmpty())
//             return "empty";
// 
//         String newName = name;
//         // Quick transliteration
//         newName = Junidecode.unidecode(newName);
//         // Convert non-ascii chars to char code
//         try {
//             newName = URLEncoder.encode(newName, "UTF-8");
//         } catch (UnsupportedEncodingException ex) {
//         }
//         // Allow only english chars, numbers and some specific symbols
//         newName = newName.toLowerCase().replaceAll("[^a-z0-9._\\(\\)]", "_");
//         // Limit filename length
//         if (newName.length() > FILENAME_LIMIT) {
//             newName = newName.substring(0, FILENAME_LIMIT);
//         }
//         return newName;
//     }
// 
//     public static InputStream toStream(String content) throws IOException {
//         return toStream(content, "UTF-8");
//     }
// 
//     public static InputStream toStream(String content, String charset) throws IOException {
//         return new ByteArrayInputStream(content.getBytes(charset));
//     }
// 
//     public static String stringFromStream(InputStream stream) throws IOException {
//         return stringFromStream(stream, "UTF-8");
//     }
// 
//     public static String stringFromStream(InputStream stream, String charset) throws IOException {
//         final ByteArrayOutputStream result = new ByteArrayOutputStream();
//         copy(stream, result);
//         stream.close();
//         return result.toString("UTF-8");
//     }
// 
//     public static boolean isResourceExists(String resource) {
//         try (InputStream is = IOUtil.class.getResourceAsStream(resource)) {
//             return is != null;
//         } catch (IOException ioe) {
//             return false;
//         }
//     }
// 
//     public static List<String> linesFromResource(String resource) {
//         return linesFromResource(resource, "UTF-8");
//     }
// 
//     public static List<String> linesFromResource(String resource, String charset) {
//         try (InputStream is = IOUtil.class.getResourceAsStream(resource)) {
//             return linesFromStream(is, charset);
//         } catch (IOException ioe) {
//             return Collections.emptyList();
//         }
//     }
// 
//     public static List<String> linesFromStream(InputStream stream) throws IOException {
//         return linesFromStream(stream, "UTF-8");
//     }
// 
//     public static List<String> linesFromStream(InputStream stream, String charset) throws IOException {
//         if (stream == null) return Collections.emptyList();
//         try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, charset))) {
//             return reader.lines().collect(Collectors.toList());
//         }
//     }
// 
//     public static byte[] download(String url) throws IOException {
//         final ByteArrayOutputStream result = new ByteArrayOutputStream();
//         try (InputStream is = new URL(url).openStream()) {
//             copy(is, result);
//         }
//         return result.toByteArray();
//     }
// 
//     public static void copy(InputStream is, OutputStream os) throws IOException {
//         final int bufferSize = 8192;
//         final byte[] buffer = new byte[bufferSize];
//         int readed;
//         while ((readed = is.read(buffer, 0, bufferSize)) != -1) {
//             os.write(buffer, 0, readed);
//         }
//     }
// }


import com.noticeditorteam.noticeditor.io.IOUtil;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.jsoup.safety.Whitelist;
package com.noticeditorteam.noticeditor.io.importers;


/**
 * Load page from Internet, insert scripts, styles, images directly to html.
 *
 * @author Naik
 */
public class WebImporter extends HtmlImporter {

    private final Map<String, String> cache = new HashMap<>();

    @Override
    protected String cleanHtml(String url, Whitelist whitelist) throws Exception {
        String html;
        if (cache.containsKey(url)) {
            html = cache.get(url);
        } else {
// Path: src/com/noticeditorteam/noticeditor/io/IOUtil.java
// public final class IOUtil {
// 
//     private static final int FILENAME_LIMIT = 60;
// 
//     public static String readContent(File file) throws IOException {
//         return stringFromStream(new FileInputStream(file));
//     }
// 
//     public static void writeContent(File file, String content) throws IOException {
//         try (OutputStream os = new FileOutputStream(file);
//              Writer writer = new OutputStreamWriter(os, "UTF-8")) {
//             writer.write(content);
//         }
//     }
// 
//     public static void writeContent(File file, byte[] content) throws IOException {
//         try (OutputStream os = new FileOutputStream(file)) {
//             os.write(content);
//         }
//     }
// 
//     public static void writeJson(File file, JSONObject json) throws IOException, JSONException {
//         try (OutputStream os = new FileOutputStream(file);
//              Writer writer = new OutputStreamWriter(os, "UTF-8")) {
//             json.write(writer);
//         }
//     }
// 
//     public static void removeDirectory(File directory) {
//         if (directory.isFile() || !directory.exists())
//             return;
//         removeDirectoryHelper(directory);
//     }
// 
//     private static void removeDirectoryHelper(File file) {
//         if (file.isDirectory()) {
//             for (File f : file.listFiles()) {
//                 removeDirectoryHelper(f);
//             }
//         }
//         file.delete();
//     }
// 
//     public static String sanitizeFilename(String name) {
//         if (name == null || name.isEmpty())
//             return "empty";
// 
//         String newName = name;
//         // Quick transliteration
//         newName = Junidecode.unidecode(newName);
//         // Convert non-ascii chars to char code
//         try {
//             newName = URLEncoder.encode(newName, "UTF-8");
//         } catch (UnsupportedEncodingException ex) {
//         }
//         // Allow only english chars, numbers and some specific symbols
//         newName = newName.toLowerCase().replaceAll("[^a-z0-9._\\(\\)]", "_");
//         // Limit filename length
//         if (newName.length() > FILENAME_LIMIT) {
//             newName = newName.substring(0, FILENAME_LIMIT);
//         }
//         return newName;
//     }
// 
//     public static InputStream toStream(String content) throws IOException {
//         return toStream(content, "UTF-8");
//     }
// 
//     public static InputStream toStream(String content, String charset) throws IOException {
//         return new ByteArrayInputStream(content.getBytes(charset));
//     }
// 
//     public static String stringFromStream(InputStream stream) throws IOException {
//         return stringFromStream(stream, "UTF-8");
//     }
// 
//     public static String stringFromStream(InputStream stream, String charset) throws IOException {
//         final ByteArrayOutputStream result = new ByteArrayOutputStream();
//         copy(stream, result);
//         stream.close();
//         return result.toString("UTF-8");
//     }
// 
//     public static boolean isResourceExists(String resource) {
//         try (InputStream is = IOUtil.class.getResourceAsStream(resource)) {
//             return is != null;
//         } catch (IOException ioe) {
//             return false;
//         }
//     }
// 
//     public static List<String> linesFromResource(String resource) {
//         return linesFromResource(resource, "UTF-8");
//     }
// 
//     public static List<String> linesFromResource(String resource, String charset) {
//         try (InputStream is = IOUtil.class.getResourceAsStream(resource)) {
//             return linesFromStream(is, charset);
//         } catch (IOException ioe) {
//             return Collections.emptyList();
//         }
//     }
// 
//     public static List<String> linesFromStream(InputStream stream) throws IOException {
//         return linesFromStream(stream, "UTF-8");
//     }
// 
//     public static List<String> linesFromStream(InputStream stream, String charset) throws IOException {
//         if (stream == null) return Collections.emptyList();
//         try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, charset))) {
//             return reader.lines().collect(Collectors.toList());
//         }
//     }
// 
//     public static byte[] download(String url) throws IOException {
//         final ByteArrayOutputStream result = new ByteArrayOutputStream();
//         try (InputStream is = new URL(url).openStream()) {
//             copy(is, result);
//         }
//         return result.toByteArray();
//     }
// 
//     public static void copy(InputStream is, OutputStream os) throws IOException {
//         final int bufferSize = 8192;
//         final byte[] buffer = new byte[bufferSize];
//         int readed;
//         while ((readed = is.read(buffer, 0, bufferSize)) != -1) {
//             os.write(buffer, 0, readed);
//         }
//     }
// }


// Path: src/com/noticeditorteam/noticeditor/io/importers/WebImporter.java
import com.noticeditorteam.noticeditor.io.IOUtil;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.jsoup.safety.Whitelist;

package com.noticeditorteam.noticeditor.io.importers;


/**
 * Load page from Internet, insert scripts, styles, images directly to html.
 *
 * @author Naik
 */
public class WebImporter extends HtmlImporter {

    private final Map<String, String> cache = new HashMap<>();

    @Override
    protected String cleanHtml(String url, Whitelist whitelist) throws Exception {
        String html;
        if (cache.containsKey(url)) {
            html = cache.get(url);
        } else {
            html = IOUtil.stringFromStream(new URL(url).openStream());