From 4ce46dda4dfae65a458bdf4591505b6a6a8465f3 Mon Sep 17 00:00:00 2001 From: Fabian Eichhorner Date: Sat, 19 Jan 2019 23:55:37 +0100 Subject: [PATCH] make report advanced --- .../Controllers/PdfController.cs | 16 ++- service-reporting/Dockerfile | 2 +- .../Utility/TemplateGenerator.cs | 107 ++++++++++++++---- service-reporting/assets/indico.png | Bin 0 -> 929 bytes service-reporting/assets/thumbs_down.png | Bin 0 -> 940 bytes service-reporting/assets/thumbs_up.png | Bin 0 -> 964 bytes service-reporting/assets/twitter.png | Bin 0 -> 17744 bytes 7 files changed, 97 insertions(+), 28 deletions(-) create mode 100644 service-reporting/assets/indico.png create mode 100644 service-reporting/assets/thumbs_down.png create mode 100644 service-reporting/assets/thumbs_up.png create mode 100644 service-reporting/assets/twitter.png diff --git a/service-reporting/Controllers/PdfController.cs b/service-reporting/Controllers/PdfController.cs index 726b897..1ed5239 100644 --- a/service-reporting/Controllers/PdfController.cs +++ b/service-reporting/Controllers/PdfController.cs @@ -28,8 +28,8 @@ namespace PdfService.Controllers ColorMode = ColorMode.Color, Orientation = Orientation.Portrait, PaperSize = PaperKind.A4, - Margins = new MarginSettings { Top = 0, Left = 0, Right = 0 }, - DocumentTitle = "PDF Demo Report", + Margins = new MarginSettings { Top =0, Left = 0, Right = 0 }, + DocumentTitle = "Sentiment Analysis - Advanced Report - " + DateTime.Now , }; var objectSettings = new ObjectSettings @@ -41,7 +41,12 @@ namespace PdfService.Controllers new Term("Another Term", 0.3), new Term("Another bad Tweet", 0.1) }), - WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "assets", "bulma.min.css") } + WebSettings = { + DefaultEncoding = "utf-8", + UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "assets", "bulma.min.css") + }, + FooterSettings = { FontSize = 9, Right = "Page [page] of [toPage] ", Line = false, Spacing = 0.812 } + }; var pdf = new HtmlToPdfDocument() @@ -78,14 +83,15 @@ namespace PdfService.Controllers Orientation = Orientation.Portrait, PaperSize = PaperKind.A4, Margins = new MarginSettings { Top = 0, Left = 0, Right = 0 }, - DocumentTitle = "PDF Report", + DocumentTitle = "Sentiment Analysis - Advanced Report - " + DateTime.Now , }; var objectSettings = new ObjectSettings { PagesCount = true, HtmlContent = TemplateGenerator.GetHTMLString(terms), - WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "assets", "bulma.min.css") } + WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet = Path.Combine(Directory.GetCurrentDirectory(), "assets", "bulma.min.css") }, + FooterSettings = { FontSize = 9, Right = "Page [page] of [toPage] ", Line = false, Spacing = 0.812 } }; var pdf = new HtmlToPdfDocument() diff --git a/service-reporting/Dockerfile b/service-reporting/Dockerfile index 1715fa4..1cef98c 100644 --- a/service-reporting/Dockerfile +++ b/service-reporting/Dockerfile @@ -35,5 +35,5 @@ RUN apt-get update \ https://github.com/rdvojmoc/DinkToPdf/raw/v1.0.8/v0.12.4/64%20bit/libwkhtmltox.so # copy assets -COPY assets/*.css ./assets/ +COPY assets/*.* ./assets/ ENTRYPOINT ["dotnet", "PdfService.dll"] \ No newline at end of file diff --git a/service-reporting/Utility/TemplateGenerator.cs b/service-reporting/Utility/TemplateGenerator.cs index b06987b..ba135e0 100644 --- a/service-reporting/Utility/TemplateGenerator.cs +++ b/service-reporting/Utility/TemplateGenerator.cs @@ -1,33 +1,86 @@ using System.Text; using PdfService.Models; +using System.IO; +using System; +using System.Linq; +using System.Collections.Generic; namespace PdfService.Utility { public static class TemplateGenerator { + // calculates standard deviation for list + // from: https://stackoverflow.com/questions/3141692/standard-deviation-of-generic-list + private static float CalculateStdDev(IEnumerable values) + { + double ret = 0; + if (values.Count() > 0) + { + //Compute the Average + double avg = values.Average(); + //Perform the Sum of (value-avg)_2_2 + double sum = values.Sum(d => Math.Pow(d - avg, 2)); + //Put it all together + ret = Math.Sqrt((sum) / (values.Count()-1)); + } + return (float)ret; + } + public static string GetHTMLString(Term[] terms) { var sb = new StringBuilder(); - sb.Append(@" + sb.AppendFormat(@" + + -
-
-
-

