nutools/lib/pyulib/src/ulib/templ/javatempl.py
2015-08-20 07:58:17 +04:00

135 lines
4.1 KiB
Python

# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
import ulib.base.i_need_py23
__all__ = ('PropertiesTempl', 'JavaTempl')
import os, re
from os import path
from ulib.base.base import isseq
from ulib.base.uio import _u
from ulib.base.encoding import LATIN1
from ulib.base.lines import Lines
from ulib.base.dates import datef
from base import FileTempl, register_templates
class PropertiesTempl(FileTempl):
TEMPLATE = ('properties file', 'properties')
FILENAME = ('Properties',)
EXT = '.properties'
VPS, ACPS, NCPS, ICPS = FileTempl.PS('-encoding')
def fix_properties(self):
FileTempl.fix_properties(self)
self.encoding = LATIN1
def get_lines(self):
return self.appendtext(None, self.modeline)
RE_COMMA = re.compile(r"[\s,]*")
def imports_parser(values):
if values:
if not isseq(values):
values = filter(None, RE_COMMA.split(values.strip()))
return u"\n".join([u"import %s;" % value for value in values])
return u""
def extends_parser(value):
if value: return u" extends %s" % _u(value).strip()
else: return u""
def implements_parser(values):
if values:
if not isseq(values):
values = filter(None, RE_COMMA.split(values.strip()))
if values: return " implements %s" % u", ".join(values)
return u""
class JavaTempl(FileTempl):
TEMPLATE = ('java file', 'java', 'j')
EXT = '.java'
VPS, ACPS, NCPS, ICPS = FileTempl.PS('package', 'imports', 'extends', 'implements',
icps=dict(package=None,
imports=imports_parser,
extends=extends_parser,
implements=implements_parser))
cdate = None
package = None
imports = None
extends = None
implements = None
body = None
RE_PACKAGE = re.compile(r'\s*package\s+(\S+)\s*;')
def __init__(self, file, **properties):
FileTempl.__init__(self, file, **properties)
self.autodetect_package()
def autodetect_package(self):
# Essayer d'autodétecter le package à partir d'autres fichiers du même répertoire
dir, _ = path.split(self.file)
if not dir: dir = '.'
if not path.isdir(dir): return False
files = [file for file in os.listdir(dir) if file.endswith('.java')]
if not files: return False
lines = Lines().readlines(path.join(dir, files[0]))
packages = lines.grep(self.RE_PACKAGE)
if not packages: return False
mo = self.RE_PACKAGE.match(packages[0])
self.package = mo.group(1)
return True
def fix_properties(self):
FileTempl.fix_properties(self)
if self.cdate is None: self.cdate = datef()
self.imports = self.imports or u""
if isseq(self.imports): self.imports = imports_parser(self.imports)
self.extends = self.extends or u""
self.implements = self.implements or u""
if isseq(self.implements): self.implements = implements_parser(self.implements)
def set_imports(self, *imports):
self.imports = imports_parser(imports)
def set_extends(self, extends):
self.extends = extends_parser(extends)
def set_implements(self, *implements):
self.implements = implements_parser(implements)
#MODE = u"java"
MODELINE_PREFIX = u"/* "
PACKAGE = u"""package %(package)s;"""
IMPORTS = u"""%(imports)s"""
CLASS = u"""\
/**
* @author jclain
*/
public class %(basename)s%(extends)s%(implements)s {"""
def get_lines(self):
lines = Lines()
self.appendtext(lines, self.modeline)
self.appendtext(lines, u"""\
* %(filename)s
* Créé le %(cdate)s
*/""")
if self.package: self.appendtext(lines, self.PACKAGE)
if self.imports:
self.appendtext(lines, self.IMPORTS, bnl=True)
self.appendtext(lines, self.CLASS, bnl=True)
if self.body: self.appendtext(lines, self.body)
self.appendtext(lines, u"}")
return lines
register_templates(PropertiesTempl, JavaTempl)