Krita Source Code Documentation
Loading...
Searching...
No Matches
comics_project_management_tools.comics_project_translation_scraper.translation_scraper Class Reference

Public Member Functions

 __init__ (self, projectURL=str(), translation_folder=str(), textLayerNameList=[], projectName=str())
 
 get_svg_layers (self, location)
 
 get_txt (self, string)
 
 parse_pot (self, location)
 
 start (self, pagesList, language, metaData={})
 
 write_pot (self, metaData)
 

Public Attributes

 pageTitleKeys
 
 textLayerNameList
 
 translationDict
 

Static Public Attributes

str languageKey = "AA_language"
 
list pageTitleKeys = []
 
 projectName = str()
 
 projectURL = str()
 
list textLayerNameList = []
 
 translation_folder = str()
 
dict translationDict = {}
 
list translationKeys = []
 

Detailed Description

Definition at line 28 of file comics_project_translation_scraper.py.

Constructor & Destructor Documentation

◆ __init__()

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.__init__ ( self,
projectURL = str(),
translation_folder = str(),
textLayerNameList = [],
projectName = str() )

Definition at line 38 of file comics_project_translation_scraper.py.

38 def __init__(self, projectURL=str(), translation_folder=str(), textLayerNameList=[], projectName=str()):
39 self.projectURL = projectURL
40 self.projectName = projectName
41 self.translation_folder = translation_folder
42 self.textLayerNameList = textLayerNameList
43 self.translationDict = {}
44 self.pageTitleKeys = []
45
46 # Check for a preexisting translation file and parse that.
47 for entry in os.scandir(os.path.join(self.projectURL, self.translation_folder)):
48 if entry.name.endswith(projectName + '.pot') and entry.is_file():
49 self.parse_pot(os.path.join(self.projectURL, self.translation_folder, entry.name))
50 break
51

References comics_project_management_tools.comics_project_manager_docker.comics_project_manager_docker.projectName, comics_project_management_tools.comics_project_translation_scraper.translation_scraper.projectName, comics_project_management_tools.comics_exporter.comicsExporter.projectURL, comics_project_management_tools.comics_project_translation_scraper.translation_scraper.projectURL, and comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translation_folder.

Member Function Documentation

◆ get_svg_layers()

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.get_svg_layers ( self,
location )

Definition at line 118 of file comics_project_translation_scraper.py.

118 def get_svg_layers(self, location):
119 page = zipfile.ZipFile(location, "a")
120 xmlroot = minidom.parseString(page.read("maindoc.xml"))
121 doc = xmlroot.documentElement
122
123 candidates = []
124
125 for member in page.namelist():
126 info = page.getinfo(member)
127 if info.filename.endswith('svg'):
128 candidates.append(info.filename)
129
130 def parseThroughChildNodes(node):
131 for childNode in node.childNodes:
132 if childNode.nodeType != minidom.Node.TEXT_NODE:
133 if childNode.tagName == "layer" and childNode.getAttribute("nodetype") == "shapelayer":
134 isTextLayer = False
135 for t in self.textLayerNameList:
136 if t in childNode.getAttribute("name"):
137 isTextLayer = True
138 if isTextLayer:
139 filename = childNode.getAttribute("filename")
140 for c in candidates:
141 if str(filename + ".shapelayer/content.svg") in c:
142 self.get_txt(page.read(c))
143 if childNode.childNodes:
144 parseThroughChildNodes(childNode)
145
146 parseThroughChildNodes(doc)
147
148 # Get page title if the keywords contain acbf_title
149 xmlroot = minidom.parseString(page.read("documentinfo.xml"))
150 dict = {}
151 def parseThroughDocumentInfo(node, dict):
152 for childNode in node.childNodes:
153 if childNode.nodeType != minidom.Node.TEXT_NODE and childNode.nodeType != minidom.Node.CDATA_SECTION_NODE:
154 if childNode.tagName == "title":
155 title = ""
156 for text in childNode.childNodes:
157 title += text.data
158 dict["title"] = title
159 elif childNode.tagName == "keyword":
160 k = ""
161 for text in childNode.childNodes:
162 k += text.data
163 keywords = k.split(",")
164 for i in range(len(keywords)):
165 keywords[i] = str(keywords[i]).strip()
166 dict["key"] = keywords
167 if childNode.childNodes:
168 parseThroughDocumentInfo(childNode, dict)
169
170 parseThroughDocumentInfo(xmlroot.documentElement, dict)
171 keywords = dict["key"]
172 if "acbf_title" in keywords:
173 self.pageTitleKeys.append(dict["title"])
174
175 page.close()
176

