Show More
@@ -0,0 +1,83 b'' | |||||
|
1 | from os.path import abspath, dirname, join | |||
|
2 | ||||
|
3 | from IPython.terminal.interactiveshell import KeyBindingManager | |||
|
4 | ||||
|
5 | ||||
|
6 | def name(c): | |||
|
7 | s = c.__class__.__name__ | |||
|
8 | return log_filters[s] if s in log_filters.keys() else s | |||
|
9 | ||||
|
10 | ||||
|
11 | def sentencize(s): | |||
|
12 | """Extract first sentence | |||
|
13 | """ | |||
|
14 | s = s.replace('\n', ' ').strip().split('.') | |||
|
15 | s = s[0] if len(s) else s | |||
|
16 | try: | |||
|
17 | return " ".join(s.split()) | |||
|
18 | except AttributeError: | |||
|
19 | return s | |||
|
20 | ||||
|
21 | ||||
|
22 | def most_common(lst, n=3): | |||
|
23 | """Most common elements occurring more then `n` times | |||
|
24 | """ | |||
|
25 | from collections import Counter | |||
|
26 | ||||
|
27 | c = Counter(lst) | |||
|
28 | return [k for (k, v) in c.items() if k and v > n] | |||
|
29 | ||||
|
30 | ||||
|
31 | def multi_filter_str(flt): | |||
|
32 | """Yield readable conditional filter | |||
|
33 | """ | |||
|
34 | assert hasattr(flt, 'filters'), 'Conditional filter required' | |||
|
35 | ||||
|
36 | yield name(flt) | |||
|
37 | for subfilter in flt.filters: | |||
|
38 | yield name(subfilter) | |||
|
39 | if hasattr(subfilter, 'filter'): | |||
|
40 | yield name(subfilter.filter) | |||
|
41 | ||||
|
42 | ||||
|
43 | log_filters = dict(_AndList='(And)', _OrList='(Or)', _Invert='(Inv)') | |||
|
44 | ||||
|
45 | kbm = KeyBindingManager.for_prompt() | |||
|
46 | ipy_bindings = kbm.registry.key_bindings | |||
|
47 | ||||
|
48 | dummy_docs = [] # ignore bindings without proper documentation | |||
|
49 | ||||
|
50 | common_docs = most_common([kb.handler.__doc__ for kb in ipy_bindings]) | |||
|
51 | if common_docs: | |||
|
52 | dummy_docs.extend(common_docs) | |||
|
53 | ||||
|
54 | dummy_docs = list(set(dummy_docs)) | |||
|
55 | ||||
|
56 | single_filter = dict() | |||
|
57 | multi_filter = dict() | |||
|
58 | for kb in ipy_bindings: | |||
|
59 | doc = kb.handler.__doc__ | |||
|
60 | if not doc or doc in dummy_docs: | |||
|
61 | continue | |||
|
62 | ||||
|
63 | shortcut = ' '.join([k if isinstance(k, str) else k.name for k in kb.keys]) | |||
|
64 | shortcut += shortcut.endswith('\\') and '\\' or '' | |||
|
65 | if hasattr(kb.filter, 'filters'): | |||
|
66 | flt = ' '.join(multi_filter_str(kb.filter)) | |||
|
67 | multi_filter[(shortcut, flt)] = sentencize(doc) | |||
|
68 | else: | |||
|
69 | single_filter[(shortcut, name(kb.filter))] = sentencize(doc) | |||
|
70 | ||||
|
71 | ||||
|
72 | if __name__ == '__main__': | |||
|
73 | ||||
|
74 | here = abspath(dirname(__file__)) | |||
|
75 | dest = join(here, 'source', 'config', 'shortcuts') | |||
|
76 | ||||
|
77 | with open(join(dest, 'single_filtered.csv'), 'w') as csv: | |||
|
78 | for k, v in sorted(single_filter.items()): | |||
|
79 | csv.write(':kbd:`{}`\t{}\t{}\n'.format(k[0], k[1], v)) | |||
|
80 | ||||
|
81 | with open(join(dest, 'multi_filtered.csv'), 'w') as csv: | |||
|
82 | for k, v in sorted(multi_filter.items()): | |||
|
83 | csv.write(':kbd:`{}`\t{}\t{}\n'.format(k[0], k[1], v)) |
@@ -0,0 +1,25 b'' | |||||
|
1 | ================= | |||
|
2 | IPython shortcuts | |||
|
3 | ================= | |||
|
4 | ||||
|
5 | Available shortcut in IPython terminal. | |||
|
6 | ||||
|
7 | ||||
|
8 | Single Filtered shortcuts | |||
|
9 | ========================= | |||
|
10 | ||||
|
11 | .. csv-table:: | |||
|
12 | :header: Shortcut,Filter,Description | |||
|
13 | :widths: 30, 30, 100 | |||
|
14 | :delim: tab | |||
|
15 | :file: single_filtered.csv | |||
|
16 | ||||
|
17 | ||||
|
18 | Multi Filtered shortcuts | |||
|
19 | ========================= | |||
|
20 | ||||
|
21 | .. csv-table:: | |||
|
22 | :header: Shortcut,Filter,Description | |||
|
23 | :widths: 30, 30, 100 | |||
|
24 | :delim: tab | |||
|
25 | :file: multi_filtered.csv |
@@ -42,6 +42,7 b' clean_api:' | |||||
42 | clean: clean_api |
|
42 | clean: clean_api | |
43 | -rm -rf build/* dist/* |
|
43 | -rm -rf build/* dist/* | |
44 | -rm -f $(SRCDIR)/config/options/config-generated.txt |
|
44 | -rm -f $(SRCDIR)/config/options/config-generated.txt | |
|
45 | -rm -f $(SRCDIR)/config/shortcuts/*.csv | |||
45 | -rm -f $(SRCDIR)/interactive/magics-generated.txt |
|
46 | -rm -f $(SRCDIR)/interactive/magics-generated.txt | |
46 |
|
47 | |||
47 | pdf: latex |
|
48 | pdf: latex | |
@@ -59,8 +60,8 b' dist: html' | |||||
59 | cp -al build/html . |
|
60 | cp -al build/html . | |
60 | @echo "Build finished. Final docs are in html/" |
|
61 | @echo "Build finished. Final docs are in html/" | |
61 |
|
62 | |||
62 | html: api autoconfig automagic |
|
63 | html: api autoconfig automagic autogen_shortcuts | |
63 | html_noapi: clean_api autoconfig automagic |
|
64 | html_noapi: clean_api autoconfig automagic autogen_shortcuts | |
64 |
|
65 | |||
65 | html html_noapi: |
|
66 | html html_noapi: | |
66 | mkdir -p build/html build/doctrees |
|
67 | mkdir -p build/html build/doctrees | |
@@ -76,7 +77,7 b' source/interactive/magics-generated.txt: autogen_magics.py' | |||||
76 |
|
77 | |||
77 | autoconfig: source/config/options/config-generated.txt |
|
78 | autoconfig: source/config/options/config-generated.txt | |
78 |
|
79 | |||
79 | source/config/options/generated: |
|
80 | source/config/options/config-generated.txt: | |
80 | $(PYTHON) autogen_config.py |
|
81 | $(PYTHON) autogen_config.py | |
81 | @echo "Created docs for config options" |
|
82 | @echo "Created docs for config options" | |
82 |
|
83 | |||
@@ -86,6 +87,10 b' source/api/generated/gen.txt:' | |||||
86 | $(PYTHON) autogen_api.py |
|
87 | $(PYTHON) autogen_api.py | |
87 | @echo "Build API docs finished." |
|
88 | @echo "Build API docs finished." | |
88 |
|
89 | |||
|
90 | autogen_shortcuts: | |||
|
91 | $(PYTHON) autogen_shortcuts.py | |||
|
92 | @echo "Created docs for shortcuts" | |||
|
93 | ||||
89 | pickle: |
|
94 | pickle: | |
90 | mkdir -p build/pickle build/doctrees |
|
95 | mkdir -p build/pickle build/doctrees | |
91 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle |
|
96 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle |
@@ -25,6 +25,7 b' FOR %%L IN (html html_noapi pickle htmlhelp latex changes linkcheck) DO (' | |||||
25 | MD build\%1 || GOTO DIR_EXIST |
|
25 | MD build\%1 || GOTO DIR_EXIST | |
26 | %PYTHON% autogen_config.py && ECHO Created docs for config options |
|
26 | %PYTHON% autogen_config.py && ECHO Created docs for config options | |
27 | %PYTHON% autogen_magics.py && ECHO Created docs for line ^& cell magics |
|
27 | %PYTHON% autogen_magics.py && ECHO Created docs for line ^& cell magics | |
|
28 | %PYTHON% autogen_shortcuts.py && ECHO Created docs for shortcuts | |||
28 | IF NOT "%1" == "html_noapi" ( |
|
29 | IF NOT "%1" == "html_noapi" ( | |
29 | %PYTHON% autogen_api.py && ECHO Build API docs finished |
|
30 | %PYTHON% autogen_api.py && ECHO Build API docs finished | |
30 | %SPHINXBUILD% -b %1 %ALLSPHINXOPTS% build\%1 |
|
31 | %SPHINXBUILD% -b %1 %ALLSPHINXOPTS% build\%1 |
1 | NO CONTENT: modified file chmod 100644 => 100755 |
|
NO CONTENT: modified file chmod 100644 => 100755 |
General Comments 0
You need to be logged in to leave comments.
Login now