import sys, os, re 

# fix jupyter book latex output

# TODOs 
# - check, remove full "name": "stderr" {} block?  (grep stderr *ipynb) ???
# 		or whole warning/err empty blocks...
# - replace phi symbol w text in phiflow

# older tests
#ft1 = re.compile(r"’")
#ft2 = re.compile(r"👋")


inf  = "book-in.tex" 
outf = "book-in2.tex"
print("Start fixup latex, "+inf+" -> "+outf+" \n\n")

reSkip = [] ; reSCnt = []
reSkip.append( re.compile(r"catcode") ) ; reSCnt.append( 1 )
reSkip.append( re.compile(r"sepackage{fontspec}") ) ; reSCnt.append( 1 )
reSkip.append( re.compile(r"defaultfontfeatures") ) ; reSCnt.append( 1 )
reSkip.append( re.compile(r"polyglossia") ) ; reSCnt.append( 1 )
reSkip.append( re.compile(r"setmainlanguage{english}") ) ; reSCnt.append( 1 )
reSkip.append( re.compile(r"addto.captionsenglish") ) ; reSCnt.append( 1 )
reSkip.append( re.compile(r"set....font{Free") ) ; reSCnt.append( 7 )
reSkip.append( re.compile(r"ucharclasses") ) ; reSCnt.append( 1 )
reSkip.append( re.compile(r"unicode-math") ) ; reSCnt.append( 1 )

# latex fixup, remove references chapter
reSkip.append( re.compile(r"chapter.References" ) ); reSCnt.append( 1 )
reSkip.append( re.compile(r"detokenize.references.references" ) ); reSCnt.append( 1 )

#reSkip.append( re.compile(r"") ); reSCnt.append( 1 )
#reSkip.append( re.compile(r"") ); reSCnt.append( 1 )
#reSkip.append( re.compile(r"") ); reSCnt.append( 1 )

# ugly, manually fix citations in captions one by one
# need manual IDs!
recs = []; rect = []
# ID4 CTS
#recs.append( re.compile(r"parametrized GAN {\[}.hyperlink{cite.references:id4}{CTS.21}{\]}" ) )
recs.append( re.compile(r"parametrized GAN {\[}.hyperlink{cite.references:id5}{CTS.21}{\]}" ) )
rect.append( "parametrized GAN {[}\\\\protect\\\\hyperlink{cite.references:id5}{CTS+21}{]}" )
# ID8 WKA
recs.append( re.compile(r"example prediction from ....hyperlink.cite.references:id9..WKA.20...." ) )
rect.append( 'example prediction from {[}\\\\protect\\\\hyperlink{cite.references:id9}{WKA+20}{]}' ) # note, quad \ needed!
# ID14 UPTK
recs.append( re.compile(r"approach using continuous convolutions {.}.hyperlink{cite.references:id15}{UPTK19}{.}" ) )
rect.append( "approach using continuous convolutions {[}\\\\protect\\\\hyperlink{cite.references:id15}{UPTK19}{]}" )

# fixup unicode symbols 
# compare book-in2.tex -> book.tex after iconv 

recs.append( re.compile(r"’" ) ) # unicode ' 
rect.append( "\'" )

recs.append( re.compile(r"Φ") ) # phiflow , ... differentiable simulation framework ...
rect.append( "$\\\\phi$" )

recs.append( re.compile(r"“") ) # "..."
rect.append( "``" )

recs.append( re.compile(r"”") )
rect.append( "\'\'" )

recs.append( re.compile(r"–") )
rect.append( "-" )

recs.append( re.compile(r"…") )
rect.append( "..." )

recs.append( re.compile(r"‘") )
rect.append( "'" )

recs.append( re.compile(r" ") ) # weird spaces in bib?
rect.append( " " )

# recs.append( re.compile(r"") )
# rect.append( "" )

# recs.append( re.compile(r"") )
# rect.append( "" )

# recs.append( re.compile(r"") )
# rect.append( "" )


# fixup title , cumbersome...

# fix backslashes...  saves at least typing a few of them! still needs manual \ -> \\ , could be done better
tt =( 'hrule\n' + 
	'\\vspace{3cm}\n' + 
	'\\begin{center}\n' + 
	'\\sphinxstylestrong{\\Huge \\textsf{Physics-based Deep Learning}} \\\\ \\vspace{0.5cm} \n' + 
	'\\sphinxstylestrong{\\LARGE \\textsf{\\url{http://physicsbaseddeeplearning.org}}} \\\\ \\vspace{2cm} \n' + 
	'\\noindent\\sphinxincludegraphics[height=420\\sphinxpxdimen]{{logo-xl}.jpg} \\\\ \\vspace{1cm} \n' + 
	'\\textsf{\\large N. Thuerey, P. Holl, M. Mueller, P. Schnell, F. Trost, K. Um} \n' + 
	'\\\\ \\ \\\\ {\\Large(v0.2)} \n' +   # manually update version!
	'\\end{center}\n' )

