@@ -648,41 +648,46 @@ def create_folder_section(
648648
649649 for source_node_ in traceability_info_ .source_nodes :
650650 assert source_node_ .entity_name is not None
651- source_sdoc_node_uid = f"{ document_uid } /{ path_to_source_file_ } /{ source_node_ .entity_name } "
652-
653- source_sdoc_node = traceability_index .get_node_by_uid_weak (
654- source_sdoc_node_uid
651+ sdoc_node_uid = source_node_ .get_sdoc_field (
652+ "UID" , relevant_source_node_entry
653+ )
654+ if sdoc_node_uid is None :
655+ sdoc_node_uid = f"{ document_uid } /{ path_to_source_file_ } /{ source_node_ .entity_name } "
656+ sdoc_node = traceability_index .get_node_by_uid_weak (
657+ sdoc_node_uid
655658 )
656- if source_sdoc_node is not None :
657- source_sdoc_node = assert_cast (source_sdoc_node , SDocNode )
659+
660+ if sdoc_node is not None :
661+ sdoc_node = assert_cast (sdoc_node , SDocNode )
658662 self .merge_sdoc_node_with_source_node (
659- source_sdoc_node ,
663+ relevant_source_node_entry ,
660664 source_node_ ,
665+ sdoc_node ,
661666 document ,
662- relevant_source_node_entry ,
663667 )
664668 else :
665- source_sdoc_node = self .create_sdoc_node_from_source_node (
669+ sdoc_node = self .create_sdoc_node_from_source_node (
666670 source_node_ ,
667- source_sdoc_node_uid ,
668- document ,
669671 relevant_source_node_entry ,
672+ sdoc_node_uid ,
673+ document ,
670674 )
671- current_top_node .section_contents .append (source_sdoc_node )
675+ sdoc_node_uid = assert_cast (sdoc_node .reserved_uid , str )
676+ current_top_node .section_contents .append (sdoc_node )
672677 traceability_index .graph_database .create_link (
673678 link_type = GraphLinkType .UID_TO_NODE ,
674- lhs_node = source_sdoc_node_uid ,
675- rhs_node = source_sdoc_node ,
679+ lhs_node = sdoc_node_uid ,
680+ rhs_node = sdoc_node ,
676681 )
677682
678683 self .connect_source_node_function (
679- source_node_ , source_sdoc_node_uid , traceability_info_
684+ source_node_ , sdoc_node_uid , traceability_info_
680685 )
681686 self .connect_sdoc_node_with_file_path (
682- source_sdoc_node , path_to_source_file_
687+ sdoc_node , path_to_source_file_
683688 )
684689 self .connect_source_node_requirements (
685- source_node_ , source_sdoc_node , traceability_index
690+ source_node_ , sdoc_node , traceability_index
686691 )
687692
688693 # Warn if source_node was not matched by any include_source_paths, it indicates misconfiguration
@@ -975,45 +980,37 @@ def connect_source_node_function(
975980 @staticmethod
976981 def create_sdoc_node_from_source_node (
977982 source_node : SourceNode ,
978- uid : str ,
983+ source_node_config_entry : SourceNodesEntry ,
984+ sdoc_node_uid : str ,
979985 parent_document : SDocDocumentIF ,
980- relevant_source_node_entry : SourceNodesEntry ,
981986 ) -> SDocNode :
982- source_sdoc_node = SDocNode (
987+ sdoc_node = SDocNode (
983988 parent = parent_document ,
984- node_type = relevant_source_node_entry .node_type ,
989+ node_type = source_node_config_entry .node_type ,
985990 fields = [],
986991 relations = [],
987992 # It is important that this autogenerated node is marked as such.
988993 autogen = True ,
989994 )
990- source_sdoc_node .ng_document_reference = DocumentReference ()
991- source_sdoc_node .ng_document_reference .set_document (parent_document )
992- source_sdoc_node .ng_including_document_reference = DocumentReference ()
993- source_sdoc_node .set_field_value (
994- field_name = "UID" ,
995- form_field_index = 0 ,
996- value = uid ,
997- )
998- source_sdoc_node .set_field_value (
999- field_name = "TITLE" ,
1000- form_field_index = 0 ,
1001- value = source_node .entity_name ,
1002- )
1003- for node_name_ , node_value_ in source_node .fields .items ():
1004- source_sdoc_node .set_field_value (
1005- field_name = node_name_ ,
1006- form_field_index = 0 ,
1007- value = node_value_ ,
1008- )
1009- return source_sdoc_node
995+ sdoc_node .ng_document_reference = DocumentReference ()
996+ sdoc_node .ng_document_reference .set_document (parent_document )
997+ sdoc_node .ng_including_document_reference = DocumentReference ()
998+ sdoc_node_fields = source_node .get_sdoc_fields (source_node_config_entry )
999+ sdoc_node_fields ["UID" ] = sdoc_node_uid
1000+ if (
1001+ "TITLE" not in sdoc_node_fields
1002+ and source_node .entity_name is not None
1003+ ):
1004+ sdoc_node_fields ["TITLE" ] = source_node .entity_name
1005+ FileTraceabilityIndex .set_sdoc_node_fields (sdoc_node , sdoc_node_fields )
1006+ return sdoc_node
10101007
10111008 @staticmethod
10121009 def merge_sdoc_node_with_source_node (
1013- sdoc_node : SDocNode ,
1010+ source_node_config_entry : SourceNodesEntry ,
10141011 source_node : SourceNode ,
1012+ sdoc_node : SDocNode ,
10151013 parent_document : SDocDocumentIF ,
1016- source_node_config_entry : SourceNodesEntry ,
10171014 ) -> None :
10181015 # First check if grammar element definitions are compatible.
10191016 source_node_type = source_node_config_entry .node_type
@@ -1038,19 +1035,19 @@ def merge_sdoc_node_with_source_node(
10381035 f"Grammar element { sdoc_node_document .reserved_uid } ::{ source_node_type } "
10391036 f"incompatible with { parent_document .reserved_uid } ::{ source_node_type } "
10401037 )
1041- # Merge strategy: overwrite title if there's a TITLE from custom tags.
1042- if "TITLE" in source_node .fields :
1043- sdoc_node .set_field_value (
1044- field_name = "TITLE" ,
1045- form_field_index = 0 ,
1046- value = source_node .fields ["TITLE" ],
1047- )
10481038 # Merge strategy: overwrite any field if there's a field with same name from custom tags.
1049- for node_name_ , node_value_ in source_node .fields .items ():
1039+ sdoc_node_fields = source_node .get_sdoc_fields (source_node_config_entry )
1040+ FileTraceabilityIndex .set_sdoc_node_fields (sdoc_node , sdoc_node_fields )
1041+
1042+ @staticmethod
1043+ def set_sdoc_node_fields (
1044+ sdoc_node : SDocNode , sdoc_node_fields : dict [str , str ]
1045+ ) -> None :
1046+ for field_name , field_value in sdoc_node_fields .items ():
10501047 sdoc_node .set_field_value (
1051- field_name = node_name_ ,
1048+ field_name = field_name ,
10521049 form_field_index = 0 ,
1053- value = node_value_ ,
1050+ value = field_value ,
10541051 )
10551052
10561053 def connect_sdoc_node_with_file_path (
0 commit comments