@@ -466,6 +466,44 @@ public static bool IsXmlLangOrSpace(XmlQualifiedName name)
466466 XmlSchemaAttributeGroup attrGroup => attrGroup . QualifiedName ,
467467 _ => null
468468 } ;
469+
470+ public static string GenerateNamespace ( string xmlns , string namespacePrefix = null )
471+ {
472+ if ( string . IsNullOrEmpty ( xmlns ) ) return ! string . IsNullOrEmpty ( namespacePrefix ) ? namespacePrefix : string . Empty ;
473+
474+ var schemeIndex = xmlns . IndexOf ( "://" ) ;
475+ List < string > segments ;
476+
477+ if ( xmlns . StartsWith ( "urn:" ) )
478+ {
479+ segments = [ .. xmlns . Substring ( 4 ) . Split ( ':' , '-' , '.' , '_' ) ] ;
480+ }
481+ else
482+ {
483+ if ( schemeIndex > 0 ) xmlns = xmlns . Substring ( schemeIndex + 3 ) ;
484+
485+ segments = [ .. xmlns . Split ( '/' ) ] ;
486+
487+ if ( segments . Count > 0 )
488+ {
489+ var splitSegments = segments [ 0 ] . Split ( '.' ) . Reverse ( ) . Where ( s => s != "www" ) . ToList ( ) ;
490+ if ( segments . Count > 1 )
491+ splitSegments . AddRange ( segments . Skip ( 1 ) ) ;
492+ segments = splitSegments . SelectMany ( s => s . Split ( '-' , '.' , '_' ) ) . ToList ( ) ;
493+ }
494+ }
495+
496+ var cleanedSegments = segments
497+ . Where ( s => ! string . IsNullOrEmpty ( s ) )
498+ . Select ( s => s . ToTitleCase ( NamingScheme . PascalCase ) )
499+ . Select ( s => s . Length > 0 && ! char . IsLetter ( s [ 0 ] ) && s [ 0 ] != '_' ? "_" + s : s )
500+ . ToList ( ) ;
501+ var name = string . Join ( "." , cleanedSegments ) ;
502+
503+ if ( ! string . IsNullOrEmpty ( namespacePrefix ) ) { name = namespacePrefix + ( string . IsNullOrEmpty ( name ) ? "" : ( "." + name ) ) ; }
504+
505+ return name ;
506+ }
469507 }
470508
471509 public readonly record struct TypeInfo ( string Namespace , string Name ) ;
0 commit comments