Navigation Menu

Skip to content

Commit

Permalink
Added start of parser to be used by Htmlization of history items
Browse files Browse the repository at this point in the history
  • Loading branch information
KevM committed Apr 5, 2012
1 parent 60805e7 commit bc8e97c
Show file tree
Hide file tree
Showing 7 changed files with 196 additions and 4 deletions.
Expand Up @@ -84,6 +84,9 @@
<Reference Include="Rhino.Mocks">
<HintPath>..\packages\RhinoMocks.3.6\lib\Rhino.Mocks.dll</HintPath>
</Reference>
<Reference Include="Sprache">
<HintPath>..\packages\Sprache.1.9.1.31\lib\NET40\Sprache.dll</HintPath>
</Reference>
<Reference Include="StructureMap">
<HintPath>..\packages\structuremap.2.6.3\lib\StructureMap.dll</HintPath>
</Reference>
Expand All @@ -101,6 +104,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="clarify_application_factory.cs" />
<Compile Include="history_parser.cs" />
<Compile Include="principal_factory.cs" />
<Compile Include="security_module.cs" />
<Compile Include="string_to_html.cs" />
Expand Down
112 changes: 112 additions & 0 deletions source/Dovetail.SDK.Bootstrap.Tests/history_parser.cs
@@ -0,0 +1,112 @@
using System.Linq;
using Dovetail.SDK.Bootstrap.History;
using NUnit.Framework;
using Sprache;

namespace Dovetail.SDK.Bootstrap.Tests
{
[TestFixture]
public class history_parser_document
{
[Test]
public void finds_all_items()
{
const string input = "item1\r\nitem2\nitem3";

var document = HistoryParser.Document.Parse(input);

var items = document.Items.ToArray();
items[0].ToString().ShouldEqual("item1");
items[1].ToString().ShouldEqual("item2");
items[2].ToString().ShouldEqual("item3");
}

[Test]
public void finds_email_headers_mixed_with_items()
{
const string input = "item1\r\nto: kmiller@dovetailsoftware.com\nitem3";

var document = HistoryParser.Document.Parse(input);

var items = document.Items.ToArray();
items[0].ToString().ShouldEqual("item1");

var emailHeaderItem = ((EmailHeader) items[1]).Headers.First();
emailHeaderItem.ShouldEqual("to");
emailHeaderItem.Text.ShouldEqual("kmiller@dovetailsoftware.com");

items[2].ToString().ShouldEqual("item3");
}
}

[TestFixture]
public class history_parser_items
{
[Test]
public void detect_item()
{
const string input = "line1\r\nline2";

var item = HistoryParser.Item.Parse(input);

item.ToString().ShouldEqual("line1");
}

[Test]
public void item_white_space_is_removed()
{
const string input = " line1\r\n line2";

var item = HistoryParser.Item.Parse(input);

item.ToString().ShouldEqual("line1");
}

[Test]
public void email_header_items_are_detected()
{
const string input = "from: yadda\nto:email@example.com\nsubject:math";

var item = HistoryParser.Item.Parse(input);

var emailHeader = (item as EmailHeader);
emailHeader.ShouldNotBeNull();
emailHeader.Headers.Count().ShouldEqual(3);
}

[Test]
public void email_header_properties_are_populated()
{
const string input = "from: yadda\r\nan item";

var item = HistoryParser.Item.Parse(input);

var emailHeaderItem = ((EmailHeader)item).Headers.First();
emailHeaderItem.Title.ShouldEqual("from");
emailHeaderItem.Text.ShouldEqual("yadda");
}

[Test]
public void email_header_titles_ignores_case()
{
const string input = "FROM: other content\r\nan item";

var item = HistoryParser.Item.Parse(input);

var emailHeaderItem = ((EmailHeader)item).Headers.First();
emailHeaderItem.Title.ShouldEqual("FROM");
emailHeaderItem.Text.ShouldEqual("other content");
}

[Test]
public void item_similar_to_an_email_header_is_still_just_an_item()
{
const string input = "notaheader: yadda\r\nan item";

var item = HistoryParser.Item.Parse(input);

(item as EmailHeader).ShouldBeNull();
}

}
}
3 changes: 2 additions & 1 deletion source/Dovetail.SDK.Bootstrap.Tests/packages.config
Expand Up @@ -8,8 +8,9 @@
<package id="FubuMVC.References" version="0.9.4.768" />
<package id="HtmlTags" version="1.0.0.56" />
<package id="log4net" version="2.0.0" />
<package id="NUnit" version="2.5.10.11092" allowedVersions="(,2.5.10.11092]"/>
<package id="NUnit" version="2.5.10.11092" allowedVersions="(,2.5.10.11092]" />
<package id="RhinoMocks" version="3.6" />
<package id="Sprache" version="1.9.1.31" />
<package id="structuremap" version="2.6.3" />
<package id="structuremap.automocking" version="2.6.3" />
</packages>
8 changes: 7 additions & 1 deletion source/Dovetail.SDK.Bootstrap/Dovetail.SDK.Bootstrap.csproj
Expand Up @@ -57,6 +57,9 @@
<Reference Include="Microsoft.Practices.ServiceLocation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\CommonServiceLocator.1.0\lib\NET35\Microsoft.Practices.ServiceLocation.dll</HintPath>
</Reference>
<Reference Include="Sprache">
<HintPath>..\packages\Sprache.1.9.1.31\lib\NET40\Sprache.dll</HintPath>
</Reference>
<Reference Include="StructureMap, Version=2.6.3.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223, processorArchitecture=MSIL">
<HintPath>..\packages\structuremap.2.6.3\lib\StructureMap.dll</HintPath>
</Reference>
Expand Down Expand Up @@ -92,6 +95,7 @@
<Compile Include="History\AssemblerPolicies\CaseHistoryAssemblerPolicy.cs" />
<Compile Include="History\CommonActEntryBuilderDSLExtensions.cs" />
<Compile Include="History\AssemblerPolicies\DefaultHistoryAssemblerProvider.cs" />
<Compile Include="History\HistoryParser.cs" />
<Compile Include="History\TemplatePolicies\DefaultActEntryTemplatePolicyRegistry.cs" />
<Compile Include="History\Configuration\HistorySettings.cs" />
<Compile Include="History\TemplatePolicies\SamplePolicy.cs" />
Expand Down Expand Up @@ -123,7 +127,9 @@
<None Include="Dovetail.SDK.Bootstrap.nuspec" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Folder Include="History\Parser\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
Expand Down
70 changes: 70 additions & 0 deletions source/Dovetail.SDK.Bootstrap/History/HistoryParser.cs
@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Sprache;

namespace Dovetail.SDK.Bootstrap.History
{
public class Document
{
public IEnumerable<Item> Items { get; set; }
}

public class Item
{
}

public class Content : Item
{
public string Text { get; set; }

public override string ToString()
{
return Text;
}
}

public class EmailHeader : Item
{
public IEnumerable<EmailHeaderItem> Headers { get; set; }
}

public class EmailHeaderItem
{
public string Title { get; set; }
public string Text { get; set; }
}

public class HistoryParser
{
public static readonly string[] EmailHeaderFields = new[] {"from", "to", "Send to", "cc", "subject"};

public static readonly Parser<char> UntilEndOfLine = Parse.CharExcept(c => c == '\r' || c == '\n', "start of line ending");

public static readonly Parser<EmailHeaderItem> EmailHeaderItem =
from title in Parse.Letter.Many().Text().Token()
where EmailHeaderFields.Any(h => h.Equals(title, StringComparison.InvariantCultureIgnoreCase))
from _1 in Parse.Char(':')
from text in UntilEndOfLine.Many().Token().Text()
from rest in Parse.WhiteSpace.Many()
select new EmailHeaderItem {Title = title, Text = text};

public static readonly Parser<EmailHeader> EmailHeader =
from items in EmailHeaderItem.Many()
select new EmailHeader {Headers = items};

public static readonly Parser<Content> Content =
from text in UntilEndOfLine.Many().Token().Text()
from rest in Parse.WhiteSpace.Many()
select new Content {Text = text};

public static readonly Parser<Item> Item =
EmailHeader.Select(n => (Item) n)
.Or(Content);

public static readonly Parser<Document> Document =
from leading in Parse.WhiteSpace.Many()
from items in Item.Many().End()
select new Document {Items = items};
}
}
1 change: 1 addition & 0 deletions source/Dovetail.SDK.Bootstrap/packages.config
Expand Up @@ -4,5 +4,6 @@
<package id="Dovetail.SDK" version="3.2.4.6" />
<package id="FubuCore" version="0.9.4.117" />
<package id="log4net" version="2.0.0" />
<package id="Sprache" version="1.9.1.31" />
<package id="structuremap" version="2.6.3" />
</packages>
2 changes: 0 additions & 2 deletions source/Web/Web.csproj
Expand Up @@ -114,9 +114,7 @@
<Content Include="content\scripts\bootstrap.min.js" />
<Content Include="content\scripts\site.js" />
<Content Include="content\scripts\moment.min.js" />
<Content Include="content\styles\bootstrap-responsive.css" />
<Content Include="content\styles\bootstrap-responsive.min.css" />
<Content Include="content\styles\bootstrap.css" />
<Content Include="content\styles\bootstrap.min.css" />
<Content Include="content\styles\site.css" />
<Content Include="content\swagger-ui\index.html" />
Expand Down

0 comments on commit bc8e97c

Please sign in to comment.