@@ -90,6 +90,7 @@ def __init__(self):
90
90
'lynx'
91
91
]
92
92
self .URL_BROWSER = None
93
+ self .GUI_VIEWER = 'preview'
93
94
self .NOTE_PATH = os .path .join (os .getenv ("HOME" ), 'inbox.org' )
94
95
95
96
def browser_detect (self ):
@@ -354,7 +355,7 @@ def prev_chap(self, count=1):
354
355
355
356
def parse_pagelabels (self ):
356
357
if self .isPDF :
357
- from pdfrw import PdfReader , PdfWriter
358
+ from pdfrw import PdfReader
358
359
from pagelabels import PageLabels , PageLabelScheme
359
360
360
361
reader = PdfReader (self .filename )
@@ -364,6 +365,29 @@ def parse_pagelabels(self):
364
365
labels = []
365
366
return labels
366
367
368
+ def set_pagelabel (self ,count ,style = "arabic" ):
369
+ if self .isPDF :
370
+ from pdfrw import PdfReader , PdfWriter
371
+ from pagelabels import PageLabels , PageLabelScheme
372
+ reader = PdfReader (self .filename )
373
+ labels = PageLabels .from_pdf (reader )
374
+ newlabels = PageLabels ()
375
+ for label in labels :
376
+ if label .startpage != self .page :
377
+ newlabels .append (label )
378
+
379
+ newlabel = PageLabelScheme (startpage = self .page ,
380
+ style = style ,
381
+ prefix = "" ,
382
+ firstpagenum = count )
383
+ newlabels .append (newlabel )
384
+ newlabels .write (reader )
385
+
386
+ writer = PdfWriter ()
387
+ writer .trailer = reader
388
+ print ("writing new pagelabels..." )
389
+ writer .write (self .filename )
390
+
367
391
# unused; using pdfrw instead
368
392
def parse_pagelabels_pure (self ):
369
393
cat = self ._getPDFroot ()
@@ -601,7 +625,7 @@ def display_page(self, bar, p, display=True):
601
625
# calculate place in pixels, convert to cells
602
626
pix_x = (dw / 2 ) - (zw / 2 )
603
627
pix_y = (dh / 2 ) - (zh / 2 )
604
- l_col = int (pix_x / scr .cell_width )
628
+ l_col = int (pix_x / scr .cell_width ) + 1
605
629
t_row = int (pix_y / scr .cell_height )
606
630
r_col = l_col + int (zw / scr .cell_width )
607
631
b_row = t_row + int (zh / scr .cell_height )
@@ -1020,9 +1044,11 @@ def __init__(self):
1020
1044
self .TOGGLE_ALPHA = {ord ('A' )}
1021
1045
self .TOGGLE_INVERT = {ord ('i' )}
1022
1046
self .TOGGLE_TINT = {ord ('d' )}
1023
- self .SET_PAGE = {ord ('P' )}
1047
+ self .SET_PAGE_LABEL = {ord ('P' )}
1048
+ self .SET_PAGE_ALT = {ord ('I' )}
1024
1049
self .INC_FONT = {ord ('=' )}
1025
1050
self .DEC_FONT = {ord ('-' )}
1051
+ self .OPEN_GUI = {ord ('X' )}
1026
1052
self .REFRESH = {18 , curses .KEY_RESIZE } # CTRL-R
1027
1053
self .QUIT = {3 , ord ('q' )}
1028
1054
self .DEBUG = {ord ('D' )}
@@ -1119,10 +1145,17 @@ def path_from_citekey(citekey):
1119
1145
raise SystemExit ('No file for ' + citekey )
1120
1146
paths = paths .split (';' )
1121
1147
exts = ['.pdf' , '.xps' , '.cbz' , '.fb2' ]
1122
- extsf = ['.epub' , '.oxps' ]
1123
- paths = [path for path in paths if path [- 4 :] in exts or path [- 5 :] in extsf ]
1124
- if len (paths ) != 0 :
1125
- return paths [0 ]
1148
+ extsf = ['.epub' , '.oxps' ]
1149
+ extsl = ['.html' ]
1150
+ best = [path for path in paths if path [- 4 :] in exts ]
1151
+ okay = [path for path in paths if path [- 5 :] in extsf ]
1152
+ worst = [path for path in paths if path [- 5 :] in extsl ]
1153
+ if len (best ) != 0 :
1154
+ return best [0 ]
1155
+ elif len (okay ) != 0 :
1156
+ return okay [0 ]
1157
+ elif len (worst ) != 0 :
1158
+ return worst [0 ]
1126
1159
return None
1127
1160
1128
1161
# Command line helper functions
@@ -1190,7 +1223,14 @@ def parse_args(args):
1190
1223
opts ['citekey' ] = citekey
1191
1224
path = path_from_citekey (citekey )
1192
1225
if path :
1193
- files += [path ]
1226
+ if path [- 5 :] == '.html' :
1227
+ subprocess .run ([config .URL_BROWSER , path ], check = True )
1228
+ print ("Opening html file in browser" )
1229
+ elif path [- 5 :] == '.docx' :
1230
+ # TODO: support for docx files
1231
+ raise SystemExit ('Cannot open ' + path )
1232
+ else :
1233
+ files += [path ]
1194
1234
else :
1195
1235
raise SystemExit ('No file for ' + citekey )
1196
1236
skip = True
@@ -1205,6 +1245,9 @@ def parse_args(args):
1205
1245
else :
1206
1246
raise SystemExit ('Can\' t open file: ' + arg )
1207
1247
1248
+ if len (files ) == 0 :
1249
+ raise SystemExit ('No file to open' )
1250
+
1208
1251
return files , opts
1209
1252
1210
1253
@@ -1632,11 +1675,22 @@ def view(doc):
1632
1675
count_string = ""
1633
1676
stack = [0 ]
1634
1677
1635
- elif key in keys .SET_PAGE :
1636
- doc .first_page_offset = count - doc .page
1678
+ elif key in keys .SET_PAGE_LABEL :
1679
+ if doc .isPDF :
1680
+ doc .set_pagelabel (count ,'arabic' )
1681
+ else :
1682
+ doc .first_page_offset = count - doc .page
1637
1683
doc .pages_to_logical_pages ()
1638
1684
count_string = ""
1639
1685
stack = [0 ]
1686
+
1687
+ elif key in keys .SET_PAGE_ALT :
1688
+ if doc .isPDF :
1689
+ doc .set_pagelabel (count ,'roman lowercase' )
1690
+ else :
1691
+ doc .first_page_offset = count - doc .page
1692
+ doc .pages_to_logical_pages ()
1693
+ count_string = ""
1640
1694
1641
1695
elif key == ord ('/' ):
1642
1696
scr .place_string (1 ,scr .rows ,"/" )
@@ -1647,6 +1701,9 @@ def view(doc):
1647
1701
curses .noecho ()
1648
1702
bar .message = doc .search_text (search_text )
1649
1703
1704
+ elif key in keys .OPEN_GUI :
1705
+ subprocess .run ([config .GUI_VIEWER , doc .filename ], check = True )
1706
+
1650
1707
elif key in keys .DEBUG :
1651
1708
pass
1652
1709
0 commit comments