Files
ChocolateyPackages/EthanBrown.SublimeText2.WebPackages/tools/PackageCache/Emmet/emmet/file.py
2013-04-04 08:54:25 -04:00

160 lines
3.4 KiB
Python

'''
@author Sergey Chikuyonok (serge.che@gmail.com)
@link http://chikuyonok.ru
'''
import sys
import os.path
import re
is_python3 = sys.version_info[0] > 2
try:
if is_python3:
import urllib.request as urllib2
else:
import urllib2
except Exception as e:
pass
def is_url(path):
return re.match(r'^https?://', path, re.IGNORECASE)
def read_http(url, size=-1, mode=None):
response = urllib2.urlopen(url, timeout=5)
return response.read(size)
def read_file(path, size=-1, mode='rb'):
kwargs = {}
if is_python3 and 'b' not in mode:
kwargs['encoding'] = 'utf-8'
with open(path, mode, **kwargs) as fp:
return fp.read(size)
class File():
def __init__(self):
pass
def _read(self, path, size, mode='rb'):
reader = is_url(path) and read_http or read_file
return reader(path, size, mode)
def read(self, path, size, callback=None):
"""
Read file content and return it
@param path: File's relative or absolute path
@type path: str
@return: str
"""
try:
content = self._read(path, size)
# return as array of character codes since PyV8 may corrupt
# binary data when python string is translated into JS string
if is_python3:
content = [ch for ch in content]
else:
content = [ord(ch) for ch in content]
except Exception as e:
return callback(str(e), None)
callback(None, content)
def read_text(self, path, size, callback=None):
"""
Read file content and return it
@param path: File's relative or absolute path
@type path: str
@return: str
"""
try:
content = self._read(path, size, 'r')
if not is_python3:
content = content.decode('utf-8')
except Exception as e:
return callback(str(e), None)
callback(None, content)
def locate_file(self, editor_file, file_name):
"""
Locate <code>file_name</code> file that relates to <code>editor_file</code>.
File name may be absolute or relative path
@type editor_file: str
@type file_name: str
@return String or None if <code>file_name</code> cannot be located
"""
if is_url(file_name):
return file_name
result = None
previous_parent = ''
parent = os.path.dirname(editor_file)
while parent and os.path.exists(parent) and parent != previous_parent:
tmp = self.create_path(parent, file_name)
if os.path.exists(tmp):
result = tmp
break
previous_parent = parent
parent = os.path.dirname(parent)
return result
def create_path(self, parent, file_name):
"""
Creates absolute path by concatenating <code>parent</code> and <code>file_name</code>.
If <code>parent</code> points to file, its parent directory is used
@type parent: str
@type file_name: str
@return: str
"""
result = ''
file_name = file_name.lstrip('/')
if os.path.exists(parent):
if os.path.isfile(parent):
parent = os.path.dirname(parent)
result = os.path.normpath(os.path.join(parent, file_name))
return result
def save(self, file, content):
"""
Saves <code>content</code> as <code>file</code>
@param file: File's asolute path
@type file: str
@param content: File content
@type content: str
"""
try:
fp = open(file, 'wb')
except:
fdirs, fname = os.path.split(file)
if fdirs:
os.makedirs(fdirs)
fp = open(file, 'wb')
fp.write(content)
fp.close()
def get_ext(self, file):
"""
Returns file extention in lower case
@type file: str
@return: str
"""
ext = os.path.splitext(file)[1]
if ext:
ext = ext[1:]
return ext.lower()