blob: 733f30bb65b88bb9f02f15eb66152827724bddb3 [file] [log] [blame] [raw]
package li.cil.oc.api;
import li.cil.oc.api.manual.ContentProvider;
import li.cil.oc.api.manual.ImageProvider;
import li.cil.oc.api.manual.ImageRenderer;
import li.cil.oc.api.manual.PathProvider;
import li.cil.oc.api.manual.TabIconRenderer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
/**
* This API allows interfacing with the in-game manual of OpenComputers.
* <p/>
* It allows opening the manual at a desired specific page, as well as
* registering custom tabs and content callback handlers.
* <p/>
* Note: this is a <em>client side only</em> API. It will do nothing on
* dedicated servers (i.e. <tt>API.manual</tt> will be <tt>null</tt>).
*/
public class Manual {
/**
* Register a tab to be displayed next to the manual.
* <p/>
* These are intended to link to index pages, and for the time being there
* a relatively low number of tabs that can be displayed, so I'd ask you to
* only register as many tabs as actually, technically *needed*. Which will
* usually be one, for your main index page.
*
* @param renderer the renderer used to render the icon on your tab.
* @param tooltip the unlocalized tooltip of the tab, or <tt>null</tt>.
* @param path the path to the page to open when the tab is clicked.
*/
public static void addTab(TabIconRenderer renderer, String tooltip, String path) {
if (API.manual != null)
API.manual.addTab(renderer, tooltip, path);
}
/**
* Register a path provider.
* <p/>
* Path providers are used to find documentation entries for item stacks
* and blocks in the world.
*
* @param provider the provider to register.
*/
public static void addProvider(PathProvider provider) {
if (API.manual != null)
API.manual.addProvider(provider);
}
/**
* Register a content provider.
* <p/>
* Content providers are used to resolve paths to page content, if the
* standard system (using Minecraft's resource loading facilities) fails.
* <p/>
* This can be useful for providing dynamic content, for example.
*
* @param provider the provider to register.
*/
public static void addProvider(ContentProvider provider) {
if (API.manual != null)
API.manual.addProvider(provider);
}
/**
* Register an image provider.
* <p/>
* Image providers are used to render custom content in a page. These are
* selected via the standard image tag of Markdown, based on the prefix of
* the image URL, i.e. <tt>![tooltip](prefix:data)</tt> will select the
* image provider registered for the prefix <tt>prefix</tt>, and pass to
* it the argument <tt>data</tt>, then use the returned renderer to draw
* an element in the place of the tag. The provided prefix is expected to
* be <em>without</em> the colon (<tt>:</tt>).
* <p/>
* Custom providers are only selected if a prefix is matched, otherwise
* it'll treat it as a relative path to an image to load via Minecraft's
* resource providing facilities, and display that.
*
* @param prefix the prefix on which to use the provider.
* @param provider the provider to register.
*/
public static void addProvider(String prefix, ImageProvider provider) {
if (API.manual != null)
API.manual.addProvider(prefix, provider);
}
/**
* Get the image renderer for the specified image path.
* <p/>
* This will look for {@link ImageProvider}s registered for a prefix in the
* specified path. If there is no match, or the matched content provider
* does not provide a renderer, this will return <tt>null</tt>.
*
* @param path the path to the image to get the renderer for.
* @return the custom renderer for that path.
*/
public static ImageRenderer imageFor(String path) {
if (API.manual != null)
return API.manual.imageFor(path);
return null;
}
// ----------------------------------------------------------------------- //
/**
* Look up the documentation path for the specified item stack.
*
* @param stack the stack to find the documentation path for.
* @return the path to the page, <tt>null</tt> if none is known.
*/
public static String pathFor(ItemStack stack) {
if (API.manual != null)
return API.manual.pathFor(stack);
return null;
}
/**
* Look up the documentation for the specified block in the world.
*
* @param world the world containing the block.
* @param pos the position of the block.
* @return the path to the page, <tt>null</tt> if none is known.
*/
public static String pathFor(World world, BlockPos pos) {
if (API.manual != null)
return API.manual.pathFor(world, pos);
return null;
}
/**
* Get the content of the documentation page at the specified location.
*
* @param path the path of the page to get the content of.
* @return the content of the page, or <tt>null</tt> if none exists.
*/
public static Iterable<String> contentFor(String path) {
if (API.manual != null)
return API.manual.contentFor(path);
return null;
}
// ----------------------------------------------------------------------- //
/**
* Open the manual for the specified player.
* <p/>
* If you wish to display a specific page, call {@link #navigate(String)}
* after this function returns, with the path to the page to show.
*
* @param player the player to open the manual for.
*/
public static void openFor(EntityPlayer player) {
if (API.manual != null)
API.manual.openFor(player);
}
/**
* Reset the history of the manual.
*/
public static void reset() {
if (API.manual != null)
API.manual.reset();
}
/**
* Navigate to a page in the manual.
*
* @param path the path to navigate to.
*/
public static void navigate(String path) {
if (API.manual != null)
API.manual.navigate(path);
}
// ----------------------------------------------------------------------- //
private Manual() {
}
}