Skip to content

Commit

Permalink
Fix unreliable default settings handling.
Browse files Browse the repository at this point in the history
Now use a auto-genearated default setting instead of
hard writting them in the python source.

Fix #47
  • Loading branch information
Timon Wong committed Apr 14, 2014
1 parent 41f01e6 commit a8c3d92
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 23 deletions.
2 changes: 1 addition & 1 deletion OmniMarkupLib/RendererManager.py
Expand Up @@ -451,7 +451,7 @@ def on_setting_changed(cls, setting):
for renderer_classname, renderer in cls.RENDERERS:
key = 'renderer_options-' + renderer_classname
try:
renderer_options = setting._sublime_settings.get(key, {})
renderer_options = setting.get_setting(key, {})
renderer.load_settings(renderer_options, setting)
except:
log.exception('Error on setting renderer options for %s', renderer_classname)
Expand Down
50 changes: 28 additions & 22 deletions OmniMarkupLib/Setting.py
@@ -1,9 +1,16 @@
import json
import os

import sublime

from . import log
from .Common import Singleton


__file__ = os.path.normpath(os.path.abspath(__file__))
__path__ = os.path.dirname(__file__)


class SettingEventSource(object):
def __init__(self):
self._subscribers = {}
Expand All @@ -29,38 +36,37 @@ def clear_subscribers(self):

@Singleton
class Setting(SettingEventSource):
DEFAULT_EXPORT_OPTIONS = {
"target_folder": ".",
"timestamp_format": "_%y%m%d%H%M%S",
"copy_to_clipboard": False,
"open_after_exporting": False
}

def __init__(self):
SettingEventSource.__init__(self)

@staticmethod
def _read_default_settings():
default_settings_filename = os.path.join(
__path__, '../', 'default_settings.json')
default_settings_filename = os.path.normpath(default_settings_filename)
with open(default_settings_filename) as f:
settings_obj = json.load(f)
return settings_obj

def load_setting(self):
PLUGIN_NAME = 'OmniMarkupPreviewer'
settings = sublime.load_settings(PLUGIN_NAME + '.sublime-settings')
settings.clear_on_change(PLUGIN_NAME)
settings.add_on_change(PLUGIN_NAME, self.sublime_settings_on_change)

self._sublime_settings = settings
self.server_host = settings.get("server_host", '127.0.0.1')
self.server_port = settings.get("server_port", 51004)
self.refresh_on_modified = settings.get("refresh_on_modified", True)
self.refresh_on_modified_delay = settings.get("refresh_on_modified_delay", 500)
self.refresh_on_saved = settings.get("refresh_on_saved", True)
self.browser_command = settings.get("browser_command", [])
self.html_template_name = settings.get("html_template_name", 'github')
self.ajax_polling_interval = settings.get("ajax_polling_interval", 500)
self.ignored_renderers = set(settings.get("ignored_renderers", []))
self.mathjax_enabled = settings.get("mathjax_enabled", False)
self.http_proxy = settings.get("http_proxy", None)
self.https_proxy = settings.get("https_proxy", None)
self.export_options = self.DEFAULT_EXPORT_OPTIONS.copy()
# Merge with the user defined export options
self.export_options.update(settings.get("export_options", {}))

# Merge new settings into the default settings
default_settings = self._read_default_settings()
for k, v in default_settings.items():
if isinstance(v, dict):
v.update(settings.get(k, {}))
else:
v = settings.get(k, v)
setattr(self, k, v)

def get_setting(self, k, default=None):
return getattr(self, k, default)

def init(self):
self.clear_subscribers()
Expand Down
29 changes: 29 additions & 0 deletions default_settings.json
@@ -0,0 +1,29 @@
{
"html_template_name": "github",
"browser_command": [],
"refresh_on_saved": true,
"server_host": "127.0.0.1",
"refresh_on_modified_delay": 500,
"refresh_on_modified": true,
"server_port": 51004,
"ajax_polling_interval": 500,
"ignored_renderers": [
"LiterateHaskellRenderer"
],
"export_options": {
"template_name": "github-export",
"target_folder": ".",
"open_after_exporting": false,
"timestamp_format": "_%y%m%d%H%M%S",
"copy_to_clipboard": false
},
"renderer_options-MarkdownRenderer": {
"extensions": [
"tables",
"strikeout",
"fenced_code",
"codehilite"
]
},
"mathjax_enabled": false
}
62 changes: 62 additions & 0 deletions dump_default_settings
@@ -0,0 +1,62 @@
#!/usr/bin/env python

'''
Created on 20/01/2011
v0.1 (C) Gerald Storer
MIT License
Based on JSON.minify.js:
https://github.com/getify/JSON.minify
'''

import re


def json_minify(json, strip_space=True):
tokenizer = re.compile('"|(/\*)|(\*/)|(//)|\n|\r')
in_string = False
in_multiline_comment = False
in_singleline_comment = False

new_str = []
from_index = 0 # from is a keyword in Python

for match in re.finditer(tokenizer, json):

if not in_multiline_comment and not in_singleline_comment:
tmp2 = json[from_index:match.start()]
if not in_string and strip_space:
tmp2 = re.sub('[ \t\n\r]*', '', tmp2) # replace only white space defined in standard
new_str.append(tmp2)

from_index = match.end()

if match.group() == '"' and not in_multiline_comment and not in_singleline_comment:
escaped = re.search('(\\\\)*$', json[:match.start()])
if not in_string or escaped is None or len(escaped.group()) % 2 == 0:
# start of string with ", or unescaped " character found to end string
in_string = not in_string
from_index -= 1 # include " character in next catch

elif match.group() == '/*' and not in_string and not in_multiline_comment and not in_singleline_comment:
in_multiline_comment = True
elif match.group() == '*/' and not in_string and in_multiline_comment and not in_singleline_comment:
in_multiline_comment = False
elif match.group() == '//' and not in_string and not in_multiline_comment and not in_singleline_comment:
in_singleline_comment = True
elif (match.group() == '\n' or match.group() == '\r') and not in_string and not in_multiline_comment and in_singleline_comment:
in_singleline_comment = False
elif not in_multiline_comment and not in_singleline_comment and (
match.group() not in ['\n', '\r', ' ', '\t'] or not strip_space):
new_str.append(match.group())

new_str.append(json[from_index:])
return ''.join(new_str)


import json
s = json_minify(open('OmniMarkupPreviewer.sublime-settings').read())
json_obj = json.loads(s)
default_settings_string = json.dumps(json_obj, indent=4, separators=(',', ': '))
open('default_settings.json', 'w').write(default_settings_string)

0 comments on commit a8c3d92

Please sign in to comment.