Files
Phoenix/etgtools/generators.py
2025-02-02 20:29:49 -05:00

118 lines
3.2 KiB
Python

#---------------------------------------------------------------------------
# Name: etgtools/generators.py
# Author: Robin Dunn
#
# Created: 3-Nov-2010
# Copyright: (c) 2010-2020 by Total Control Software
# License: wxWindows License
#---------------------------------------------------------------------------
"""
Just some base classes and stubs for the various generators
"""
import sys
#---------------------------------------------------------------------------
class WrapperGeneratorBase(object):
def __init__(self):
pass
def generate(self, module, destFile=None):
raise NotImplementedError
class DocsGeneratorBase(object):
def __init__(self):
pass
def generate(self, module):
raise NotImplementedError
class StubbedDocsGenerator(DocsGeneratorBase):
def generate(self, module):
pass
class SphinxGenerator(DocsGeneratorBase):
def generate(self, module):
pass
#---------------------------------------------------------------------------
# helpers
def nci(text, numSpaces=0, stripLeading=True):
"""
Normalize Code Indents
First use the count of leading spaces on the first line and remove that
many spaces from the front of all lines, and then indent each line by
adding numSpaces spaces. This is used so we can convert the arbitrary
indents that might be used by the tweaker code into what is expected for
the context we are generating for.
"""
def _getLeadingSpaceCount(line):
count = 0
for c in line:
assert c != '\t', "Use spaces for indent, not tabs"
if c != ' ':
break
count += 1
return count
def _allSpaces(text):
for c in text:
if c != ' ':
return False
return True
lines = text.rstrip().split('\n')
if stripLeading:
numStrip = _getLeadingSpaceCount(lines[0])
else:
numStrip = 0
for idx, line in enumerate(lines):
assert _allSpaces(line[:numStrip]), "Indentation inconsistent with first line"
lines[idx] = ' '*numSpaces + line[numStrip:]
newText = '\n'.join(lines) + '\n'
return newText
def wrapText(text, dontWrap: str = ''):
import textwrap
lines = []
tw = textwrap.TextWrapper(width=70, break_long_words=False)
for line in text.split('\n'):
if dontWrap and line.lstrip().startswith(dontWrap):
lines.append(line)
else:
lines.append(tw.fill(line))
return '\n'.join(lines)
#---------------------------------------------------------------------------
# io.StringIO reads/writes unicode objects for both Python 2.7 and 3.x. For
# 2.7 we'll convert any string values to unicode objects before storing them
# in the StringIO
import io
class Utf8EncodingStream(io.StringIO):
pass
def textfile_open(filename, mode='rt'):
"""
Simple wrapper around open() that will use codecs.open on Python2 and
on Python3 will add the encoding parameter to the normal open(). The
mode parameter must include the 't' to put the stream into text mode.
"""
assert 't' in mode
return open(filename, mode, encoding='utf-8')
#---------------------------------------------------------------------------