Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

""" Indentation utilities for Cog. 

http://nedbatchelder.com/code/cog 

 

Copyright 2004-2015, Ned Batchelder. 

""" 

 

from __future__ import absolute_import 

import re 

from .backward import string_types, bytes_types, to_bytes, b 

 

def whitePrefix(strings): 

""" Determine the whitespace prefix common to all non-blank lines 

in the argument list. 

""" 

# Remove all blank lines from the list 

strings = [s for s in strings if s.strip() != ''] 

 

if not strings: return '' 

 

# Find initial whitespace chunk in the first line. 

# This is the best prefix we can hope for. 

pat = r'\s*' 

23 ↛ 25line 23 didn't jump to line 25, because the condition on line 23 was never false if isinstance(strings[0], bytes_types): 

pat = to_bytes(pat) 

prefix = re.match(pat, strings[0]).group(0) 

 

# Loop over the other strings, keeping only as much of 

# the prefix as matches each string. 

for s in strings: 

for i in range(len(prefix)): 

if prefix[i] != s[i]: 

prefix = prefix[:i] 

break 

return prefix 

 

def reindentBlock(lines, newIndent=''): 

""" Take a block of text as a string or list of lines. 

Remove any common whitespace indentation. 

Re-indent using newIndent, and return it as a single string. 

""" 

sep, nothing = '\n', '' 

if isinstance(lines, bytes_types): 

sep, nothing = b('\n'), b('') 

if isinstance(lines, string_types): 

lines = lines.split(sep) 

oldIndent = whitePrefix(lines) 

outLines = [] 

for l in lines: 

if oldIndent: 

l = l.replace(oldIndent, nothing, 1) 

if l and newIndent: 

l = newIndent + l 

outLines.append(l) 

return sep.join(outLines) 

 

def commonPrefix(strings): 

""" Find the longest string that is a prefix of all the strings. 

""" 

if not strings: 

return '' 

prefix = strings[0] 

for s in strings: 

if len(s) < len(prefix): 

prefix = prefix[:len(s)] 

if not prefix: 

return '' 

for i in range(len(prefix)): 

if prefix[i] != s[i]: 

prefix = prefix[:i] 

break 

return prefix