summaryrefslogtreecommitdiff
path: root/sqlparse
diff options
context:
space:
mode:
Diffstat (limited to 'sqlparse')
-rw-r--r--sqlparse/filters.py35
-rw-r--r--sqlparse/formatter.py10
2 files changed, 39 insertions, 6 deletions
diff --git a/sqlparse/filters.py b/sqlparse/filters.py
index 3bf46d5..762f6ef 100644
--- a/sqlparse/filters.py
+++ b/sqlparse/filters.py
@@ -289,12 +289,21 @@ class ReindentFilter:
full_offset = len(line) - len(self.char * self.width * self.indent)
return full_offset - self.offset
+ def _gentabs(self, offset):
+ result = ''
+ if self.char == '\t':
+ tabs, offset = divmod(offset, self.width)
+ result += self.char * tabs
+ result += ' ' * offset
+
+ return result
+
def nl(self):
"""
Return an indented new line token
"""
# TODO: newline character should be configurable
- ws = '\n' + self.char * (self.indent * self.width + self.offset)
+ ws = '\n' + self._gentabs(self.indent * self.width + self.offset)
return sql.Token(T.Whitespace, ws)
def _split_kwds(self, tlist):
@@ -466,8 +475,28 @@ class ReindentFilter:
ignore = False
for token in identifiers:
if not ignore and not token.ttype:
- tlist.insert_before(token, sql.Token(T.Whitespace,
- " " * offset))
+ prev = tlist.token_prev(token, False)
+ if prev:
+ if prev.ttype == T.Whitespace:
+ value = prev.value
+
+ spaces = 0
+ while value and value[-1] == ' ':
+ value = value[:-1]
+ spaces += 1
+
+ value += self._gentabs(spaces + offset)
+ prev.value = value
+ else:
+ ws = sql.Token(T.Whitespace,
+ self._gentabs(offset))
+ tlist.insert_before(token, ws)
+
+ # Just first identifier
+ else:
+ ws = sql.Token(T.Whitespace, ' ' * offset)
+ tlist.insert_before(token, ws)
+
ignore = token.ttype
# Decrease offset the size of the first token
diff --git a/sqlparse/formatter.py b/sqlparse/formatter.py
index f182850..39e5d28 100644
--- a/sqlparse/formatter.py
+++ b/sqlparse/formatter.py
@@ -9,6 +9,9 @@ from sqlparse import SQLParseError
from sqlparse import filters
+INDENT_WIDTH = 2
+
+
def validate_options(options):
"""Validates options."""
@@ -57,7 +60,7 @@ def validate_options(options):
options['indent_char'] = ' '
# indent_width
- indent_width = options.get('indent_width', 2)
+ indent_width = options.get('indent_width', INDENT_WIDTH)
try:
indent_width = int(indent_width)
except (TypeError, ValueError):
@@ -70,7 +73,7 @@ def validate_options(options):
# right_margin
right_margin = options.get('right_margin', None)
- if right_margin is not None:
+ if right_margin:
try:
right_margin = int(right_margin)
except (TypeError, ValueError):
@@ -112,7 +115,8 @@ def build_filter_stack(stack, options):
stack.enable_grouping()
stack.stmtprocess.append(
filters.ReindentFilter(char=options['indent_char'],
- width=options['indent_width']))
+ width=options['indent_width'],
+ line_width=options['right_margin']))
if options.get('right_margin', False):
stack.enable_grouping()