in FigmaSharp/FigmaSharp/Services/CodeRendererService.cs [89:209]
public void GetCode (StringBuilder builder, CodeNode node, CodeNode parent = null, CodeRenderServiceOptions currentRendererOptions = null, ITranslationService translateService = null)
{
//in first level we clear all identifiers
if (parent == null) {
if (MainNode == null) {
//clear all nodes
Nodes.Clear();
identifiers.Clear ();
OnStartGetCode ();
//we initialize
SetOptions(currentRendererOptions ?? new CodeRenderServiceOptions());
TranslationService = translateService ?? TranslationService ?? new DefaultTranslationService();
//we store our main node
MainNode = node;
ParentMainNode = parent;
}
}
if (node != null)
Nodes.Add(node);
CodeNode calculatedParentNode = null;
NodeConverter converter = null;
var isNodeSkipped = IsNodeSkipped (node);
//on node skipped we don't render
if (!isNodeSkipped) {
//if (figmaProvider.RendersProperties (node)) {
converter = GetNodeConverter(node);
if (converter != null) {
if (!node.HasName) {
if (!TryGetCodeViewName (node, parent, converter, out string identifier)) {
identifier = DefaultViewName;
}
//we store our name to don't generate dupplicates
var lastIndex = GetLastInsertedIndex (identifier);
if (lastIndex >= 0) {
identifiers.Remove (identifier);
}
lastIndex++;
node.Name = identifier;
if (lastIndex > 0) {
node.Name += lastIndex;
}
identifiers.Add (identifier, lastIndex);
}
if (Options.ShowComments)
{
builder.AppendLine();
builder.AppendLine($"// View: {node.Name}");
builder.AppendLine($"// NodeName: {node.Node.name}");
builder.AppendLine($"// NodeType: {node.Node.type}");
builder.AppendLine($"// NodeId: {node.Node.id}");
}
OnPreConvertToCode (builder, node, parent, converter, codePropertyConverter);
//we generate our code and replace node name
var code = converter.ConvertToCode (node, parent, this);
builder.AppendLineIfValue (code.Replace (Resources.Ids.Conversion.NameIdentifier, node.Name));
OnPostConvertToCode (builder, node, parent, converter, codePropertyConverter);
//TODO: this could be removed to converters base
if (Options.ShowAddChild && RendersAddChild(node, parent, this))
{
builder.AppendLineIfValue(codePropertyConverter.ConvertToCode(PropertyNames.AddChild, node, parent, converter, this));
OnChildAdded(builder, node, parent, converter, codePropertyConverter);
}
if (Options.ShowSize && RendersSize(node, parent, this))
{
builder.AppendLineIfValue(codePropertyConverter.ConvertToCode(PropertyNames.Frame, node, parent, converter, this));
OnFrameSet(builder, node, parent, converter, codePropertyConverter);
}
if (Options.ShowConstraints && RendersConstraints(node, parent, this))
{
builder.AppendLineIfValue(codePropertyConverter.ConvertToCode(PropertyNames.Constraints, node, parent, converter, this));
}
calculatedParentNode = node;
} else {
//without a converter we don't have any view created, we need to attach to the parent view
calculatedParentNode = parent;
}
}
else
{
//if a node is skipped because is the first node we want to set as parent view
if (node == MainNode)
{
calculatedParentNode = node;
}
}
//without converter we scan the children automatically
var navigateChild = Options.ScanChildren && (converter?.ScanChildren (node.Node) ?? true);
if (navigateChild && HasChildrenToRender (node)) {
foreach (var item in GetChildrenToRender (node)) {
var figmaNode = new CodeNode(item, parent: node);
GetCode (builder, figmaNode, calculatedParentNode);
}
}
if (MainNode == node) {
//first loop
Clear ();
}
}