core.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # @Author: Bachir Soussi Chiadmi <bach>
  4. # @Date: 23-05-2017
  5. # @Email: bachir@figureslibres.io
  6. # @Last modified by: bach
  7. # @Last modified time: 03-06-2017
  8. # @License: GPL-V3
  9. from __future__ import absolute_import, print_function, division, unicode_literals
  10. import os, re, shutil, tempfile
  11. # sys,
  12. from PyQt5 import QtCore
  13. from PyQt5.QtCore import QSettings, QCoreApplication
  14. import json
  15. # import git
  16. # from pygit2 import Repository
  17. from . import server, scsscompiler, md2html
  18. # ______
  19. # / ____/___ ________
  20. # / / / __ \/ ___/ _ \
  21. # / /___/ /_/ / / / __/
  22. # \____/\____/_/ \___/
  23. class Core():
  24. def __init__(self, apppath):
  25. # restore previous preferences
  26. self.appcwd = apppath
  27. self.restorePreferences()
  28. self._mw = False
  29. self.temp = tempfile.mkdtemp()
  30. # print(self.temp)
  31. self.projectname = "Libriis"
  32. self.tempcwd = False
  33. # if ther's not current project folder from restorepref
  34. # initaite a new temp project
  35. if(self.cwd == None or not os.path.isdir(self.cwd)):
  36. self.cwd = os.path.join(self.temp, 'cwd')
  37. self.tempcwd = True
  38. self.initnewproject()
  39. self.initDeamons()
  40. else:
  41. self.initDeamons()
  42. head, tail = os.path.split(self.cwd)
  43. print('tail', tail)
  44. self.projectname = tail
  45. self.loadDocSettings()
  46. def initDeamons(self):
  47. self.server = server.Server(self)
  48. self.scsscompiler = scsscompiler.Compiler(self)
  49. self.contentcompiler = md2html.Compiler(self)
  50. @property
  51. def mainwindow(self):
  52. return self.mainwindow
  53. @mainwindow.setter
  54. def mainwindow(self, mw):
  55. if not self._mw:
  56. self._mw = mw
  57. if not self.tempcwd:
  58. self._mw.setWindowTitle("Libriis – "+self.cwd)
  59. # ____ ____
  60. # / __ \________ / __/____
  61. # / /_/ / ___/ _ \/ /_/ ___/
  62. # / ____/ / / __/ __(__ )
  63. # /_/ /_/ \___/_/ /____/
  64. def restorePreferences(self):
  65. # print("restorePreferences")
  66. settings = QSettings('FiguresLibres', 'Libriis')
  67. # settings.clear()
  68. # print(settings.allKeys())
  69. self.cwd = settings.value('core/cwd', None)
  70. self.dialog_path = settings.value('core/dialog_path', os.path.expanduser('~'))
  71. self.mw_size = settings.value('mainwindow/size', QtCore.QSize(1024, 768))
  72. self.mw_pos = settings.value('mainwindow/pos', QtCore.QPoint(0, 0))
  73. self.mw_curstack = int(settings.value('mainwindow/curstack', 0))
  74. def savePreferences(self):
  75. # print("savePreferences")
  76. settings = QSettings('FiguresLibres', 'Libriis')
  77. # print(settings.allKeys())
  78. if not self.tempcwd:
  79. settings.setValue('core/cwd', self.cwd)
  80. settings.setValue('core/dialog_path', self.dialog_path)
  81. settings.setValue('mainwindow/size', self._mw.size())
  82. settings.setValue('mainwindow/pos', self._mw.pos())
  83. settings.setValue('mainwindow/curstack', self._mw.mainstack.currentIndex())
  84. # ____ _____ __ __ _
  85. # / __ \____ _____ / ___/___ / /_/ /_(_)___ ____ ______
  86. # / / / / __ \/ ___/ \__ \/ _ \/ __/ __/ / __ \/ __ `/ ___/
  87. # / /_/ / /_/ / /__ ___/ / __/ /_/ /_/ / / / / /_/ (__ )
  88. # /_____/\____/\___/ /____/\___/\__/\__/_/_/ /_/\__, /____/
  89. # /____/
  90. def loadDocSettings(self):
  91. print('loadDocSettings')
  92. self.docsettings = json.loads(open(os.path.join(self.cwd,'.config/docsettings.json')).read())
  93. def recordDocSettings(self,docsettings):
  94. # print("doc settings",docsettings)
  95. for key in docsettings:
  96. self.docsettings[key] = docsettings[key]
  97. jsonfilepath = os.path.join(self.cwd,'.config/docsettings.json')
  98. with open(jsonfilepath, "w") as fp:
  99. json.dump(self.docsettings, fp, ensure_ascii=False, indent="\t")
  100. self.updateScss(False)
  101. self.updateJs()
  102. def updateScss(self, reload=True):
  103. # print(self.docsettings)
  104. scssfilepath = os.path.join(self.cwd,'assets/css/setup.scss')
  105. # print(scssfilepath)
  106. scss = open(scssfilepath,"r").read()
  107. sets = {
  108. 'pw':'page-width',
  109. 'ph':'page-height',
  110. 'mt':'page-margin-top',
  111. 'mb':'page-margin-bottom',
  112. 'me':'page-margin-outside',
  113. 'mi':'page-margin-inside',
  114. 'cs':'crop-size',
  115. 'bs':'bleed',
  116. 'cg':'col-gutter',
  117. 'rg':'row-gutter',
  118. 'lh':'line-height'
  119. }
  120. for s in sets:
  121. scss = re.sub(
  122. r'\$'+sets[s]+':\smm2pt\([0-9|\.]+\);',
  123. '$'+sets[s]+': mm2pt('+self.docsettings[s]+');',
  124. scss)
  125. # $col-number: 9;
  126. scss = re.sub(
  127. r'\$col-number:\s[0-9|\.]+;',
  128. '$col-number: '+self.docsettings['cn']+';',
  129. scss)
  130. # $row-number: 12;
  131. scss = re.sub(
  132. r'\$row-number:\s[0-9|\.]+;',
  133. '$row-number: '+self.docsettings['rn']+';',
  134. scss)
  135. #$header-odd: "Libriis, default header";
  136. scss = re.sub(
  137. r'\$header-odd:\s".+";',
  138. '$header-odd: "'+self.docsettings['ho']+'";',
  139. scss)
  140. # $header-even: "Libriis, default header";
  141. scss = re.sub(
  142. r'\$header-even:\s".+";',
  143. '$header-even: "'+self.docsettings['he']+'";',
  144. scss)
  145. # print('scss', scss)
  146. open(scssfilepath,"w").write(scss)
  147. if reload:
  148. self._mw.designstack.webkitview.reload()
  149. def updateJs(self, reload=True):
  150. # print(self.docsettings)
  151. jsfilepath = os.path.join(self.cwd,'assets/js/setup.js')
  152. # print(jsfilepath)
  153. js = open(jsfilepath,"r").read()
  154. # $row-number: 12;
  155. js = re.sub(
  156. r'nb_page=[0-9]+;',
  157. 'nb_page='+str(self.docsettings['np'])+';',
  158. js)
  159. open(jsfilepath,"w").write(js)
  160. if reload:
  161. self._mw.designstack.webkitview.reload()
  162. def addPage(self):
  163. self.docsettings['np'] = int(self.docsettings['np'])+1
  164. self.updateJs()
  165. def rmPage(self):
  166. self.docsettings['np'] = int(self.docsettings['np'])-1
  167. self.updateJs()
  168. # ____ _ __
  169. # / __ \_________ (_)__ _____/ /_
  170. # / /_/ / ___/ __ \ / / _ \/ ___/ __/
  171. # / ____/ / / /_/ / / / __/ /__/ /_
  172. # /_/ /_/ \____/_/ /\___/\___/\__/
  173. # /___/
  174. def initnewproject(self, cwd = None):
  175. print('initnewproject')
  176. if cwd == None :
  177. cwd = self.cwd
  178. shutil.copytree(os.path.join(self.appcwd,'templates/newproject'), cwd)
  179. self.changeCWD(cwd)
  180. self.loadDocSettings()
  181. self.summary = json.loads(open(os.path.join(cwd,'.config/summary.json')).read())
  182. # print('summary', self.summary)
  183. # TODO: try python-pygit2 arch package
  184. # self.repository = git.Repo.init(cwd)
  185. # TODO: set git config user.name & user.email
  186. # self.repository
  187. # self.repository.index.add(['assets','contents','.config'])
  188. # self.repository.index.commit("initial commit")
  189. def saveproject(self, cwd = None):
  190. if not cwd == None:
  191. shutil.copytree(self.cwd, cwd)
  192. self.tempcwd = False
  193. self.changeCWD(cwd)
  194. def openproject(self, cwd=None):
  195. if not cwd == None:
  196. self.changeCWD(cwd)
  197. # __ _______ ______
  198. # _____/ /_ ____ _____ ____ ____ / ____/ | / / __ \
  199. # / ___/ __ \/ __ `/ __ \/ __ `/ _ \/ / | | /| / / / / /
  200. # / /__/ / / / /_/ / / / / /_/ / __/ /___ | |/ |/ / /_/ /
  201. # \___/_/ /_/\__,_/_/ /_/\__, /\___/\____/ |__/|__/_____/
  202. # /____/
  203. def changeCWD(self, cwd):
  204. print('changeCWD :: cwd', cwd)
  205. if not cwd == self.cwd:
  206. self.cwd = cwd
  207. self.server.reload()
  208. self.scsscompiler.reload()
  209. self.contentcompiler.reload()
  210. if not self.tempcwd:
  211. self._mw.setWindowTitle("Libriis – "+self.cwd)
  212. head, tail = os.path.split(self.cwd)
  213. print('changeCWD :: tail', tail)
  214. self.projectname = tail
  215. self._mw.designstack.refresh()
  216. self._mw.contentstack.refresh()
  217. # ____ _ __
  218. # / __ \__ __(_) /_
  219. # / / / / / / / / __/
  220. # / /_/ / /_/ / / /_
  221. # \___\_\__,_/_/\__/
  222. def quit(self):
  223. self.savePreferences()
  224. shutil.rmtree(self.temp, ignore_errors=True)
  225. QCoreApplication.instance().quit()