428 |
428 |
429 def CreateHMITreeView(self, parent): |
429 def CreateHMITreeView(self, parent): |
430 #self.HMITreeView = HMITreeView(self) |
430 #self.HMITreeView = HMITreeView(self) |
431 return HMITreeSelector(parent) |
431 return HMITreeSelector(parent) |
432 |
432 |
433 def _ProgressArgs(args): |
|
434 if len(args) == 2: |
|
435 key, message = args |
|
436 else: |
|
437 key, = args |
|
438 message = key |
|
439 return str(key), str(message), time.time() |
|
440 |
|
441 class SVGHMI(object): |
433 class SVGHMI(object): |
442 XSD = """<?xml version="1.0" encoding="utf-8" ?> |
434 XSD = """<?xml version="1.0" encoding="utf-8" ?> |
443 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
435 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> |
444 <xsd:element name="SVGHMI"> |
436 <xsd:element name="SVGHMI"> |
445 <xsd:complexType> |
437 <xsd:complexType> |
504 self._getPOTpath()) |
496 self._getPOTpath()) |
505 # XXX TODO copy .PO files |
497 # XXX TODO copy .PO files |
506 return True |
498 return True |
507 |
499 |
508 def GetSVGGeometry(self): |
500 def GetSVGGeometry(self): |
509 t = time.time() |
501 self.ProgressStart("inkscape", "collecting SVG geometry (Inkscape)") |
510 # invoke inskscape -S, csv-parse output, produce elements |
502 # invoke inskscape -S, csv-parse output, produce elements |
511 InkscapeGeomColumns = ["Id", "x", "y", "w", "h"] |
503 InkscapeGeomColumns = ["Id", "x", "y", "w", "h"] |
512 |
504 |
513 inkpath = get_inkscape_path() |
505 inkpath = get_inkscape_path() |
514 |
506 |
529 attrs = dict( |
521 attrs = dict( |
530 zip(InkscapeGeomColumns, line.strip().split(','))) |
522 zip(InkscapeGeomColumns, line.strip().split(','))) |
531 |
523 |
532 res.append(etree.Element("bbox", **attrs)) |
524 res.append(etree.Element("bbox", **attrs)) |
533 |
525 |
534 self.GetCTRoot().logger.write(" Start collecting SVG geometry (Inkscape)\n") |
526 self.ProgressEnd("inkscape") |
535 self.GetCTRoot().logger.write(" Finished collecting SVG geometry (Inkscape) in %.3fs\n"%(time.time()-t)) |
|
536 return res |
527 return res |
537 |
528 |
538 def GetHMITree(self): |
529 def GetHMITree(self): |
539 global hmi_tree_root |
530 global hmi_tree_root |
540 t = time.time() |
531 self.ProgressStart("hmitree", "getting HMI tree") |
541 res = [hmi_tree_root.etree(add_hash=True)] |
532 res = [hmi_tree_root.etree(add_hash=True)] |
542 self.GetCTRoot().logger.write(" Start getting HMI tree\n") |
533 self.ProgressEnd("hmitree") |
543 self.GetCTRoot().logger.write(" Fnished getting HMI tree in %.3fs\n"%(time.time()-t)) |
|
544 return res |
534 return res |
545 |
535 |
546 def GetTranslations(self, _context, msgs): |
536 def GetTranslations(self, _context, msgs): |
547 t = time.time() |
537 self.ProgressStart("i18n", "getting Translations") |
548 messages = EtreeToMessages(msgs) |
538 messages = EtreeToMessages(msgs) |
549 |
539 |
550 if len(messages) == 0: |
540 if len(messages) == 0: |
|
541 self.ProgressEnd("i18n") |
551 return |
542 return |
552 |
543 |
553 SaveCatalog(self._getPOTpath(), messages) |
544 SaveCatalog(self._getPOTpath(), messages) |
554 |
545 |
555 translations = ReadTranslations(self.CTNPath()) |
546 translations = ReadTranslations(self.CTNPath()) |
557 langs,translated_messages = MatchTranslations(translations, messages, |
548 langs,translated_messages = MatchTranslations(translations, messages, |
558 errcallback=self.GetCTRoot().logger.write_warning) |
549 errcallback=self.GetCTRoot().logger.write_warning) |
559 |
550 |
560 ret = TranslationToEtree(langs,translated_messages) |
551 ret = TranslationToEtree(langs,translated_messages) |
561 |
552 |
562 self.GetCTRoot().logger.write(" Start getting Translations\n") |
553 self.ProgressEnd("i18n") |
563 self.GetCTRoot().logger.write(" Finished getting Translations in %.3fs\n"%(time.time()-t)) |
|
564 |
554 |
565 return ret |
555 return ret |
566 |
556 |
567 times = {} |
557 times_msgs = {} |
568 |
558 indent = 1 |
569 def ProgressStart(self, _context, *args): |
559 def ProgressStart(self, k, m): |
570 k,m,t = _ProgressArgs(args) |
560 self.times_msgs[k] = (time.time(), m) |
571 self.times[k] = t |
561 self.GetCTRoot().logger.write(" "*self.indent + "Start %s...\n"%m) |
572 # self.GetCTRoot().logger.write(" Start %s: %.3f\n"%(m, t - self.transform_begin)) |
562 self.indent = self.indent + 1 |
573 self.GetCTRoot().logger.write(" Start %s\n"%m) |
563 |
574 |
564 def ProgressEnd(self, k): |
575 def ProgressEnd(self, _context, *args): |
565 t = time.time() |
576 k,m,t = _ProgressArgs(args) |
566 oldt, m = self.times_msgs[k] |
577 self.GetCTRoot().logger.write(" Finished %s in %.3f\n"%(m, t - self.times[k])) |
567 self.indent = self.indent - 1 |
578 self.times[k] = t |
568 self.GetCTRoot().logger.write(" "*self.indent + "... finished in %.3fs\n"%(t - oldt)) |
579 |
569 |
580 def CTNGenerate_C(self, buildpath, locations): |
570 def CTNGenerate_C(self, buildpath, locations): |
581 |
571 |
582 location_str = "_".join(map(str, self.GetCurrentLocation())) |
572 location_str = "_".join(map(str, self.GetCurrentLocation())) |
583 view_name = self.BaseParams.getName() |
573 view_name = self.BaseParams.getName() |
598 # TODO : move to __init__ |
588 # TODO : move to __init__ |
599 transform = XSLTransform(os.path.join(ScriptDirectory, "gen_index_xhtml.xslt"), |
589 transform = XSLTransform(os.path.join(ScriptDirectory, "gen_index_xhtml.xslt"), |
600 [("GetSVGGeometry", lambda *_ignored:self.GetSVGGeometry()), |
590 [("GetSVGGeometry", lambda *_ignored:self.GetSVGGeometry()), |
601 ("GetHMITree", lambda *_ignored:self.GetHMITree()), |
591 ("GetHMITree", lambda *_ignored:self.GetHMITree()), |
602 ("GetTranslations", self.GetTranslations), |
592 ("GetTranslations", self.GetTranslations), |
603 ("ProgressStart", self.ProgressStart), |
593 ("ProgressStart", lambda _ign,k,m:self.ProgressStart(str(k),str(m))), |
604 ("ProgressEnd", self.ProgressEnd)]) |
594 ("ProgressEnd", lambda _ign,k:self.ProgressEnd(str(k)))]) |
605 |
595 |
606 t = time.time() |
596 self.ProgressStart("svg", "source SVG parsing") |
607 |
597 |
608 # load svg as a DOM with Etree |
598 # load svg as a DOM with Etree |
609 svgdom = etree.parse(svgfile) |
599 svgdom = etree.parse(svgfile) |
610 |
600 |
611 self.GetCTRoot().logger.write(" Source SVG parsing: %.3f\n"%(time.time()-t)) |
601 self.ProgressEnd("svg") |
612 |
602 |
613 # call xslt transform on Inkscape's SVG to generate XHTML |
603 # call xslt transform on Inkscape's SVG to generate XHTML |
614 try: |
604 try: |
615 self.transform_begin = time.time() |
605 self.ProgressStart("xslt", "XSLT transform") |
616 result = transform.transform(svgdom) # , profile_run=True) |
606 result = transform.transform(svgdom) # , profile_run=True) |
617 self.GetCTRoot().logger.write(" XSLT transform: %.3f\n"%(time.time()-self.transform_begin)) |
607 self.ProgressEnd("xslt") |
618 except XSLTApplyError as e: |
608 except XSLTApplyError as e: |
619 self.FatalError("SVGHMI " + view_name + ": " + e.message) |
609 self.FatalError("SVGHMI " + view_name + ": " + e.message) |
620 finally: |
610 finally: |
621 for entry in transform.get_error_log(): |
611 for entry in transform.get_error_log(): |
622 message = "SVGHMI: "+ entry.message + "\n" |
612 message = "SVGHMI: "+ entry.message + "\n" |