40 for( ; cNode; cNode = cNode->
GetNext() )
42 if( cNode->GetName() == wxT(
"HEADER" ) )
53 wxASSERT_MSG(
true, wxT(
"Unknown File Resolution" ) );
57 else if( cNode->GetName() == wxT(
"ASSIGNMENTS" ) )
61 else if( cNode->GetName() == wxT(
"LIBRARY" ) )
65 else if( cNode->GetName() == wxT(
"DEFAULTS" ) )
71 else if( cNode->GetName() == wxT(
"PARTS" ) )
75 else if( cNode->GetName() == wxT(
"SHEETS" ) )
79 else if( cNode->GetName() == wxT(
"SCHEMATIC" ) )
83 else if( cNode->GetName() == wxT(
"DISPLAY" ) )
89 for( ; subNode; subNode = subNode->
GetNext() )
91 if( subNode->GetName() == wxT(
"ATTRCOLORS" ) )
95 else if( subNode->GetName() == wxT(
"SCMITEMCOLORS" ) )
99 for( ; sub2Node; sub2Node = sub2Node->
GetNext() )
101 if( sub2Node->GetName() == wxT(
"SYMCOL" ) )
105 for( ; sub3Node; sub3Node = sub3Node->
GetNext() )
107 if( sub3Node->GetName() == wxT(
"PARTNAMECOL" ) )
133 const wxString& aShapeStr )
135 if( aShapeStr == wxT(
"ANNULUS" ) )
137 else if( aShapeStr == wxT(
"BOX" ) )
139 else if( aShapeStr == wxT(
"BULLET" ) )
141 else if( aShapeStr == wxT(
"ROUND" ) )
143 else if( aShapeStr == wxT(
"CROSS" ) )
145 else if( aShapeStr == wxT(
"DIAMOND" ) )
147 else if( aShapeStr == wxT(
"FINGER" ) )
149 else if( aShapeStr == wxT(
"OCTAGON" ) )
151 else if( aShapeStr == wxT(
"PLUS" ) )
153 else if( aShapeStr == wxT(
"POINTER" ) )
155 else if( aShapeStr == wxT(
"RECTANGLE" ) )
157 else if( aShapeStr == wxT(
"ROUNDED" ) )
159 else if( aShapeStr == wxT(
"SQUARE" ) )
161 else if( aShapeStr == wxT(
"STAR" ) )
163 else if( aShapeStr == wxT(
"TRIANGLE" ) )
178 wxCHECK( IsTermShape( aNode ), );
214 wxASSERT_MSG(
false,
"Unknown terminal shape type" );
220 if( aNode->
GetChildren()->GetName() == wxT(
"ORIENT" ) )
236 wxCHECK( aNode->GetName() == wxT(
"TERMINALCODE" ), );
244 for( ; cNode; cNode = cNode->
GetNext() )
246 wxString cNodeName = cNode->GetName();
249 Shape.Parse( cNode, aContext );
250 else if( cNodeName == wxT(
"FILLED" ) )
260 wxCHECK( aNode->GetName() == wxT(
"CODEDEFS" ), );
264 for( ; cNode; cNode = cNode->GetNext() )
266 wxString nodeName = cNode->GetName();
268 if( ParseSubNode( cNode, aContext ) )
272 else if( nodeName == wxT(
"TERMINALCODE" ) )
275 termcode.
Parse( cNode, aContext );
276 TerminalCodes.insert( std::make_pair( termcode.
ID, termcode ) );
288 wxCHECK( aNode->GetName() == wxT(
"ASSIGNMENTS" ), );
291 bool settingsParsed =
false;
293 for( ; cNode; cNode = cNode->GetNext() )
295 if( cNode->GetName() == wxT(
"CODEDEFS" ) )
297 Codedefs.Parse( cNode, aContext );
299 else if( cNode->GetName() == wxT(
"SETTINGS" ) )
301 settingsParsed =
true;
302 Settings.Parse( cNode, aContext );
304 else if( cNode->GetName() == wxT(
"GRIDS" ) )
306 Grids.Parse( cNode, aContext );
308 else if( cNode->GetName() == wxT(
"NETCLASSEDITATTRIBSETTINGS" ) )
310 NetclassEditAttributeSettings =
true;
312 else if( cNode->GetName() == wxT(
"SPCCLASSEDITATTRIBSETTINGS" ) )
314 SpacingclassEditAttributeSettings =
true;
322 if( !settingsParsed )
329 wxCHECK( aNode->GetName() == wxT(
"TERMINAL" ), );
340 for( ; cNode; cNode = cNode->
GetNext() )
342 wxString cNodeName = cNode->GetName();
344 if( cNodeName == wxT(
"ORIENT" ) )
346 else if( cNodeName == wxT(
"PT" ) )
347 Position.Parse( cNode, aContext );
356 wxCHECK( aNode->GetName() == wxT(
"PINLABELLOC" )
357 || aNode->GetName() == wxT(
"PINNUMNAMELOC" ), );
365 for( ; cNode; cNode = cNode->
GetNext() )
367 if( ParseSubNode( cNode, aContext ) )
373 if( !Position.IsFullySpecified() )
380 wxCHECK( aNode->GetName() == wxT(
"SYMDEF" ), );
382 ParseIdentifiers( aNode, aContext );
386 for( ; cNode; cNode = cNode->
GetNext() )
388 wxString cNodeName = cNode->GetName();
390 if( ParseSubNode( cNode, aContext ) )
394 else if( cNodeName == wxT(
"TERMINAL" ) )
397 term.
Parse( cNode, aContext );
398 Terminals.insert( std::make_pair( term.
ID, term ) );
400 else if( cNodeName == wxT(
"PINLABELLOC" ) )
403 loc.
Parse( cNode, aContext );
404 PinLabelLocations.insert( std::make_pair( loc.
TerminalID, loc ) );
406 else if( cNodeName == wxT(
"PINNUMNAMELOC" ) )
409 loc.
Parse( cNode, aContext );
410 PinNumberLocations.insert( std::make_pair( loc.
TerminalID, loc ) );
418 if( !Stub && !Origin.IsFullySpecified() )
425 wxCHECK( aNode->GetName() == wxT(
"LIBRARY" ), );
429 for( ; cNode; cNode = cNode->GetNext() )
431 wxString cNodeName = cNode->GetName();
433 if( cNodeName == wxT(
"SYMDEF" ) )
436 symdef.
Parse( cNode, aContext );
437 SymbolDefinitions.insert( std::make_pair( symdef.
ID, symdef ) );
449 wxCHECK( aNode->GetName() == wxT(
"SHEETS" ), );
453 for( ; cNode; cNode = cNode->GetNext() )
455 if( cNode->GetName() == wxT(
"SHEET" ) )
459 SheetNames.insert( std::make_pair(
id,
name ) );
460 SheetOrder.push_back(
id );
472 wxCHECK( aNode->GetName() == wxT(
"COMP" ), );
478 for( ; cNode; cNode = cNode->
GetNext() )
480 if( cNode->GetName() == wxT(
"READONLY" ) )
484 else if( cNode->GetName() == wxT(
"ATTRLOC" ) )
486 AttrLoc.Parse( cNode, aContext );
499 wxCHECK( aNode->GetName() == wxT(
"PARTREF" ), );
505 for( ; cNode; cNode = cNode->
GetNext() )
507 if( cNode->GetName() == wxT(
"READONLY" ) )
511 else if( cNode->GetName() == wxT(
"ATTRLOC" ) )
513 AttrLoc.Parse( cNode, aContext );
526 wxCHECK( aNode->GetName() == wxT(
"TERMATTR" ), );
531 bool attrParsed =
false;
533 for( ; cNode; cNode = cNode->
GetNext() )
535 if( !attrParsed && cNode->GetName() == wxT(
"ATTR" ) )
537 Value.Parse( cNode, aContext );
550 wxCHECK( aNode->GetName() == wxT(
"SYMPINNAME" ) || aNode->GetName() == wxT(
"SYMPINLABEL" ), );
557 for( ; cNode; cNode = cNode->
GetNext() )
559 if( cNode->GetName() == wxT(
"ATTRLOC" ) )
561 AttrLoc.Parse( cNode, aContext );
574 wxCHECK( aNode->GetName() == wxT(
"PINNUM" ), );
581 for( ; cNode; cNode = cNode->
GetNext() )
583 if( cNode->GetName() == wxT(
"ATTRLOC" ) )
585 AttrLoc.Parse( cNode, aContext );
598 wxCHECK( aNode->GetName() == wxT(
"SYMBOLVARIANT" ), );
602 for( ; cNode; cNode = cNode->GetNext() )
604 wxString cNodeName = cNode->GetName();
606 if( cNodeName == wxT(
"SIGNALREF" ) )
608 Type = TYPE::SIGNALREF;
611 else if( cNodeName == wxT(
"GLOBALSIGNAL" ) )
613 Type = TYPE::GLOBALSIGNAL;
616 else if( cNodeName == wxT(
"TESTPOINT" ) )
618 Type = TYPE::TESTPOINT;
631 wxCHECK( aNode->GetName() == wxT(
"SIGNALREFERENCELINK" ), );
639 for( ; cNode; cNode = cNode->
GetNext() )
641 if( ParseSubNode( cNode, aContext ) )
643 else if( cNode->GetName() == wxT(
"SIGREFTEXT" ) )
649 if( !Position.IsFullySpecified() )
656 wxCHECK( aNode->GetName() == wxT(
"SYMBOL" ), );
663 bool originParsed =
false;
666 for( ; cNode; cNode = cNode->
GetNext() )
668 wxString cNodeName = cNode->GetName();
670 if( !originParsed && cNodeName == wxT(
"PT" ) )
672 Origin.Parse( cNode, aContext );
675 else if( cNodeName == wxT(
"COMP" ) )
677 ComponentRef.Parse( cNode, aContext );
680 else if( cNodeName == wxT(
"PARTREF" ) )
682 PartRef.Parse( cNode, aContext );
685 else if( cNodeName == wxT(
"PARTNAMENOTVISIBLE" ) )
687 PartNameVisible =
false;
689 else if( cNodeName == wxT(
"VSYMMASTER" ) )
694 else if( cNodeName == wxT(
"GROUPREF" ) )
698 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
700 ReuseBlockRef.Parse( cNode, aContext );
702 else if( cNodeName == wxT(
"SIGNALREFERENCELINK" ) )
704 SigRefLink.Parse( cNode, aContext );
706 else if( cNodeName == wxT(
"ORIENT" ) )
710 else if( cNodeName == wxT(
"MIRROR" ) )
714 else if( cNodeName == wxT(
"FIX" ) )
718 else if( cNodeName == wxT(
"SCALE" ) )
723 else if( cNodeName == wxT(
"READABILITY" ) )
727 else if( cNodeName == wxT(
"GATE" ) )
731 else if( cNodeName == wxT(
"SYMBOLVARIANT" ) )
733 IsSymbolVariant =
true;
734 SymbolVariant.Parse( cNode, aContext );
736 else if( cNodeName == wxT(
"TERMATTR" ) )
739 termattr.
Parse( cNode, aContext );
740 TerminalAttributes.insert( std::make_pair( termattr.
TerminalID, termattr ) );
742 else if( cNodeName == wxT(
"SYMPINLABEL" ) )
745 sympinname.
Parse( cNode, aContext );
746 PinLabels.insert( std::make_pair( sympinname.
TerminalID, sympinname ) );
748 else if( cNodeName == wxT(
"SYMPINNAME" ) )
751 sympinname.
Parse( cNode, aContext );
752 PinNames.insert( std::make_pair( sympinname.
TerminalID, sympinname ) );
754 else if( cNodeName == wxT(
"PINNUM" ) )
757 pinNum.
Parse( cNode, aContext );
760 else if( cNodeName == wxT(
"ATTR" ) )
763 attrVal.
Parse( cNode, aContext );
764 AttributeValues.insert( std::make_pair( attrVal.
AttributeID, attrVal ) );
779 wxCHECK( aNode->GetName() == wxT(
"SIGLOC" ), );
786 for( ; cNode; cNode = cNode->
GetNext() )
788 if( ParseSubNode( cNode, aContext ) )
794 if( !Position.IsFullySpecified() )
801 wxCHECK( aNode->GetName() == wxT(
"BUS" ), );
809 for( ; cNode; cNode = cNode->
GetNext() )
811 wxString cNodeName = cNode->GetName();
815 Shape.Parse( cNode, aContext );
817 else if( cNodeName == wxT(
"BUSNAME" ) )
825 if( subNode->GetName() == wxT(
"SIGLOC" ) )
827 BusLabel.Parse( subNode, aContext );
846 wxCHECK( aNode->GetName() == wxT(
"BLOCK" ), );
853 for( ; cNode; cNode = cNode->
GetNext() )
855 wxString cNodeName = cNode->GetName();
857 if( cNodeName == wxT(
"CLONE" ) )
861 else if( cNodeName == wxT(
"PARENT" ) )
866 else if( cNodeName == wxT(
"CHILD" ) )
871 else if( cNodeName == wxT(
"BLOCKNAME" ) )
878 if( subNode->GetName() == wxT(
"ATTRLOC" ) )
880 BlockLabel.Parse( subNode, aContext );
881 HasBlockLabel =
true;
889 else if( cNodeName == wxT(
"TERMINAL" ) )
892 term.
Parse( cNode, aContext );
893 Terminals.insert( std::make_pair( term.
ID, term ) );
895 else if( cNodeName == wxT(
"FIGURE" ) )
898 figure.
Parse( cNode, aContext );
899 Figures.insert( std::make_pair( figure.
ID, figure ) );
911 wxASSERT( aNode->GetName() == wxT(
"TERM" ) );
920 for( ; cNode; cNode = cNode->
GetNext() )
922 wxString cNodeName = cNode->GetName();
924 if( cNodeName == wxT(
"SIGLOC" ) )
926 NetLabel.Parse( cNode, aContext );
939 wxASSERT( aNode->GetName() == wxT(
"BUSTERM" ) );
946 bool firstPointParsed =
false;
947 bool secondPointParsed =
false;
949 for( ; cNode; cNode = cNode->
GetNext() )
951 wxString cNodeName = cNode->GetName();
953 if( cNodeName == wxT(
"SIGLOC" ) )
955 NetLabel.Parse( cNode, aContext );
958 else if( cNodeName == wxT(
"PT" ) )
960 if( !firstPointParsed )
962 FirstPoint.Parse( cNode, aContext );
963 firstPointParsed =
true;
965 else if( !secondPointParsed )
967 SecondPoint.Parse( cNode, aContext );
968 secondPointParsed =
true;
981 if( !firstPointParsed || !secondPointParsed )
988 wxASSERT( aNode->GetName() == wxT(
"BLOCKTERM" ) );
996 for( ; cNode; cNode = cNode->
GetNext() )
998 wxString cNodeName = cNode->GetName();
1000 if( cNodeName == wxT(
"SIGLOC" ) )
1002 NetLabel.Parse( cNode, aContext );
1015 ParseIdentifiers( aNode, aContext );
1020 for( ; cNode; cNode = cNode->
GetNext() )
1022 wxString cNodeName = cNode->GetName();
1024 if( ParseSubNode( cNode, aContext ) )
1028 else if( cNodeName == wxT(
"PATH" ) )
1032 else if( cNodeName == wxT(
"GROUPREF" ) )
1036 else if( cNodeName == wxT(
"REUSEBLOCKREF" ) )
1038 ReuseBlockRef.Parse( cNode, aContext );
1040 else if( cNodeName == wxT(
"CONLINECODE" ) )
1054 ParseIdentifiers( aNode, aContext );
1059 for( ; cNode; cNode = cNode->
GetNext() )
1061 wxString cNodeName = cNode->GetName();
1063 if( cNodeName == wxT(
"JPT" ) )
1066 jpt.
Parse( cNode, aContext );
1067 Junctions.insert( std::make_pair( jpt.
ID, jpt ) );
1069 else if( ParseSubNode( cNode, aContext ) )
1073 else if( cNodeName == wxT(
"TERM" ) )
1076 pin.
Parse( cNode, aContext );
1077 Terminals.insert( std::make_pair( pin.
ID, pin ) );
1079 else if( cNodeName == wxT(
"BUSTERM" ) )
1082 bt.
Parse( cNode, aContext );
1083 BusTerminals.insert( std::make_pair( bt.
ID, bt ) );
1085 else if( cNodeName == wxT(
"BLOCKTERM" ) )
1088 bt.
Parse( cNode, aContext );
1089 BlockTerminals.insert( std::make_pair( bt.
ID, bt ) );
1091 else if( cNodeName == wxT(
"DANGLER" ) )
1094 dang.
Parse( cNode, aContext );
1095 Danglers.insert( std::make_pair( dang.
ID, dang ) );
1097 else if( cNodeName == wxT(
"CONN" ) )
1100 conn.
Parse( cNode, aContext );
1101 Connections.push_back( conn );
1113 wxCHECK( aNode->GetName() == wxT(
"SCHEMATIC" ), );
1117 for( ; cNode; cNode = cNode->GetNext() )
1119 wxString cNodeName = cNode->GetName();
1121 if( cNodeName == wxT(
"GROUP" ) )
1124 group.
Parse( cNode, aContext );
1125 Groups.insert( std::make_pair( group.
ID, group ) );
1127 else if( cNodeName == wxT(
"REUSEBLOCK" ) )
1130 reuseblock.
Parse( cNode, aContext );
1131 ReuseBlocks.insert( std::make_pair( reuseblock.
ID, reuseblock ) );
1133 else if( cNodeName == wxT(
"FIGURE" ) )
1136 figure.
Parse( cNode, aContext );
1137 Figures.insert( std::make_pair( figure.
ID, figure ) );
1139 else if( cNodeName == wxT(
"SYMBOL" ) )
1142 sym.
Parse( cNode, aContext );
1143 Symbols.insert( std::make_pair( sym.
ID, sym ) );
1145 else if( cNodeName == wxT(
"BUS" ) )
1148 bus.
Parse( cNode, aContext );
1149 Buses.insert( std::make_pair( bus.
ID, bus ) );
1151 else if( cNodeName == wxT(
"BLOCK" ) )
1154 block.
Parse( cNode, aContext );
1155 Blocks.insert( std::make_pair( block.
ID, block ) );
1157 else if( cNodeName == wxT(
"NET" ) )
1160 net.
Parse( cNode, aContext );
1161 Nets.insert( std::make_pair( net.
ID, net ) );
1163 else if( cNodeName == wxT(
"TEXT" ) )
1166 txt.
Parse( cNode, aContext );
1167 Texts.insert( std::make_pair( txt.
ID, txt ) );
1169 else if( cNodeName == wxT(
"DOCSYMBOL" ) )
1172 docsym.
Parse( cNode, aContext );
1173 DocumentationSymbols.insert( std::make_pair( docsym.
ID, docsym ) );
1175 else if( cNodeName == wxT(
"VHIERARCHY" ) )
1177 VariantHierarchy.Parse( cNode, aContext );
1189 ParseIdentifiers( aNode, aContext );
1196 for( ; cNode; cNode = cNode->
GetNext() )
1198 if( ParseSubNode( cNode, aContext ) )
1202 else if( cNode->GetName() == wxT(
"SIGLOC" ) )
1204 NetLabel.Parse( cNode, aContext );
1218 wxASSERT( aNode->GetName() == wxT(
"DANGLER" ) );
1225 bool positionParsed =
false;
1227 for( ; cNode; cNode = cNode->
GetNext() )
1229 wxString cNodeName = cNode->GetName();
1231 if( cNodeName == wxT(
"SIGLOC" ) )
1233 NetLabel.Parse( cNode, aContext );
1236 else if( !positionParsed && cNodeName == wxT(
"PT" ) )
1238 Position.Parse( cNode, aContext );
1239 positionParsed =
true;
< "DANGLER" nodename (represents a dangling wire)
NETELEMENT_ID ID
First two characters "BT".
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
NETELEMENT_ID ID
First character is "P".
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
ASSIGNMENTS_SCM Assignments
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
NETELEMENT_ID ID
First four characters "BLKT".
NETELEMENT_ID ID
First character "D".
CADSTAR_SCHEMATIC Schematic
Only used for error checking (not a real shape)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
#define THROW_MISSING_PARAMETER_IO_ERROR(param, location)
void insert(value_type const &v)
static TERMINAL_SHAPE_TYPE ParseTermShapeType(const wxString &aShapeStr)
void Parse()
Parses the file.
This file contains miscellaneous commonly used macros and functions.
< "BUSTERM" nodename (represents a connetion to a bus)
PARTNAMECOL SymbolPartNameColor
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
XNODE * GetChildren() const
static XNODE * LoadArchiveFile(const wxString &aFileName, const wxString &aFileTypeIdentifier)
Reads a CADSTAR Archive file (S-parameter format)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
DOCUMENTATION_SYMBOL_ID ID
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static bool IsShape(XNODE *aNode)
#define THROW_MISSING_NODE_IO_ERROR(nodename, location)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static long GetXmlAttributeIDLong(XNODE *aNode, unsigned int aID, bool aIsRequired=true)
Hold an XML or S-expression element.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
int KiCadUnitDivider
Use this value to convert units in this CSA file to KiCad units.
constexpr double SCH_IU_PER_MM
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static READABILITY ParseReadability(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static void CheckNoNextNodes(XNODE *aNode)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
NETELEMENT_ID ID
First character is "J".
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
static bool IsTermShape(XNODE *aNode)
wxString LAYER_ID
ID of a Sheet (if schematic) or board Layer (if PCB)
< "BLOCKTERM" nodename (represents a connetion to a block)
#define THROW_UNKNOWN_NODE_IO_ERROR(nodename, location)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
< "TERM" nodename (represents a pin in a SCH symbol)
static wxString GetXmlAttributeIDString(XNODE *aNode, unsigned int aID, bool aIsRequired=true)
static std::vector< POINT > ParseAllChildPoints(XNODE *aNode, PARSER_CONTEXT *aContext, bool aTestAllChildNodes=false, int aExpectedNumPoints=UNDEFINED_VALUE)
if no childs are present, it just returns an empty vector (without throwing an exception)
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override
void Parse(XNODE *aNode, PARSER_CONTEXT *aContext) override