#print(tt);
recBST1 = re.compile(r"\\") 
recBST1t = '\\\\\\\\'  
tt = recBST1.sub( recBST1t, tt )  # replace all
#print(tt); exit(1)

# skip html version logo-xl , todo: remove figure env around it, move divider-mult image above "Coming up" para
reSkip.append( re.compile(r"noindent.sphinxincludegraphics..logo-xl..jpg" ) ); reSCnt.append( 1 )

# insert instead of sphinx version
recs.append( re.compile(r"sphinxmaketitle") )
rect.append( tt )

# remove authors
recs.append( re.compile(r"author{.*}") )
rect.append( 'author{}' )

# center date
recs.append( re.compile(r"date{(.*)}") )
rect.append( r'date{\\centering{\1}}' )

#print(len(rect))
#print(len(recs))
#exit(1)

# sanity check
if len(rect) != len(recs):
	print("Error rect and recs len have to match!"); exit(1)

recsCnt = []
for n in range(len(recs)):
    recsCnt.append(0)

# ---

# only do replacements via recs for book.tex , via applyRecs=True
def parseF(inf,outf,reSkip,reSCnt,applyRecs=False):
	print("Fixup, "+inf+" -> "+outf+" ")

	if len(reSkip) != len(reSCnt): # sanity check
		print("Error for "+inf+" reSkip cnt: " + format([ len(reSkip), len(reSCnt) ]) )
		exit(1)

	with open(outf, 'w') as fout:
		with open(inf, 'r') as f:
			c = 0
			skip = 0
			skipTot = 0
			for line in iter(f.readline, ''):

				# skip lines?
				rSkip = -1
				if skip==0:
					for r in range(len(reSkip)):
						t = reSkip[r].search(str(line))
						if t is not None:
							#print(format(c)+" skip due to '" + format(t) +"',  RE #"+format(r)+" , skip "+format(reSCnt[r]) )  # debug
							skip = reSCnt[r]
							skipTot += reSCnt[r]
							rSkip = r

				if skip>0:
					skip = skip-1
					fout.write("% SKIP due to RE #"+format(rSkip)+" , L"+format(reSCnt[rSkip]) +"   "+line)
					#print("S "+line[:-1]) # debug
				else:
					if applyRecs:
						# fix captions and apply other latex replacements
						#print(len(rect)); print(len(recs))
						for i in range(len(recs)):
							ric = len( recs[i].findall( line ) )
							#if ric>0: print(ric)
							recsCnt[i] += ric  # count, for sanity check
							line = recs[i].sub( rect[i], line )  # replace all

					fout.write(line)
					#print(line[:-1]) # debug

				c = c+1

				# line = re.sub('’', '\'', str(line))
				# line = re.sub('[abz]', '.', str(line))

				# t = ft3.search(str(line))
				# if t is not None:
				# 	print("H " + format(t) +"  "+ format(t.group(0)) )

				# t = fte.search(str(line))
				# if t is not None:
				# 	print("E " + format(t) + format(t.group(0)) )
	print("Fixup -> "+outf+" done, skips: "+format(skipTot)  +" \n")

parseF(inf,outf,reSkip,reSCnt,applyRecs=True)

haveError = False; recsCntT = 0
for i in range(len(recs)):
	recsCntT += recsCnt[i]
	if(recsCnt[i]==0):
		print("Error, re %d , '%s' not found!" % (i,recs[i]))
		haveError = True

if haveError: 
	print("Some REs were not found, maybe cite.references:idX is wrong! Those have to be manually checked")
	exit(1)
else:
	print("book-in2: %d re replacements\n" % (recsCntT) )

# print("debug exit!"); exit(1)

#---

inf  = "sphinxmessages-in.sty" 
outf = "sphinxmessages.sty"

reSkip = [] ; reSCnt = []
reSkip.append( re.compile(r"addto.captionsenglish") ) ; reSCnt.append( 1 )

parseF(inf,outf,reSkip,reSCnt)

#---

inf  = "book-in.aux" 
outf = "book.aux"

# remove selectlang eng statements from book aux
reSkip = [] ; reSCnt = []
reSkip.append( re.compile(r"selectlanguage...english") ) ; reSCnt.append( 1 )

parseF(inf,outf,reSkip,reSCnt)

#---

# same, selectlanguage for toc
inf  = "book-in.toc" 
outf = "book.toc"
parseF(inf,outf,reSkip,reSCnt)

#---

# disable for now? keep openRight
if 0:
	inf  = "sphinxmanual-in.cls" 
	outf = "sphinxmanual.cls"

	# remove openright option from style
	reSkip = [] ; reSCnt = []
	reSkip.append( re.compile(r"PassOptionsToClass.openright...sphinxdocclass") ) ; reSCnt.append( 1 )

	parseF(inf,outf,reSkip,reSCnt)