Here’s a downright ugly, but somewhat useful script to generate a ClassificationFormats.xcml file for the Intellipad editor in the Oslo SDK from a *.vssettings file exported from Visual Studio 2008.

This should work on a reasonably complete exported Visual Studio color scheme, such as the ones I have posted in the past.

param([string]$vsfile, [string]$outdir, [bool]$boldAsItalics = $true)

$ns_x = 'http://schemas.microsoft.com/winfx/2006/xaml'
$ns_act = 'clr-namespace:System.ComponentModel.Activation;assembly=Activation'
$ns_ls = 'clr-namespace:Microsoft.Intellipad.LanguageServices;assembly=Microsoft.Intellipad.Core'

function color($vscolor) {
   if ( $vscolor.StartsWith('0x02') ) {
      return $null
   } else {
      $rgb = $vscolor.substring(4,6)
      $red = $rgb.substring(4,2)
      $green = $rgb.substring(2,2)
      $blue = $rgb.substring(0,2)
      return "#FF$red$green$blue"
   }
}
function write-color($writer, $where, $color) {
   if ( $color -ne $null ) {
      $writer.WriteAttributeString($where, $color)
   }
}
function fix-font([int]$fontSize) {
   # font size in VS is in pts
   # but intellipad uses px right now, more or less
   return [int]($fontSize * 4 / 3.25)
}
function convertto-ipad($item, $name, $writer) {
   $writer.WriteStartElement('act', 'Export', $ns_act)
   $writer.WriteAttributeString('Name', '{}{Microsoft.Intellipad}ClassificationFormat')
   $item
   $writer.WriteStartElement('ls', 'ClassificationFormat', $ns_ls)
   $writer.WriteAttributeString('Name', $name)
   $writer.WriteAttributeString('FontSize', $fontSize)
   $writer.WriteAttributeString('FontFamily', $fontFamily)
   write-color $writer 'Foreground' (color $item.Foreground)
   write-color $writer 'Background' (color $item.Background)
   if ( $item.BoldFont -eq 'yes' ) {
      if ( $boldAsItalics ) {
         $writer.WriteAttributeString('FontStyle', 'Italic')
      } else {
         $writer.WriteAttributeString('FontWeight', 'Bold')
      }
   }
   $writer.WriteEndElement()
   $writer.WriteEndElement()
}
function find($items, $name) {
   foreach ( $item in $items ) {
      if ( $item.Name -eq $name ) {
         return $item
         break
      }
   }
}

$xml = [xml](gc $vsfile);
$cat = $xml.SelectSingleNode("//Category[@GUID='{A27B4E24-A735-4D1D-B8E7-9716E1E3D8E0}']")
$fontSize = fix-font($cat.
FontSize)
$fontFamily = $cat.FontName
if ( $fontFamily.EndsWith('VS') ) {
   $fontFamily = $fontFamily.Substring(0, $fontFamily.Length - 3)
}
$items = $cat.SelectNodes("Items/Item")

$ipadfile = "$(resolve-path $outdir)\ClassificationFormats.xcml"
$writer = [xml.xmlwriter]::Create($ipadfile);

trap {
   if ( $writer -ne $null ) {
      $writer.Close()
      throw $error
   }
}

$writer.WriteStartElement('act', 'Exports', $ns_act)
$writer.WriteAttributeString('xmlns', 'ls', '', $ns_ls)
convertto-ipad (find $items 'Plain Text') 'text' $writer
convertto-ipad (find $items 'Plain Text') 'Unknown' $writer
convertto-ipad (find $items 'Number') 'Numeric' $writer
convertto-ipad (find $items 'Keyword') 'Keyword' $writer
convertto-ipad (find $items 'Comment') 'Comment' $writer
convertto-ipad (find $items 'String') 'String' $writer
convertto-ipad (find $items 'XML Delimiter') 'Delimiter' $writer
convertto-ipad (find $items 'User Types') 'Type' $writer
convertto-ipad (find $items 'Operator') 'Operator' $writer
convertto-ipad (find $items 'XSLT Keyword') 'Hyperlink' $writer
convertto-ipad (find $items 'Line Numbers') 'line number' $writer
$writer.WriteEndElement()
$writer.Close()

To run the script, just pass in the path to your vssettings file and the directory where the ClassificationFormats.xcml file should be generated. There’s also an optional boolean parameter specifying whether to leave bolds as bolds or translate them to italics instead.

Update: I just fixed a bug in the script: I forgot that the vssettings format represents colors in BGR instead of RGB format, so the colors were coming out wrong sometimes.


Tomas Restrepo

Software developer located in Colombia. Sr. PFE at Microsoft.