Skip to content

Commit 3decf0c

Browse files
committed
Initial commit
0 parents  commit 3decf0c

10 files changed

Lines changed: 1618 additions & 0 deletions

File tree

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
__pycache__/
2+
.venv/
3+
venv/
4+
build/
5+
dist/
6+
output.txt
7+
src/PyColumnizer.egg-info/

LICENSE

Lines changed: 674 additions & 0 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 350 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,350 @@
1+
# 📃 PyColumnizer
2+
3+
## Classic UNIX-style real-time text formatter with unicode and pipe support
4+
5+
> This program allows you to format one / multiple files or piped stream in the format of classic UNIX docs,
6+
> splitting them into columns, adding line numbers, header, etc. Formatting is done line by line in real time
7+
> (i.e., the output of the program can also be piped to another program)
8+
> In fact, this is an improved version of the "pr" command with Unicode support
9+
10+
----------
11+
12+
## 🏗️ Get started
13+
14+
### Install using pip
15+
16+
```shell
17+
pip install git+https://github.com/F33RNI/PyColumnizer.git
18+
columnizer -h
19+
```
20+
21+
### Build using PyInstaller
22+
23+
```shell
24+
pip install pyinstaller
25+
pyinstaller main.spec
26+
./dist/columnizer -h
27+
```
28+
29+
### Run as python script
30+
31+
```shell
32+
python main.py -h
33+
```
34+
35+
----------
36+
37+
## 📃 Usage
38+
39+
```text
40+
usage: columnizer [-h] [-c COLUMNS] [-w WIDTH] [-p PAGE_SIZE] [-t TITLE] [-s SEPARATOR] [-j] [-a] [-d DATE]
41+
[--date-format DATE_FORMAT] [--first-line-number FIRST_LINE_NUMBER]
42+
[--first-page-number FIRST_PAGE_NUMBER] [--lines-before-header LINES_BEFORE_HEADER]
43+
[--lines-after-header LINES_AFTER_HEADER] [--lines-after-page LINES_AFTER_PAGE]
44+
[--line-number-placeholder LINE_NUMBER_PLACEHOLDER]
45+
[--page-number-placeholder PAGE_NUMBER_PLACEHOLDER] [--no-line-numbers] [--no-page-numbers]
46+
[--no-date] [--no-header] [--skip-empty-lines] [--single-page] [-v]
47+
[FILE ...]
48+
49+
classic UNIX-style real-time text formatter with unicode and pipe support
50+
51+
positional arguments:
52+
FILE files to read, if empty, stdin is used
53+
54+
options:
55+
-h, --help show this help message and exit
56+
-c COLUMNS, --columns COLUMNS
57+
Number of columns (default: 2)
58+
-w WIDTH, --width WIDTH
59+
total width of each line (default: 80)
60+
-p PAGE_SIZE, --page-size PAGE_SIZE
61+
total lines per page (including header and lines-after-page) (default: 68)
62+
-t TITLE, --title TITLE
63+
text title
64+
-s SEPARATOR, --separator SEPARATOR
65+
column separator (default: 4 whitespaces)
66+
-j, --justify justify each line in each column
67+
-a, --across print columns across rather than down
68+
-d DATE, --date DATE title date in YYYY-MM-DD:HH:mm format (default: current date)
69+
--date-format DATE_FORMAT
70+
title date format (default: %Y-%m-%d %H:%M)
71+
--first-line-number FIRST_LINE_NUMBER
72+
counter at first line (default: 1)
73+
--first-page-number FIRST_PAGE_NUMBER
74+
counter at first page (default: 1)
75+
--lines-before-header LINES_BEFORE_HEADER
76+
number of empty lines before header (default: 2)
77+
--lines-after-header LINES_AFTER_HEADER
78+
number of empty lines after header (default: 2)
79+
--lines-after-page LINES_AFTER_PAGE
80+
number of empty lines between pages (default: 5)
81+
--line-number-placeholder LINE_NUMBER_PLACEHOLDER
82+
Placeholder for line number (default: "{line:>5} ")
83+
--page-number-placeholder PAGE_NUMBER_PLACEHOLDER
84+
Placeholder for page number (default: "Page: {page}")
85+
--no-line-numbers turn off line numbering
86+
--no-page-numbers turn off page numbering
87+
--no-date turn off date in header
88+
--no-header turn off entire header
89+
--skip-empty-lines ignore empty lines
90+
--single-page turn off page separation
91+
-v, --version show program's version number and exit
92+
```
93+
94+
----------
95+
96+
## 📝 Examples
97+
98+
> You can download example text from this repo. See `text.txt` file
99+
100+
### Basic example (2 columns, custom page size, title)
101+
102+
```shell
103+
columnizer -c 2 -p 30 -t "Example text" text.txt > output.txt
104+
```
105+
106+
> If you want to get output in console instead of a file, remove `> output.txt`
107+
>
108+
> You can specify multiple input files. For that use `text.txt text2.txt path/to/text3.txt` instead of `text.txt`
109+
110+
<details>
111+
<summary>output.txt</summary>
112+
113+
```text
114+
115+
116+
2024-01-17 12:45 Example text Page: 1
117+
118+
119+
1 Lorem ipsum dolor sit amet, 21 urna condimentum mattis
120+
2 consectetur adipiscing elit, 22 pellentesque id. Et malesuada
121+
3 sed do eiusmod tempor 23 fames ac turpis egestas sed
122+
4 incididunt ut labore et dolore 24 tempus urna et.
123+
5 magna aliqua. Ut placerat orci 25
124+
6 nulla pellentesque dignissim 26 Enim praesent elementum
125+
7 enim. Feugiat pretium nibh 27 facilisis leo. Porttitor lacus
126+
8 ipsum consequat nisl vel 28 luctus accumsan tortor
127+
9 pretium. Parturient montes 29 posuere. Ornare arcu odio ut
128+
10 nascetur ridiculus mus mauris 30 sem nulla pharetra. Porta
129+
11 vitae ultricies leo integer. 31 lorem mollis aliquam ut
130+
12 Non diam phasellus vestibulum 32 porttitor. Libero volutpat sed
131+
13 lorem sed. Morbi tincidunt 33 cras ornare arcu dui. Netus et
132+
14 augue interdum velit euismod. 34 malesuada fames ac turpis
133+
15 Sit amet massa vitae tortor 35 egestas integer. Dictum sit
134+
16 condimentum lacinia quis vel. 36 amet justo donec. Nisi est sit
135+
17 Sodales ut eu sem integer 37 amet facilisis magna etiam.
136+
18 vitae. Ac turpis egestas 38 Malesuada pellentesque elit
137+
19 integer eget aliquet nibh 39 eget gravida. At elementum eu
138+
20 praesent tristique. Tellus at 40 facilisis sed odio morbi quis
139+
140+
141+
142+
143+
144+
145+
146+
2024-01-17 12:45 Example text Page: 2
147+
148+
149+
41 commodo. Ut venenatis tellus
150+
42 in metus vulputate eu
151+
43 scelerisque felis imperdiet.
152+
44 Donec ac odio tempor orci
153+
45 dapibus. Non arcu risus quis
154+
46 varius quam. Dignissim diam
155+
47 quis enim lobortis scelerisque
156+
48 fermentum dui faucibus. Et
157+
49 tortor at risus viverra
158+
50 adipiscing at in tellus
159+
51 integer.
160+
161+
162+
163+
164+
165+
166+
167+
168+
169+
170+
171+
172+
173+
174+
175+
```
176+
177+
</details>
178+
179+
### No paging, single column
180+
181+
```shell
182+
columnizer -c 1 -t "Example text" --single-page text.txt > output.txt
183+
```
184+
185+
> If `--single-page` is specified, in normal mode (not `--across`) only the first column will be filled in,
186+
> because formatting occurs in real time and PyColumnizer does not know the final amount of text in order
187+
> to divide it into columns
188+
189+
<details>
190+
<summary>output.txt</summary>
191+
192+
```text
193+
194+
195+
2024-01-17 12:47 Example text
196+
197+
198+
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
199+
2 tempor incididunt ut labore et dolore magna aliqua. Ut placerat orci
200+
3 nulla pellentesque dignissim enim. Feugiat pretium nibh ipsum consequat
201+
4 nisl vel pretium. Parturient montes nascetur ridiculus mus mauris vitae
202+
5 ultricies leo integer. Non diam phasellus vestibulum lorem sed. Morbi
203+
6 tincidunt augue interdum velit euismod. Sit amet massa vitae tortor
204+
7 condimentum lacinia quis vel. Sodales ut eu sem integer vitae. Ac turpis
205+
8 egestas integer eget aliquet nibh praesent tristique. Tellus at urna
206+
9 condimentum mattis pellentesque id. Et malesuada fames ac turpis egestas
207+
10 sed tempus urna et.
208+
11
209+
12 Enim praesent elementum facilisis leo. Porttitor lacus luctus accumsan
210+
13 tortor posuere. Ornare arcu odio ut sem nulla pharetra. Porta lorem
211+
14 mollis aliquam ut porttitor. Libero volutpat sed cras ornare arcu dui.
212+
15 Netus et malesuada fames ac turpis egestas integer. Dictum sit amet
213+
16 justo donec. Nisi est sit amet facilisis magna etiam. Malesuada
214+
17 pellentesque elit eget gravida. At elementum eu facilisis sed odio morbi
215+
18 quis commodo. Ut venenatis tellus in metus vulputate eu scelerisque
216+
19 felis imperdiet. Donec ac odio tempor orci dapibus. Non arcu risus quis
217+
20 varius quam. Dignissim diam quis enim lobortis scelerisque fermentum dui
218+
21 faucibus. Et tortor at risus viverra adipiscing at in tellus integer.
219+
220+
```
221+
222+
</details>
223+
224+
### 3 columns, across formatting, custom width, date format, separator, line numbering and header
225+
226+
```shell
227+
columnizer -a -c 3 -w 100 -p 25 --date-format "%d.%m.%Y" -s " - " -t "Example text" --line-number-placeholder "{line:>2} " --first-line-number 0 --lines-before-header 0 --lines-after-header 1 text.txt > output.txt
228+
```
229+
230+
> If `-a` or `--across` is specified, the text will be divided into columns from left to right,
231+
> then from top to bottom
232+
233+
<details>
234+
<summary>output.txt</summary>
235+
236+
```text
237+
17.01.2024 Example text Page: 1
238+
239+
0 Lorem ipsum dolor sit amet, - 1 consectetur adipiscing elit, - 2 sed do eiusmod tempor
240+
3 incididunt ut labore et - 4 dolore magna aliqua. Ut - 5 placerat orci nulla
241+
6 pellentesque dignissim enim. - 7 Feugiat pretium nibh ipsum - 8 consequat nisl vel pretium.
242+
9 Parturient montes nascetur - 10 ridiculus mus mauris vitae - 11 ultricies leo integer. Non
243+
12 diam phasellus vestibulum - 13 lorem sed. Morbi tincidunt - 14 augue interdum velit
244+
15 euismod. Sit amet massa - 16 vitae tortor condimentum - 17 lacinia quis vel. Sodales ut
245+
18 eu sem integer vitae. Ac - 19 turpis egestas integer eget - 20 aliquet nibh praesent
246+
21 tristique. Tellus at urna - 22 condimentum mattis - 23 pellentesque id. Et
247+
24 malesuada fames ac turpis - 25 egestas sed tempus urna et. - 26
248+
27 Enim praesent elementum - 28 facilisis leo. Porttitor - 29 lacus luctus accumsan tortor
249+
30 posuere. Ornare arcu odio ut - 31 sem nulla pharetra. Porta - 32 lorem mollis aliquam ut
250+
33 porttitor. Libero volutpat - 34 sed cras ornare arcu dui. - 35 Netus et malesuada fames ac
251+
36 turpis egestas integer. - 37 Dictum sit amet justo donec. - 38 Nisi est sit amet facilisis
252+
39 magna etiam. Malesuada - 40 pellentesque elit eget - 41 gravida. At elementum eu
253+
42 facilisis sed odio morbi - 43 quis commodo. Ut venenatis - 44 tellus in metus vulputate eu
254+
45 scelerisque felis imperdiet. - 46 Donec ac odio tempor orci - 47 dapibus. Non arcu risus quis
255+
48 varius quam. Dignissim diam - 49 quis enim lobortis - 50 scelerisque fermentum dui
256+
51 faucibus. Et tortor at risus - 52 viverra adipiscing at in - 53 tellus integer.
257+
258+
259+
260+
261+
262+
263+
```
264+
265+
</details>
266+
267+
### Justified columns, no header and line numbers, empty lines are skipped
268+
269+
```shell
270+
columnizer -j -c 2 -p 30 -t "Example text" --no-header --no-line-numbers --skip-empty-lines text.txt > output.txt
271+
```
272+
273+
> If `-j` or `--justify` is specified, the text in each column will be justified
274+
>
275+
> If `--skip-empty-lines` is specified, empty lines will not be rendered
276+
277+
<details>
278+
<summary>output.txt</summary>
279+
280+
```text
281+
Lorem ipsum dolor sit amet, fames ac turpis egestas integer.
282+
consectetur adipiscing elit, sed do Dictum sit amet justo donec. Nisi est
283+
eiusmod tempor incididunt ut labore et sit amet facilisis magna etiam.
284+
dolore magna aliqua. Ut placerat orci Malesuada pellentesque elit eget
285+
nulla pellentesque dignissim enim. gravida. At elementum eu facilisis sed
286+
Feugiat pretium nibh ipsum consequat odio morbi quis commodo. Ut venenatis
287+
nisl vel pretium. Parturient montes tellus in metus vulputate eu
288+
nascetur ridiculus mus mauris vitae scelerisque felis imperdiet. Donec ac
289+
ultricies leo integer. Non diam odio tempor orci dapibus. Non arcu
290+
phasellus vestibulum lorem sed. Morbi risus quis varius quam. Dignissim diam
291+
tincidunt augue interdum velit quis enim lobortis scelerisque
292+
euismod. Sit amet massa vitae tortor fermentum dui faucibus. Et tortor at
293+
condimentum lacinia quis vel. Sodales risus viverra adipiscing at in tellus
294+
ut eu sem integer vitae. Ac turpis integer.
295+
egestas integer eget aliquet nibh
296+
praesent tristique. Tellus at urna
297+
condimentum mattis pellentesque id. Et
298+
malesuada fames ac turpis egestas sed
299+
tempus urna et.
300+
Enim praesent elementum facilisis leo.
301+
Porttitor lacus luctus accumsan tortor
302+
posuere. Ornare arcu odio ut sem nulla
303+
pharetra. Porta lorem mollis aliquam
304+
ut porttitor. Libero volutpat sed cras
305+
ornare arcu dui. Netus et malesuada
306+
307+
308+
309+
310+
311+
312+
```
313+
314+
</details>
315+
316+
### Piped input
317+
318+
```shell
319+
echo "Some piped text here\nAnother line\n\nAnd another one after blank line" | columnizer -c 2 -p 15 > output.txt
320+
```
321+
322+
<details>
323+
<summary>output.txt</summary>
324+
325+
```text
326+
327+
328+
2024-01-17 13:23 Page: 1
329+
330+
331+
1 Some piped text here
332+
2 Another line
333+
3
334+
4 And another one after blank
335+
5 line
336+
337+
338+
339+
340+
341+
342+
```
343+
344+
</details>
345+
346+
----------
347+
348+
## ✨ Contribution
349+
350+
- Anyone can contribute! Just create a pull request

0 commit comments

Comments
 (0)