From d7696912e007a2b455a2fd5e1974924d2efe83b3 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 24 Feb 2018 16:51:37 -0500 Subject: reimplement log parser with serverside parsing and vue.js frontend --- src/SMAPI.Web/wwwroot/Content/css/log-parser.css | 325 +++++++++++------------ 1 file changed, 161 insertions(+), 164 deletions(-) (limited to 'src/SMAPI.Web/wwwroot/Content/css') diff --git a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css index 9f07f9e8..a3be0c85 100644 --- a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css +++ b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css @@ -1,21 +1,23 @@ -.mod-repeat { - font-size: 8pt; +/********* +** Main layout +*********/ +input[type="button"] { + font-size: 20px; + border-radius: 5px; + outline: none; + box-shadow: inset 0 0 1px 1px rgba(0, 0, 0, .2); + cursor: pointer; } -.template { - display: none; +caption { + text-align: left; + padding-top: 2px; } -.popup, #uploader { - position: fixed; - top: 0px; - left: 0px; - right: 0px; - bottom: 0; - background-color: rgba(0, 0, 0, .33); - z-index: 2; - display: none; - padding: 5px; +#output { + padding: 10px; + overflow: auto; + font-family: monospace; } #upload-button { @@ -27,101 +29,81 @@ background: #eef; } - -#uploader:after { - content: attr(data-text); - display: block; - width: 100px; - height: 24px; - line-height: 25px; - border: 1px solid #000; - background: #fff; - position: absolute; - top: 50%; - left: 50%; - margin: -12px -50px 0 0; - font-size: 18px; +/********* +** Log metadata & filters +*********/ +#metadata, #mods, #filters { font-weight: bold; - text-align: center; - border-radius: 5px; + border-bottom: 1px dashed #888888; + padding-bottom: 10px; + margin-bottom: 5px; } -.popup h1 { - position: absolute; - top: 10%; - left: 50%; - margin-left: -150px; - text-align: center; - width: 300px; - border: 1px solid #008; +table#metadata, +table#mods { + border: 1px solid #000000; + background: #ffffff; border-radius: 5px; - background: #fff; - font-family: sans-serif; - font-size: 40px; - margin-top: -25px; - z-index: 10; - border-bottom: 0; + border-spacing: 1px; + overflow: hidden; + cursor: default; + box-shadow: 1px 1px 1px 1px #dddddd; } -.frame { - margin: auto; - margin-top: 25px; - padding: 2em; - position: absolute; - top: 10%; - left: 10%; - right: 10%; - bottom: 10%; - padding-bottom: 30px; - background: #FFF; - border-radius: 5px; - border: 1px solid #008; +#mods { + min-width: 400px; } -input[type="button"] { - font-size: 20px; - border-radius: 5px; - outline: none; - box-shadow: inset 0px 0px 1px 1px rgba(0, 0, 0, .2); - cursor: pointer; +#mods .color-red { + color: red; } -#input[type="button"]:hover { - background-color: #fee; +#mods .color-green { + color: green; } -#cancel, #closeraw { - border: 1px solid #880000; - background-color: #fcc; +#mods tr { + cursor: pointer; } -#submit { - border: 1px solid #008800; - background-color: #cfc; +#metadata tr, +#mods tr { + background: #eee } -#submit:hover { - background-color: #efe; +#mods span.notice { + font-weight: normal; + font-size: 11px; + position: relative; + top: -1px; + display: none; } -#input, #dataraw { - width: 100%; - height: 30em; - max-height: 70%; - margin: auto; - box-sizing: border-box; +#mods span.notice.btn { + cursor: pointer; + border: 1px solid #000; border-radius: 5px; - border: 1px solid #000088; - outline: none; - box-shadow: inset 0px 0px 1px 1px rgba(0, 0, 192, .2); + position: relative; + top: -1px; + padding: 0 2px; + background: #eee; } -.color-red { - color: red; +#mods span.notice.txt { + display: inline-block; } -.color-green { - color: green; +#mods .mod-entry.hidden { + opacity: 0.5; +} + +#metadata td:first-child { + padding-right: 5px; +} + +#metadata tr:nth-child(even), +#mods tr:nth-child(even) { + background: #fff } #filters { @@ -155,59 +137,35 @@ input[type="button"] { background: #efe; } -#output { - padding: 10px; - overflow: auto; - font-family: monospace; -} - -#output > * { - display: block; -} - -#output.trace .trace, -#output.debug .debug, -#output.info .info, -#output.alert .alert, -#output.warn .warn, -#output.error .error { - display: none; +/********* +** Log +*********/ +#log .mod-repeat { + font-size: 0.85em; } -#output .trace { +#log .trace { color: #999; } -#output .debug { +#log .debug { color: #595959; } -#output .info { - color: #000 +#log .info { + color: #000; } -#output .alert { +#log .alert { color: #b0b; } -#output .warn { - color: #f80 -} - -#output .error { - color: #f00 +#log .warn { + color: #f80; } -#output .always { - font-weight: bold; - border-bottom: 1px dashed #888888; - padding-bottom: 10px; - margin-bottom: 5px; -} - -caption { - text-align: left; - padding-top: 2px; +#log .error { + color: #f00; } #log { @@ -224,6 +182,7 @@ caption { border-bottom: 1px dotted #ccc; border-top: 2px solid #fff; vertical-align: top; + white-space: pre-wrap; } #log td:not(:last-child) { @@ -259,61 +218,99 @@ caption { width: 100%; } -table#gameinfo, -table#modslist { - border: 1px solid #000000; - background: #ffffff; - border-radius: 5px; - border-spacing: 1px; - overflow: hidden; - cursor: default; - box-shadow: 1px 1px 1px 1px #dddddd; +#error { + color: #f00; } -#modslist { - min-width: 400px; -} -#gameinfo td:first-child { - padding-right: 5px; +/********* +** Upload popup +*********/ +#upload-area .popup, +#upload-area #uploader { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, .33); + z-index: 2; + display: none; + padding: 5px; } -#gameinfo tr, -#modslist tr { - background: #eee +#upload-area #uploader:after { + content: attr(data-text); + display: block; + width: 100px; + height: 24px; + line-height: 25px; + border: 1px solid #000; + background: #fff; + position: absolute; + top: 50%; + left: 50%; + margin: -12px -50px 0 0; + font-size: 18px; + font-weight: bold; + text-align: center; + border-radius: 5px; } -#gameinfo tr:nth-child(even), -#modslist tr:nth-child(even) { - background: #fff +#upload-area .popup h1 { + position: absolute; + top: 10%; + left: 50%; + margin-left: -150px; + text-align: center; + width: 300px; + border: 1px solid #008; + border-radius: 5px; + background: #fff; + font-family: sans-serif; + font-size: 40px; + margin-top: -25px; + z-index: 10; + border-bottom: 0; } -#modslist tr { - cursor: pointer; +#upload-area .frame { + margin: auto; + margin-top: 25px; + padding: 2em; + position: absolute; + top: 10%; + left: 10%; + right: 10%; + bottom: 10%; + padding-bottom: 30px; + background: #FFF; + border-radius: 5px; + border: 1px solid #008; } -span.notice { - font-weight: normal; - font-size: 11px; - position: relative; - top: -1px; - display: none; +#upload-area #cancel { + border: 1px solid #880000; + background-color: #fcc; } -span.notice.btn { - cursor: pointer; - border: 1px solid #000; - border-radius: 5px; - position: relative; - top: -1px; - padding: 0 2px; - background: #eee; +#upload-area #submit { + border: 1px solid #008800; + background-color: #cfc; } -#output:not(.modfilter) span.notice.txt { - display: inline-block; +#upload-area #submit:hover { + background-color: #efe; } -#output.modfilter span.notice.btn { - display: inline-block; +#upload-area #input { + width: 100%; + height: 30em; + max-height: 70%; + margin: auto; + box-sizing: border-box; + border-radius: 5px; + border: 1px solid #000088; + outline: none; + box-shadow: inset 0px 0px 1px 1px rgba(0, 0, 192, .2); } -- cgit From 691310d16e6873b83c55f62a59d5010dd8bb7e98 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 24 Feb 2018 16:52:38 -0500 Subject: add content pack support to log parser --- docs/release-notes.md | 1 + src/SMAPI.Web/Framework/LogParsing/LogParser.cs | 23 ++++++++++++++++++++++ .../Framework/LogParsing/Models/ModInfo.cs | 3 +++ src/SMAPI.Web/Views/LogParser/Index.cshtml | 19 +++++++++++++++++- src/SMAPI.Web/wwwroot/Content/css/log-parser.css | 6 ++++++ 5 files changed, 51 insertions(+), 1 deletion(-) (limited to 'src/SMAPI.Web/wwwroot/Content/css') diff --git a/docs/release-notes.md b/docs/release-notes.md index 03b6dd77..da651be2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -22,6 +22,7 @@ * For the [log parser][]: * Significantly reduced download size when viewing files with repeated errors. + * Added support for SMAPI 2.5 content packs. * Improved parse error handling. * Fixed 'log started' field showing incorrect date. diff --git a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs index 1c3b5671..23a1baa4 100644 --- a/src/SMAPI.Web/Framework/LogParsing/LogParser.cs +++ b/src/SMAPI.Web/Framework/LogParsing/LogParser.cs @@ -31,6 +31,12 @@ namespace StardewModdingAPI.Web.Framework.LogParsing /// A regex pattern matching an entry in SMAPI's mod list. private readonly Regex ModListEntryPattern = new Regex(@"^ (?.+) (?.+) by (?.+) \| (?.+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase); + /// A regex pattern matching the start of SMAPI's content pack list. + private readonly Regex ContentPackListStartPattern = new Regex(@"^Loaded \d+ content packs:$", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + /// A regex pattern matching an entry in SMAPI's content pack list. + private readonly Regex ContentPackListEntryPattern = new Regex(@"^ (?.+) (?.+) by (?.+) \| for (?.+?) \| (?.+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase); + /********* ** Public methods @@ -62,6 +68,7 @@ namespace StardewModdingAPI.Web.Framework.LogParsing LogModInfo smapiMod = new LogModInfo { Name = "SMAPI", Author = "Pathoschild", Description = "" }; IDictionary mods = new Dictionary(); bool inModList = false; + bool inContentPackList = false; foreach (LogMessage message in log.Messages) { // collect stats @@ -79,6 +86,8 @@ namespace StardewModdingAPI.Web.Framework.LogParsing // update flags if (inModList && !this.ModListEntryPattern.IsMatch(message.Text)) inModList = false; + if (inContentPackList && !this.ContentPackListEntryPattern.IsMatch(message.Text)) + inContentPackList = false; // mod list if (!inModList && message.Level == LogLevel.Info && this.ModListStartPattern.IsMatch(message.Text)) @@ -93,6 +102,20 @@ namespace StardewModdingAPI.Web.Framework.LogParsing mods[name] = new LogModInfo { Name = name, Author = author, Version = version, Description = description }; } + // content pack list + else if (!inContentPackList && message.Level == LogLevel.Info && this.ContentPackListStartPattern.IsMatch(message.Text)) + inContentPackList = true; + else if (inContentPackList) + { + Match match = this.ContentPackListEntryPattern.Match(message.Text); + string name = match.Groups["name"].Value; + string version = match.Groups["version"].Value; + string author = match.Groups["author"].Value; + string description = match.Groups["description"].Value; + string forMod = match.Groups["for"].Value; + mods[name] = new LogModInfo { Name = name, Author = author, Version = version, Description = description, ContentPackFor = forMod }; + } + // platform info line else if (message.Level == LogLevel.Info && this.InfoLinePattern.IsMatch(message.Text)) { diff --git a/src/SMAPI.Web/Framework/LogParsing/Models/ModInfo.cs b/src/SMAPI.Web/Framework/LogParsing/Models/ModInfo.cs index 2005e61f..8c84ab38 100644 --- a/src/SMAPI.Web/Framework/LogParsing/Models/ModInfo.cs +++ b/src/SMAPI.Web/Framework/LogParsing/Models/ModInfo.cs @@ -18,6 +18,9 @@ namespace StardewModdingAPI.Web.Framework.LogParsing.Models /// The mod description. public string Description { get; set; } + /// The name of the mod for which this is a content pack (if applicable). + public string ContentPackFor { get; set; } + /// The number of errors logged by this mod. public int Errors { get; set; } } diff --git a/src/SMAPI.Web/Views/LogParser/Index.cshtml b/src/SMAPI.Web/Views/LogParser/Index.cshtml index 8d1abbb1..20e20ee1 100644 --- a/src/SMAPI.Web/Views/LogParser/Index.cshtml +++ b/src/SMAPI.Web/Views/LogParser/Index.cshtml @@ -1,5 +1,10 @@ @{ ViewData["Title"] = "SMAPI log parser"; + + Dictionary contentPacks = Model.ParsedLog?.Mods + ?.GroupBy(mod => mod.ContentPackFor) + .Where(group => group.Key != null) + .ToDictionary(group => group.Key, group => group.ToArray()); } @using Newtonsoft.Json @using StardewModdingAPI.Web.Framework.LogParsing.Models @@ -69,10 +74,22 @@ show all hide all - @foreach (var mod in Model.ParsedLog.Mods) + @foreach (var mod in Model.ParsedLog.Mods.Where(p => p.ContentPackFor == null)) { + + @mod.Name + @if (contentPacks != null && contentPacks.TryGetValue(mod.Name, out LogModInfo[] contentPackList)) + { +
+ @foreach (var contentPack in contentPackList) + { + +@contentPack.Name @contentPack.Version + } +
+ } + @mod.Version @mod.Author @if (mod.Errors == 0) diff --git a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css index a3be0c85..cbf09ffe 100644 --- a/src/SMAPI.Web/wwwroot/Content/css/log-parser.css +++ b/src/SMAPI.Web/wwwroot/Content/css/log-parser.css @@ -97,6 +97,12 @@ table#mods { opacity: 0.5; } +#mods .content-packs { + margin-left: 1em; + font-size: 0.9em; + font-style: italic; +} + #metadata td:first-child { padding-right: 5px; } -- cgit