<CODE>

func sphereBuilder(shape:Sphere) -> StringNodeable {
    CurlyBraced(opening: "def Xform \"\(shape.id)\"", style: .expanded) {
        if !shape.transformations.isEmpty {
            transformString(shape:shape)
        }
        CurlyBraced(opening: "def \(shape.shapeName) \"\(shape.id.lowercased())\"",
                    style: .expanded) {
            "\(extentString(shape: shape))"
            if !shape.surfaces.isEmpty {
                colorString(shape:shape)
            }
            "\(radiusString(shape.radius))"
        }
}
</CODE>
<CODE> func sphereBuilder(shape:Sphere) -> StringNodeable { CurlyBraced(opening: "def Xform \"\(shape.id)\"", style: .expanded) { if !shape.transformations.isEmpty { transformString(shape:shape) } CurlyBraced(opening: "def \(shape.shapeName) \"\(shape.id.lowercased())\"", style: .expanded) { "\(extentString(shape: shape))" if !shape.surfaces.isEmpty { colorString(shape:shape) } "\(radiusString(shape.radius))" } } </CODE>
<CODE> func sphereBuilder(shape:Sphere) -> StringNodeable {
    var content = Tag("Shape") {
        Tag("Appearance") {
            if !shape.surfaces.isEmpty {
                //function unchanged from previous code for now
                //still needs updating at this point.
                materialString(shape.surfaces)
            }
        }
        "<Sphere radius='\(shape.radius)'></Sphere>" 
    }
    
    if !shape.transformations.isEmpty {
        //Last closest to the content.
        let orderedTransforms = shape.transformations.reversed()
        for item in orderedTransforms {
            let attributes = transformAttribute(transform: item)
            content = Tag("Transform", attributes:attributes) { content }
        }
    } 
    
    return content
}

func transformAttribute(transform:Transformation) -> Dictionary<String,String> {
    switch transform {
    case .translate(let v):
        return ["translation":"\(v.x) \(v.y) \(v.z)"] 
    }
} </CODE>
<CODE> func sphereBuilder(shape:Sphere) -> StringNodeable { var content = Tag("Shape") { Tag("Appearance") { if !shape.surfaces.isEmpty { //function unchanged from previous code for now //still needs updating at this point. materialString(shape.surfaces) } } "<Sphere radius='\(shape.radius)'></Sphere>" } if !shape.transformations.isEmpty { //Last closest to the content. let orderedTransforms = shape.transformations.reversed() for item in orderedTransforms { let attributes = transformAttribute(transform: item) content = Tag("Transform", attributes:attributes) { content } } } return content } func transformAttribute(transform:Transformation) -> Dictionary<String,String> { switch transform { case .translate(let v): return ["translation":"\(v.x) \(v.y) \(v.z)"] } } </CODE>
<CODE> @StringBuilder func sphereBuilder(shape:Sphere) -> String {
    if !shape.transformations.isEmpty {
        for transform in shape.transformations {
            transformStart(transform:transform)
        }
    }
    "<shape>"
    "\t<appearance>" 
    if !shape.surfaces.isEmpty {
        materialString(shape.surfaces)
    }
    "\t</appearance>" 
    "\t<sphere radius='\(shape.radius)'></sphere>" 
    "</shape>"
    if !shape.transformations.isEmpty {
        for _ in 0..<shape.transformations.count {
            transformClose()
        }
    }
    }

func transformStart(transform:Transformation) -> String {
    switch transform {
    case .translate(let v):
    return "<transform translation='\(v.x) \(v.y) \(v.z)'>" 
    // default:
    // fatalError()
    }
}

func transformClose() -> String {
    "</transform>"
} </CODE>
<CODE> @StringBuilder func sphereBuilder(shape:Sphere) -> String { if !shape.transformations.isEmpty { for transform in shape.transformations { transformStart(transform:transform) } } "<shape>" "\t<appearance>" if !shape.surfaces.isEmpty { materialString(shape.surfaces) } "\t</appearance>" "\t<sphere radius='\(shape.radius)'></sphere>" "</shape>" if !shape.transformations.isEmpty { for _ in 0..<shape.transformations.count { transformClose() } } } func transformStart(transform:Transformation) -> String { switch transform { case .translate(let v): return "<transform translation='\(v.x) \(v.y) \(v.z)'>" // default: // fatalError() } } func transformClose() -> String { "</transform>" } </CODE>