require 'vstudioide/sln_document' module VStudioIDE class Solution def initialize(file) @file = file parse end def configurations @sln.configurations end private def parse File.open(@file) do |io| @sln = SLN.load(io) end end end class SLN @@formats = [] def self.inherited(format) @@formats << format end def self.load(io) # Loop until we read a line that begins with a word charachter. This # scans past garbage that certain versions of Visual Studio put at the # beginning of the file. while io.gets break if $_.match('\A\w') end sln = nil version = $_.strip @@formats.each do |format| sln = format.new if format.loads? version end raise IOError, "Unrecognized Visual Studio solution format." if sln.nil? sln.parse(io) sln end def self.loads?(format) false end def configurations [] end end class SLNv8 < SLN FORMAT = "Microsoft Visual Studio Solution File, Format Version 8.00".freeze def self.loads?(format) true if FORMAT == format end def parse(io) @doc = SLNDocument.new(io) end def configurations sc = @doc.global['SolutionConfiguration'] return [] if sc.nil? configs = [] sc.each do |config| idx = config.index('=') configs << config.slice(0, idx).strip end return configs end end class SLNv9 < SLN FORMAT = "Microsoft Visual Studio Solution File, Format Version 9.00".freeze def self.loads?(format) true if FORMAT == format end def parse(io) @doc = SLNDocument.new(io) end def configurations sc = @doc.global['SolutionConfigurationPlatforms'] return [] if sc.nil? configs = [] sc.each do |config| idx = config.index('|') configs << config.slice(0, idx).strip end return configs end end end