References comics_project_management_tools.comics_project_translation_scraper.translation_scraper.get_txt(), comics_project_management_tools.comics_project_translation_scraper.translation_scraper.pageTitleKeys, and comics_project_management_tools.comics_project_translation_scraper.translation_scraper.textLayerNameList.

◆ get_txt()

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.get_txt ( self,
string )

Definition at line 177 of file comics_project_translation_scraper.py.

177 def get_txt(self, string):
178 svg = minidom.parseString(string)
179 # parse through string as if svg.
180
181 def parseThroughChildNodes(node):
182 for childNode in node.childNodes:
183 if childNode.nodeType != minidom.Node.TEXT_NODE:
184 if childNode.tagName == "text":
185 text = ""
186 for c in childNode.childNodes:
187 text += c.toxml()
188 if text not in self.translationDict.keys():
189 entry = {}
190 entry["text"] = text
191 self.translationDict[text] = entry
192 if text not in self.translationKeys:
193 self.translationKeys.append(text)
194 elif childNode.childNodes:
195 parseThroughChildNodes(childNode)
196
197 parseThroughChildNodes(svg.documentElement)
198

References comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translationDict, comics_project_management_tools.exporters.CPMT_po_parser.po_file_parser.translationDict, and comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translationKeys.

◆ parse_pot()

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.parse_pot ( self,
location )

Definition at line 59 of file comics_project_translation_scraper.py.

59 def parse_pot(self, location):
60 if (os.path.exists(location)):
61 file = open(location, "r", newline="", encoding="utf8")
62 multiLine = ""
63 key = None
64 entry = {}
65
66 def addEntryToTranslationDict(key, entry):
67 if len(entry.keys()) > 0:
68 if key is None:
69 key = entry.get("text", None)
70 if key is not None:
71 if len(key) > 0:
72 self.translationDict[key] = entry
73
74 for line in file or len(line) < 1:
75 if line.isspace():
76 addEntryToTranslationDict(key, entry)
77 entry = {}
78 key = None
79 multiLine = ""
80 if line.startswith("msgid "):
81 string = line.strip("msgid \"")
82 string = string[:-len('"\n')]
83 string = string.replace("\\\"", "\"")
84 string = string.replace("\\\'", "\'")
85 string = string.replace("\\#", "#")
86 entry["text"] = string
87 multiLine = "text"
88 if line.startswith("msgstr "):
89 string = line.strip("msgstr \"")
90 string = string[:-len('"\n')]
91 string = string.replace("\\\"", "\"")
92 string = string.replace("\\\'", "\'")
93 string = string.replace("\\#", "#")
94 entry["trans"] = string
95 multiLine = "trans"
96 if line.startswith("# "):
97 # Translator comment
98 entry["translator"] = line
99 if line.startswith("#. "):
100 entry["extract"] = line
101 if line.startswith("msgctxt "):
102 string = line.strip("msgctxt \"")
103 string = string[:-len('"\n')]
104 string = string.replace("\\\"", "\"")
105 string = string.replace("\\\'", "\'")
106 string = string.replace("\\#", "#")
107 key = string
108 if line.startswith("\"") and len(multiLine) > 0:
109 string = line[1:]
110 string = string[:-len('"\n')]
111 string = string.replace("\\\"", "\"")
112 string = string.replace("\\\'", "\'")
113 string = string.replace("\\#", "#")
114 entry[multiLine] += string
115 addEntryToTranslationDict(key, entry)
116 file.close()
117

References comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translationDict, and comics_project_management_tools.exporters.CPMT_po_parser.po_file_parser.translationDict.

◆ start()

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.start ( self,
pagesList,
language,
metaData = {} )

◆ write_pot()

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.write_pot ( self,
metaData )

Definition at line 199 of file comics_project_translation_scraper.py.

199 def write_pot(self, metaData):
200 quote = "\""
201 newLine = "\n"
202 location = os.path.join(self.projectURL, self.translation_folder, self.projectName + ".pot")
203 file = open(location, "w", newline="", encoding="utf8")
204
205 file.write("msgid " + quote + quote + newLine)
206 file.write("msgstr " + quote + quote + newLine)
207 date = QDateTime.currentDateTimeUtc().toString(Qt.DateFormat.ISODate)
208 file.write(quote + "POT-Creation-Date:" + date + "\\n" + quote + newLine)
209 file.write(quote + "Content-Type: text/plain; charset=UTF-8\\n" + quote + newLine)
210 file.write(quote + "Content-Transfer-Encoding: 8bit\\n" + quote + newLine)
211 file.write(quote + "X-Generator: Krita Comics Project Manager Tools Plugin\\n" + quote + newLine)
212
213 file.write(newLine)
214 file.write("#. Title of the work" + newLine)
215 file.write("msgctxt \"@meta-title\"" + newLine)
216 file.write("msgid " + quote + metaData.get("title", "") + quote + newLine)
217 file.write("msgstr " + quote + quote + newLine)
218 file.write(newLine)
219
220 file.write("#. The summary" + newLine)
221 file.write("msgctxt \"@meta-summary\"" + newLine)
222 file.write("msgid " + quote + metaData.get("summary", "") + quote + newLine)
223 file.write("msgstr " + quote + quote + newLine)
224 file.write(newLine)
225
226 file.write("#. The keywords, these need to be comma separated." + newLine)
227 file.write("msgctxt \"@meta-keywords\"" + newLine)
228 file.write("msgid " + quote + metaData.get("keywords", "") + quote + newLine)
229 file.write("msgstr " + quote + quote + newLine)
230 file.write(newLine)
231
232 file.write("#. The header that will prepend translator's notes" + newLine)
233 file.write("msgctxt \"@meta-translator\"" + newLine)
234 file.write("msgid " + quote + metaData.get("transnotes", "") + quote + newLine)
235 file.write("msgstr " + quote + quote + newLine)
236
237 for i in range(len(self.pageTitleKeys)):
238 title = self.pageTitleKeys[i]
239 file.write(newLine)
240 file.write("msgctxt " + quote + "@page-title" + quote + newLine)
241 file.write("msgid " + quote + title + quote + newLine)
242 file.write("msgstr " + quote + quote + newLine)
243
244 for key in self.translationKeys:
245 if key != self.languageKey:
246 file.write(newLine)
247 if "translComment" in self.translationDict[key].keys():
248 file.write("# " + self.translationDict[key]["translator"] + newLine)
249 if "extract" in self.translationDict[key].keys():
250 file.write("#. " + self.translationDict[key]["extract"] + newLine)
251 string = self.translationDict[key]["text"]
252 uniqueContext = False
253 if string != key:
254 uniqueContext = True
255 string = string.replace(quote, "\\\"")
256 string = string.replace("\'", "\\\'")
257 string = string.replace("#", "\\#")
258 if uniqueContext:
259 file.write("msgctxt " + quote + key + quote + newLine)
260 file.write("msgid " + quote + string + quote + newLine)
261 file.write("msgstr " + quote + quote + newLine)
262 file.close()
263 print("CPMT: Translations have been written to:", location)

References comics_project_management_tools.comics_project_translation_scraper.translation_scraper.languageKey, comics_project_management_tools.comics_project_translation_scraper.translation_scraper.pageTitleKeys, comics_project_management_tools.comics_project_manager_docker.comics_project_manager_docker.projectName, comics_project_management_tools.comics_project_translation_scraper.translation_scraper.projectName, comics_project_management_tools.comics_exporter.comicsExporter.projectURL, comics_project_management_tools.comics_project_translation_scraper.translation_scraper.projectURL, comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translation_folder, comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translationDict, comics_project_management_tools.exporters.CPMT_po_parser.po_file_parser.translationDict, and comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translationKeys.

Member Data Documentation

◆ languageKey

str comics_project_management_tools.comics_project_translation_scraper.translation_scraper.languageKey = "AA_language"
static

Definition at line 36 of file comics_project_translation_scraper.py.

◆ pageTitleKeys [1/2]

list comics_project_management_tools.comics_project_translation_scraper.translation_scraper.pageTitleKeys = []
static

Definition at line 34 of file comics_project_translation_scraper.py.

◆ pageTitleKeys [2/2]

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.pageTitleKeys

Definition at line 44 of file comics_project_translation_scraper.py.

◆ projectName

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.projectName = str()
static

Definition at line 35 of file comics_project_translation_scraper.py.

◆ projectURL

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.projectURL = str()
static

Definition at line 29 of file comics_project_translation_scraper.py.

◆ textLayerNameList [1/2]

list comics_project_management_tools.comics_project_translation_scraper.translation_scraper.textLayerNameList = []
static

Definition at line 31 of file comics_project_translation_scraper.py.

◆ textLayerNameList [2/2]

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.textLayerNameList

Definition at line 42 of file comics_project_translation_scraper.py.

◆ translation_folder

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translation_folder = str()
static

Definition at line 30 of file comics_project_translation_scraper.py.

◆ translationDict [1/2]

dict comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translationDict = {}
static

Definition at line 32 of file comics_project_translation_scraper.py.

◆ translationDict [2/2]

comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translationDict

Definition at line 43 of file comics_project_translation_scraper.py.

◆ translationKeys

list comics_project_management_tools.comics_project_translation_scraper.translation_scraper.translationKeys = []
static

Definition at line 33 of file comics_project_translation_scraper.py.


The documentation for this class was generated from the following file: