-
Notifications
You must be signed in to change notification settings - Fork 0
/
format_table.py
122 lines (105 loc) · 3.45 KB
/
format_table.py
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python3
from typing import TypeVar
T = TypeVar("T")
table_items = {
"Ada": ".adb",
"Bash": ".sh",
"Batch": ".bat",
"C": ".c",
"C#": ".cs",
"C++": ".cpp",
"Clojure": ".clj",
"CoffeeScript": ".coffee",
"Common Lisp": ".lsp",
"Crystal": ".cr",
"D": ".d",
"Dart": ".dart",
"DogeScript": ".djs",
"Elixir": ".exs",
"F#": ".fsx",
"Fantom": ".fan",
"Forth": ".fth",
"Fortran": ".f90",
"Gadot (GDScript)": ".gd",
"Go": ".go",
"Groovy": ".gvy",
"Haskell": ".hs",
"Java": ".java",
"Java Blocks": ".blk",
"JavaScript": ".js",
"Julia": ".jl",
"Kotlin": ".kt",
"Lua": ".lua",
"Nim": ".nim",
"Objective-C": ".m",
"OCaml": ".ml",
"Pascal": ".pas",
"Perl": ".pl",
"PHP": ".php",
"Powershell": ".ps1",
"Python": ".py",
"R": ".r",
"Racket": ".rkt",
"Reason": ".re",
"Rescript": ".res",
"Ruby": ".rb",
"Rust": ".rs",
"Scala": ".scala",
"Scheme": ".scm",
"Scratch": ".sb3",
"Swift": ".swift",
"Tcl": ".tcl",
"TypeScript": ".ts",
"V": ".v",
"Vala": ".vala",
"Vimscript": ".vim",
"Visual Basic": ".vb",
"Zig": ".zig",
}
def chunk(iterable: list[T], chunk_size: int = 2) -> list[list[T]]:
return [
list(iterable)[i : i + chunk_size] for i in range(0, len(iterable), chunk_size)
]
def get_column_lengths(table: list[str], cols: int) -> list[int]:
return [len(max(i, key=len)) for i in chunk(table, cols)]
def generate_table(pairs: dict[str, str], row_count: int, column_lengths: list[int]):
table = dict(sorted(pairs.items(), key=lambda pair: (pair[0].lower(), pair[1])))
if any([a != b for a, b in zip(pairs.items(), table.items())]):
print("WARNING: table is not sorted")
rows = ["|" for _ in range(row_count)]
current_column = -1
for (i, k), v in zip(enumerate(table), table.values()):
if i % row_count == 0:
current_column += 1
for j in range(row_count):
if i % row_count == j:
rows[j] += (
f" [{k}](BinarytoDecimal{v}) ".ljust(
column_lengths[current_column] + 21
)
+ "|"
)
return rows, rows[0].count("|") - 1
def table_to_string(rows: list[str], cols: int, column_lengths: list[int]) -> str:
assert cols == len(column_lengths), f"{column_lengths =}, {cols =}"
output: str = "| Language" + " " * (column_lengths[0] + 12) + "|"
for i in range(cols - 1):
output += " " * (column_lengths[i + 1] + 21) + "|"
output += "\n|"
for i in range(cols):
output += " " + "-" * (column_lengths[i] + 19) + " |"
return output + "\n" + "\n".join(rows)
def get_factors(number: int):
return [i for i in range(1, number + 1) if number % i == 0]
def write_to_file(filename: str, string: str) -> None:
with open(filename, "w", encoding="utf-8") as f:
f.write(string)
print(f"Output written to `{filename}`")
if __name__ == "__main__":
print(f"{len(table_items)} files, divisible by: {get_factors(len(table_items))}")
row_count = len(table_items) // int(input("Complete columns: "))
column_lengths = get_column_lengths(
["".join((k, v)) for k, v in table_items.items()], row_count
)
rows, cols = generate_table(table_items, row_count, column_lengths)
write_to_file("copy_readme.md", table_to_string(rows, cols, column_lengths))