diff --git a/overviewer_core/assetmanager.py b/overviewer_core/assetmanager.py index 0754a81..7a57236 100644 --- a/overviewer_core/assetmanager.py +++ b/overviewer_core/assetmanager.py @@ -16,8 +16,13 @@ import json import os import codecs +import locale +import time from PIL import Image +import util +import overviewer_version + class AssetManager(object): """\ These objects provide an interface to metadata and persistent data, and at the @@ -115,11 +120,12 @@ directory. global_assets = os.path.join(util.get_program_path(), "overviewer_core", "data", "web_assets") if not os.path.isdir(global_assets): global_assets = os.path.join(util.get_program_path(), "web_assets") - mirror_dir(global_assets, self.destdir) + util.mirror_dir(global_assets, self.outputdir) # do the same with the local copy, if we have it - if self.web_assets_path: - mirror_dir(self.web_assets_path, self.destdir) + # TODO + # if self.web_assets_path: + # util.mirror_dir(self.web_assets_path, self.outputdir) @@ -130,88 +136,17 @@ directory. return info['label'] return rendermode.capitalize() - - # create generated map type data, from given quadtrees - maptypedata = map(lambda q: {'label' : get_render_mode_label(q.rendermode), - 'shortname' : q.rendermode, - 'path' : q.tiledir, - 'bg_color': self.bg_color, - 'overlay' : 'overlay' in get_render_mode_inheritance(q.rendermode), - 'imgformat' : q.imgformat}, - self.quadtrees) - config = config.replace("{maptypedata}", json.dumps(maptypedata)) - - with codecs.open(os.path.join(self.destdir, "overviewerConfig.js"), 'w', encoding='UTF-8') as output: - output.write(config) - - # Add time and version in index.html - indexpath = os.path.join(self.destdir, "index.html") + indexpath = os.path.join(self.outputdir, "index.html") index = codecs.open(indexpath, 'r', encoding='UTF-8').read() - index = index.replace("{title}", "%s Map - Minecraft Overviewer" % self.world.name) - index = index.replace("{time}", strftime("%a, %d %b %Y %H:%M:%S %Z", localtime()).decode(locale.getpreferredencoding())) + index = index.replace("{title}", "Minecraft Overviewer") + index = index.replace("{time}", time.strftime("%a, %d %b %Y %H:%M:%S %Z", time.localtime()).decode(locale.getpreferredencoding())) versionstr = "%s (%s)" % (overviewer_version.VERSION, overviewer_version.HASH[:7]) index = index.replace("{version}", versionstr) - with codecs.open(os.path.join(self.destdir, "index.html"), 'w', encoding='UTF-8') as output: + with codecs.open(os.path.join(self.outputdir, "index.html"), 'w', encoding='UTF-8') as output: output.write(index) - # the following bit of code came from world.py - - # if it exists, open overviewer.dat, and read in the data structure - # info self.persistentData. This dictionary can hold any information - # that may be needed between runs. - # Currently only holds into about POIs (more more details, see quadtree) - self.pickleFile = os.path.join(self.outputdir, "overviewer.dat") - - ### TODO: Deal with old picklefiles that still live in the world directory - - if os.path.exists(self.pickleFile): - self.persistentDataIsNew = False - with open(self.pickleFile,"rb") as p: - self.persistentData = cPickle.load(p) - if not self.persistentData.get('north_direction', False): - # this is a pre-configurable-north map, so add the north_direction key - self.persistentData['north_direction'] = 'lower-left' - else: - # some defaults, presumably a new map - self.persistentData = dict(POI=[], north_direction='lower-left') - self.persistentDataIsNew = True # indicates that the values in persistentData are new defaults, and it's OK to override them - - # the following bit of code came from googlemap.py - - # since we will only discover PointsOfInterest in chunks that need to be - # [re]rendered, POIs like signs in unchanged chunks will not be listed - # in self.world.POI. To make sure we don't remove these from markers.js - # we need to merge self.world.POI with the persistant data in world.PersistentData - - self.world.POI += filter(lambda x: x['type'] != 'spawn', self.world.persistentData['POI']) - - if self.nosigns: - markers = filter(lambda x: x['type'] != 'sign', self.world.POI) - else: - markers = self.world.POI - - - # save persistent data - self.world.persistentData['POI'] = self.world.POI - self.world.persistentData['north_direction'] = self.world.north_direction - with open(self.world.pickleFile,"wb") as f: - cPickle.dump(self.world.persistentData,f) - - ### TODO find a better mechanism than --skipjs - if self.skipjs: - if self.web_assets_hook: - self.web_assets_hook(self) - - # write out the default marker table - with codecs.open(os.path.join(self.outputdir, "markers.js"), 'w', encoding='UTF-8') as output: - output.write("// This is a generated file. Please do not edit it!\n") - output.write("overviewer.collections.markerDatas.push(\n") - output.write("// --start marker json dump--\n") - json.dump(markers, output, indent=1) - output.write("\n// --end marker json dump--\n") - output.write(");\n") diff --git a/overviewer_core/data/web_assets/index.html b/overviewer_core/data/web_assets/index.html index 277da5d..996fc50 100644 --- a/overviewer_core/data/web_assets/index.html +++ b/overviewer_core/data/web_assets/index.html @@ -15,8 +15,6 @@ - - diff --git a/overviewer_core/data/web_assets/overviewerConfig.js b/overviewer_core/data/web_assets/overviewerConfig.js deleted file mode 100644 index 5f3122f..0000000 --- a/overviewer_core/data/web_assets/overviewerConfig.js +++ /dev/null @@ -1,188 +0,0 @@ -var overviewerConfig = { - /** - * These are things that will probably not need to be changed, but are there - * because otherwise changing them is a giant PITA. If you, the user, sees - * that its crucial for you to change these settings then the document - * repository might be able to assist you. - * http://docs.overviewer.org/en/latest/options/#customizing-web-assets - */ - 'CONST': { - /** - * Height and width of the tiles in pixels. - */ - 'tileSize': 384, - /** - * Various images used for markers and stuff. - */ - 'image': { - 'defaultMarker': 'signpost.png', - 'signMarker': 'signpost_icon.png', - 'compass': 'compass_{north_direction}.png', - 'spawnMarker': 'http://google-maps-icons.googlecode.com/files/home.png', - 'queryMarker': 'http://google-maps-icons.googlecode.com/files/regroup.png' - }, - 'mapDivId': 'mcmap', - 'regionStrokeWeight': 2 - }, - /** - * General map settings. - */ - 'map': { - /** - * Control the visibility of various controls. - */ - 'controls': { - /** - * Pan control is the hand with the arrows around it in the upper left. - */ - 'pan': true, - /** - * Zoom control is the zoom slider bar in the upper left. - */ - 'zoom': true, - /** - * Spawn control is the "Spawn" button that centers the map on spawn. - */ - 'spawn': true, - /** - * The compass in the upper right. - */ - 'compass': true, - /** - * The mapType control is the slider for selecting different map types. - */ - 'mapType': true, - /** - * The coordsBox control is the box showing the XYZ coordinates - * under the cursor. - */ - 'coordsBox': true, - /** - * The overlays control is the drop-down box for selecting overlays. - */ - 'overlays': true, - /** - * The searchBox control is the search box for markers. - */ - 'searchBox': true - }, - /** - * The zoom level when the page is loaded without a specific zoom setting - */ - 'defaultZoom': 0, - /** - * This controls how far you can zoom out. - */ - 'minZoom': {minzoom}, - /** - * This controls how close you can zoom in. - */ - 'maxZoom': {maxzoom}, - /** - * This tells us how many total zoom levels Overviewer rendered. - * DO NOT change this, even if you change minZoom and maxZoom, because - * it's used for marker position calculations and map resizing. - */ - 'zoomLevels': {zoomlevels}, - /** - * Center on this point, in world coordinates. Should be an array, ex: - * [0,0,0] - */ - 'center': {spawn_coords}, - /** - * Set this to tell browsers how long they should cache tiles in minutes. - * Essentially if set to 0, the url for tiles will end in .png - * if not set to 0 it will amend a number derived from the current time - * to the end of the url, like .png?c=123456. This is a great method for - * preventing browsers from caching the images. 0 saves bandwidth, not 0 - * prevents caching. - */ - 'cacheMinutes': 0, - /** - * Set to true to turn on debug mode, which adds a grid to the map along - * with co-ordinates and a bunch of console output. - */ - 'debug': false, - /** - * Set which way north points. - */ - 'north_direction': '{north_direction}' - }, - /** - * Group definitions for objects that are partially selectable (signs and - * regions). - */ - 'objectGroups': { - /* signs -- A list of signpost groups. A signpost can fall into zero, - * one, or more than one group. See below for some examples. - * - * Required: - * label : string. Displayed in the drop down menu control. - * match : function. Applied to each marker (from markers.js). It - * is returns true if the marker should be part - * of the group. - * - * Optional: - * checked : boolean. Set to true to have the group visible by default - * icon : string. Used to specify an icon url. - */ - 'signs': [ - //{label: "'To'", checked: false, match: function(s) {return s.msg.match(/to/)}}, - //{label: "Storage", match: function(s) {return s.msg.match(/storage/i) || s.msg.match(/dirt/i) || s.msg.match(/sand/)}}, - //{label: "Below Sealevel", match: function(s) { return s.y<64;}}, - //{label: "Info", match: function(s) { return s.msg.match("\\[info\\]");}, icon:"http://google-maps-icons.googlecode.com/files/info.png"}, - {'label':'All', 'match':function(sign){return true;}} - ], - /* regions -- A list of region groups. A region can fall into zero, - * one, or more than one group. See below for some examples. - * Regions have been designed to work with the WorldGuard Overviewer - * Region importer at @link http://goo.gl/dc0tV but your - * host must support php in order to run WG2OvR. You can also continue - * to use any other region format. - * - * Required: - * label : string. Displayed in the drop down menu control. - * clickable : boolean. Will determine if we should generate an - * experimental info window that shows details - * about the clicked region. - * NOTE: if a region (as defined in region.js) - * does not have a label, this will default to - * false. - * match : function. Applied to each region (from region.js). It - * returns true if the region should be part of - * the group. - * - * Optional: - * checked : boolean. Set to true to have the group visible by default - */ - 'regions': [ - //{'label':'All','clickable':true,'match':function(region){return true;}} - ] - }, - /* mapTypes -- a list of alternate map renderings available. At least one - * rendering must be listed. When more than one are provided, controls to - * switch between them are provided, with the first one being the default. - * - * Required: - * label : string. Displayed on the control. - * path : string. Location of the rendered tiles. - * Optional: - * base : string. Base of the url path for tile locations, useful - * for serving tiles from a different server than - * the js/html server. - * imgformat : string. File extension used for these tiles. Defaults to png. - * overlay : bool. If true, this tile set will be treated like an overlay - * bg_color : string. A #RRGGBB format background color. - * shortname : string. Used in the dynamic anchor link mechanism. If not - * present, label is used instead. - * - * Example: - * 'mapTypes': [ - * {'label': 'Day', 'path': 'lighting/tiles'}, - * {'label': 'Night', 'path': 'night/tiles', 'imgformat': 'jpg'}, - * {'label': 'Spawn', 'path': 'spawn/tiles', 'base': 'http://example.cdn.amazon.com/'}, - * {'label': 'Overlay', 'path': 'overlay/tiles', 'overlay': true} - * ] - */ - 'mapTypes': {maptypedata} -}; diff --git a/overviewer_core/googlemap.py b/overviewer_core/googlemap.py index 3d47a85..109f8ff 100644 --- a/overviewer_core/googlemap.py +++ b/overviewer_core/googlemap.py @@ -34,38 +34,6 @@ interface out of a set of tiles. """ -def mirror_dir(src, dst, entities=None): - '''copies all of the entities from src to dst''' - if not os.path.exists(dst): - os.mkdir(dst) - if entities and type(entities) != list: raise Exception("Expected a list, got a %r instead" % type(entities)) - - # files which are problematic and should not be copied - # usually, generated by the OS - skip_files = ['Thumbs.db', '.DS_Store'] - - for entry in os.listdir(src): - if entry in skip_files: - continue - if entities and entry not in entities: - continue - - if os.path.isdir(os.path.join(src,entry)): - mirror_dir(os.path.join(src, entry), os.path.join(dst, entry)) - elif os.path.isfile(os.path.join(src,entry)): - try: - shutil.copy(os.path.join(src, entry), os.path.join(dst, entry)) - except IOError as outer: - try: - # maybe permission problems? - src_stat = os.stat(os.path.join(src, entry)) - os.chmod(os.path.join(src, entry), src_stat.st_mode | stat.S_IRUSR) - dst_stat = os.stat(os.path.join(dst, entry)) - os.chmod(os.path.join(dst, entry), dst_stat.st_mode | stat.S_IWUSR) - except OSError: # we don't care if this fails - pass - shutil.copy(os.path.join(src, entry), os.path.join(dst, entry)) - # if this stills throws an error, let it propagate up class MapGen(object): def __init__(self, quadtrees, configInfo): diff --git a/overviewer_core/util.py b/overviewer_core/util.py index 93cd7d6..156d4de 100644 --- a/overviewer_core/util.py +++ b/overviewer_core/util.py @@ -27,6 +27,7 @@ from cStringIO import StringIO import ctypes import platform from itertools import cycle, islice, product +import shutil def get_program_path(): if hasattr(sys, "frozen") or imp.is_frozen("__main__"): @@ -358,3 +359,37 @@ class ANSIColorFormatter(HighlightingFormatter): else: # No coloring if it's not to be highlighted or colored return logging.Formatter.format(self, record) + + +def mirror_dir(src, dst, entities=None): + '''copies all of the entities from src to dst''' + if not os.path.exists(dst): + os.mkdir(dst) + if entities and type(entities) != list: raise Exception("Expected a list, got a %r instead" % type(entities)) + + # files which are problematic and should not be copied + # usually, generated by the OS + skip_files = ['Thumbs.db', '.DS_Store'] + + for entry in os.listdir(src): + if entry in skip_files: + continue + if entities and entry not in entities: + continue + + if os.path.isdir(os.path.join(src,entry)): + mirror_dir(os.path.join(src, entry), os.path.join(dst, entry)) + elif os.path.isfile(os.path.join(src,entry)): + try: + shutil.copy(os.path.join(src, entry), os.path.join(dst, entry)) + except IOError as outer: + try: + # maybe permission problems? + src_stat = os.stat(os.path.join(src, entry)) + os.chmod(os.path.join(src, entry), src_stat.st_mode | stat.S_IRUSR) + dst_stat = os.stat(os.path.join(dst, entry)) + os.chmod(os.path.join(dst, entry), dst_stat.st_mode | stat.S_IWUSR) + except OSError: # we don't care if this fails + pass + shutil.copy(os.path.join(src, entry), os.path.join(dst, entry)) + # if this stills throws an error, let it propagate up