Advertisement
RedlineTriad

Untitled

Jul 19th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.75 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7.  
  8. namespace ChemicalRegex
  9. {
  10.     public class DmObject : ReadOnlyDictionary<string, object>
  11.     {
  12.         public DmObject(StreamReader text) : base(new Dictionary<string, object>(Assignments(text))) { }
  13.  
  14.         private static IEnumerable<KeyValuePair<string, object>> Assignments(StreamReader text)
  15.         {
  16.             var isNotDataObject = false;
  17.             foreach (var rawLine in Lines(text))
  18.             {
  19.                 Console.WriteLine($"    {rawLine}");
  20.                 if (rawLine.StartsWith("/datum/"))
  21.                 {
  22.                     yield break;
  23.                 }
  24.  
  25.                 if (rawLine.StartsWith("/obj/"))
  26.                 {
  27.                     isNotDataObject = true;
  28.                 }
  29.  
  30.                 if (isNotDataObject)
  31.                 {
  32.                     continue;
  33.                 }
  34.  
  35.                 if (rawLine.Length == 0 ||
  36.                     rawLine.StartsWith("\t\t") ||
  37.                     rawLine.StartsWith("     ") ||
  38.                     rawLine.TrimStart().StartsWith("if") ||
  39.                     rawLine.TrimStart().StartsWith("for"))
  40.                 {
  41.                     continue;
  42.                 }
  43.                
  44.                 var line = new StringBuilder(rawLine);
  45.                
  46.                 var commentIndex = rawLine.IndexOf("//", StringComparison.Ordinal);
  47.                 if (commentIndex != -1)
  48.                 {
  49.                     line.Remove(commentIndex, line.Length - commentIndex);
  50.                 }
  51.  
  52.                 var assIn = line.ToString().IndexOf('=');
  53.                 if (assIn != -1)
  54.                 {
  55.                     var assLeft = line.ToString(0, assIn).Trim().Trim('"');
  56.                     var assRight = line.ToString(assIn + 1, line.Length - (assIn + 1)).Trim().Trim('"');
  57.                     yield return KeyValuePair.Create(assLeft, ParseLiteral(assRight));
  58.                 }
  59.             }
  60.         }
  61.  
  62.         private static object ParseLiteral(string rawLiteral)
  63.         {
  64.             var literal = new StringBuilder(rawLiteral);
  65.  
  66.             if (int.TryParse(rawLiteral, out var result))
  67.             {
  68.                 return result;
  69.             }
  70.             else if (rawLiteral.StartsWith("list"))
  71.             {
  72.                 literal.Remove(0, rawLiteral.IndexOf('('));
  73.                 literal.Remove(literal.Length - 1, 1);
  74.  
  75.                 return new Dictionary<string, object>(
  76.                     literal.ToString()
  77.                         .Split(',')
  78.                         .Select(l =>
  79.                         {
  80.                             var succ = TryParseAssignment(l, out var ass);
  81.                             return (succ, ass);
  82.                         })
  83.                         .Where(x => x.succ)
  84.                         .Select(x => x.ass));
  85.             }
  86.  
  87.             return rawLiteral;
  88.         }
  89.  
  90.         private static bool TryParseAssignment(string assignment, out KeyValuePair<string, object> result)
  91.         {
  92.             var assIn = assignment.IndexOf('=');
  93.             if (assIn != -1)
  94.             {
  95.                 var assLeft = assignment.Substring(0, assIn).Trim();
  96.                 var assRight = assignment.Substring(assIn + 1, assignment.Length - (assIn + 1)).Trim();
  97.                 result = KeyValuePair.Create(assLeft, ParseLiteral(assRight));
  98.                 return true;
  99.             }
  100.  
  101.             result = default;
  102.             return false;
  103.         }
  104.  
  105.         private static IEnumerable<string> Lines(StreamReader sr)
  106.         {
  107.             while (!sr.EndOfStream)
  108.             {
  109.                 yield return sr.ReadLine();
  110.             }
  111.         }
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement