| package li.cil.oc.api.prefab; |
| |
| import com.google.common.base.Charsets; |
| import li.cil.oc.api.manual.ContentProvider; |
| import net.minecraft.client.Minecraft; |
| import net.minecraft.util.ResourceLocation; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.util.ArrayList; |
| |
| /** |
| * Basic implementation of a content provider based on Minecraft's resource |
| * loading framework. |
| * <p/> |
| * Beware that the manual is unaware of resource domains. In other words, two |
| * paths that are identical except for their resource domain will be the same, |
| * as seen from the manual. This means you should probably place your |
| * documentation somewhere other than <tt>doc/</tt>, because that's where the |
| * OpenComputers documentation lives, and it is queried first - meaning if you |
| * have a page with the same path as one in OpenComputers, it is practically |
| * unreachable (because the OC provider is always queried first). |
| */ |
| @SuppressWarnings("UnusedDeclaration") |
| public class ResourceContentProvider implements ContentProvider { |
| private final String resourceDomain; |
| |
| private final String basePath; |
| |
| public ResourceContentProvider(String resourceDomain, String basePath) { |
| this.resourceDomain = resourceDomain; |
| this.basePath = basePath; |
| } |
| |
| public ResourceContentProvider(String resourceDomain) { |
| this(resourceDomain, ""); |
| } |
| |
| @Override |
| public Iterable<String> getContent(String path) { |
| final ResourceLocation location = new ResourceLocation(resourceDomain, basePath + (path.startsWith("/") ? path.substring(1) : path)); |
| InputStream is = null; |
| try { |
| is = Minecraft.getMinecraft().getResourceManager().getResource(location).getInputStream(); |
| final BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charsets.UTF_8)); |
| final ArrayList<String> lines = new ArrayList<String>(); |
| String line; |
| while ((line = reader.readLine()) != null) { |
| lines.add(line); |
| } |
| return lines; |
| } catch (Throwable ignored) { |
| return null; |
| } finally { |
| if (is != null) { |
| try { |
| is.close(); |
| } catch (IOException ignored) { |
| } |
| } |
| } |
| } |
| } |