- Tweet Sentiment Analysis -

-

- Results for the terms -

-
+
+
+
+

+ Sentiment Analysis - Advanced Report +

+

+ For terms: {0} +

+
+
+
+ + + + + + +
+
+
+
+ +

Overall statistics

+ Amount of terms: {1}
+ Mean sentiment value: {2:0.00}
+ Standard deviation: {3:0.00}
+ Date: {4}
+
+

Detail results:

+ +
+ Legend:
+ Negative Sentiment Value: 0-0.4
+ Neutral Sentiment Value: 0.4-0.6
+ Positive Sentiment Value: 0.6-1.0
-
-
- "); + ", terms.Select(i => i.Name).Aggregate((i, j) => i + ',' + ' ' + j), + terms.Length, + terms.Select(i => i.Sentiment).Average(), + CalculateStdDev(terms.Select(i => (double)i.Sentiment)), + DateTime.Now, + Path.Combine(Directory.GetCurrentDirectory(), "assets", "indico.png"), + Path.Combine(Directory.GetCurrentDirectory(), "assets", "twitter.png")); foreach (Term term in terms) { @@ -40,19 +93,29 @@ namespace PdfService.Utility color = "is-success"; sb.AppendFormat(@"
-

{0} (value: {3})

-
- Sentiment Analysis Result: -
{1}%
- -
-
", term.Name, System.Math.Ceiling(term.Sentiment*100), color, term.Sentiment); +

{0}

+

Calculated sentiment: {3:0.00}


+ + + + + + +
+
+ +
{1}%
+ +
+ +
", term.Name, System.Math.Ceiling(term.Sentiment*100), color, term.Sentiment, + Path.Combine(Directory.GetCurrentDirectory(), "assets", "thumbs_down.png"), + Path.Combine(Directory.GetCurrentDirectory(), "assets", "thumbs_up.png")); } sb.Append(@" "); - return sb.ToString(); } } diff --git a/service-reporting/assets/indico.png b/service-reporting/assets/indico.png new file mode 100644 index 0000000000000000000000000000000000000000..877b5003df7a454d62f1752672b09df0afe3b2e6 GIT binary patch literal 929 zcmeAS@N?(olHy`uVBq!ia0vp^CxF<7gBeJQw6ZP+Qc(duA+GKPKL2S0;xERW0@@;5 z666=m@MhZk3%^(yg*(=&1*U&Gq8lOen5kmTW^>LNRTiSD%#92TOgBAU978hhy`6b` zT9W~ftKh29JeFGKuX&rfZB zSjg9S;ZjGFz}>Gt?e_7yeDjMLj_6Mnd-7_E`9H~jYFcL;8(EfIYKn<{uD_aDAy%IE z(pMjWILE%c>>q#D-2PRy_V(BQkN%%K`K>N1^lfQU(>>7_&;NE|1h44&u7#mIzWQ%` zngoKDY&YiKqcPW`>9d}@lsOvQcKzRJSFio|rR$@f z#ve=DK5{qR?AvwrVPffJYp*$m6BVT?Ve!VVreQmt_e3f$&9u8JB9&@-$xH%fk zjw{iX+s4X0?PU+pgYSYbJi4sCSYd{5zTJ`8?rXOzbQ-e>P2fwjj!L!z37hA(nwKt> z-hM=q`J*@QX4!`iuIg}{4->pSd5M&VEtkhPNrC^rRy?rs*|Wt(VbQq>KN7_oJF336 z-^xFlvtLQz;=7p@&LWL>RG-iEQ80ZYSLq_y*x@&$lfPF<;O0#Gw}x?SN>$w5)f-PK z#jik9}Ew+dLdoJ^Be5x>2ss5+m&-^JiK^%upebnRl9j5Wt)nA0;{XD(5SEFS(UOzK= vo0_3>;`OVFxM{_&^sF^fllU3@90=_kMjjEH!yg*`njxgN@xNA0gcUr literal 0 HcmV?d00001 diff --git a/service-reporting/assets/thumbs_down.png b/service-reporting/assets/thumbs_down.png new file mode 100644 index 0000000000000000000000000000000000000000..5230a863015578a1e301d9e82b9e98127a3de98e GIT binary patch literal 940 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz-STR6XFWwns~;IB2q)3e12pr zFznJxg8YIR7@3$^SlKx^xp?>m1cih}L?tApWaSi<)ikuU^$jg-Z0#I8y}W&b!onjW zqhsR|lTy+$ODn1ynp)dByLo;%Rd-UwZ z%eU`8e*XIX=kLFs!Zr_q(YD9a#W5t}@YU<#!G|0~SRYJg;4*u&w>)s8%SLUpoEt~) zO}z8}KYvZYNj0wi&dVL+9};#*ERPN|Hk$ww?1lX zO{ut8_BEpIPtg4RMz`)x_xI;zSdduova##Qht>BV$H_Bn@G#Q+%`)%KY0CvMtNiE6 z*IwQ&=dxJFU>Ud1t_J4p>D*^J4wy6)s!h-pZ%|-p=De_zL4sjIGSihO46zJWJFFL^ zK6Kx5OFh@DVEK26&KKt!m17?qyRx@+hu(*b3?`AQthY)U`C=D1igRQ!ZQs>D@mMM2 zZWrMNiLnXs;uSxBX_qD~>SMfdpsiY!b;kEk4s0A}Vq>09j^tom;d677!=eKP0$yHB zTUnoXw}jMRO?Qf%_(FcRUBkxkE&J1c@p(2H@BehWa?!pUGeW<;$@MjKKQk@=`MDIX z#rN;arr8{yGH*w;!QSRP`*QBY^VNkX=UrW_pSQ3{cgya^xPRXd^>NR5%KYx~hJ)-q z=7KlEemuJ=)ac8qpvKhA<*=EfM}uLh(uG9~501S|XVy9}h1qAt7r~R?{drUwuBF?{ q2E9J)Arx4)SM(KUc*{rYO7`kG)2>eF@HPe}9R^QVKbLh*2~7Z77-Pfkd%^wRiXQ z_6?7Sj){v;N>0zoFDS08uBoeU>gep7IA!XLrK{Gi->_-R_I(ErA3c8R%(;s<@7#Ov z=*hDeFJHfX|MBbhpTGZ3ixcq&M&l7r7srr@!)LFh`!hKTusyKMOmY^iWLu5P$*{)uPz)MxKKZNyM7sN4B-Pk%<&0TwCG6`Xxv#2bpe z99Xzl1~G#EQu2n#FU_L; z{&x;YZN0Dh&CtoVVatv4LiZQFzP72+qL7)>+y3>!uaBqM`Cb0C_nO^D?Nz6vewR0= zEwXJ4`unMR%lYK}e{IY9R5vFUyJl5uOuWC}`?#K$>Jt0cZ~JC&*3a{C{o=N+Uz|bq zQKbHhzX^OxAG5xWeEI#`(i(Z`gS##J%pD11z(49Iz0N zc+PY?CZUs?$Dnb}Y|b-G!XFA6tMmkP7;dJxF=m)HGOJsZy=b`3lJz;}wOt0nK9 zta&Z}%aeI=m~dZi>^_O7xBqTr&~UrV{9jN0hVuT;CwDS-0Fx1er>mdKI;Vst077tZ A4gdfE literal 0 HcmV?d00001 diff --git a/service-reporting/assets/twitter.png b/service-reporting/assets/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..565394b9e648f79d5b0de5d06837ed28c0732682 GIT binary patch literal 17744 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 literal 0 HcmV?d00001 -- 2.43.0