@@ -75,6 +75,16 @@ class PrettyPrinter extends LogPrinter {
7575 final bool printEmojis;
7676 final bool printTime;
7777
78+ /// To prevent ascii 'boxing' of any log [Level] include the level in map for excludeBox,
79+ /// for example to prevent boxing of [Level.verbose] and [Level.info] use excludeBox:{Level.verbose:true, Level.info:true}
80+ final Map <Level , bool > excludeBox;
81+
82+ /// To make the default for every level to prevent boxing entirely set [noBoxing] to true
83+ /// (boxing can still be turned on for some levels by using something like excludeBox:{Level.error:false} )
84+ final bool noBoxingByDefault;
85+
86+ late final Map <Level , bool > includeBox;
87+
7888 String _topBorder = '' ;
7989 String _middleBorder = '' ;
8090 String _bottomBorder = '' ;
@@ -87,6 +97,8 @@ class PrettyPrinter extends LogPrinter {
8797 this .colors = true ,
8898 this .printEmojis = true ,
8999 this .printTime = false ,
100+ this .excludeBox = const {},
101+ this .noBoxingByDefault = false ,
90102 }) {
91103 _startTime ?? = DateTime .now ();
92104
@@ -100,6 +112,14 @@ class PrettyPrinter extends LogPrinter {
100112 _topBorder = '$topLeftCorner $doubleDividerLine ' ;
101113 _middleBorder = '$middleCorner $singleDividerLine ' ;
102114 _bottomBorder = '$bottomLeftCorner $doubleDividerLine ' ;
115+
116+ // Translate excludeBox map (constant if default) to includeBox map with all Level enum possibilities
117+ includeBox = {};
118+ for (var levelEnum in Level .values) {
119+ includeBox[levelEnum] = excludeBox.containsKey (levelEnum)
120+ ? ! excludeBox[levelEnum]!
121+ : ! noBoxingByDefault;
122+ }
103123 }
104124
105125 @override
@@ -252,38 +272,40 @@ class PrettyPrinter extends LogPrinter {
252272 // This code is non trivial and a type annotation here helps understanding.
253273 // ignore: omit_local_variable_types
254274 List <String > buffer = [];
275+ var verticalLineAtLevel = (includeBox[level]! ) ? (verticalLine + ' ' ) : '' ;
255276 var color = _getLevelColor (level);
256- buffer.add (color (_topBorder));
277+ if (includeBox[level] ! ) buffer.add (color (_topBorder));
257278
258279 if (error != null ) {
259280 var errorColor = _getErrorColor (level);
260281 for (var line in error.split ('\n ' )) {
261282 buffer.add (
262- color ('$ verticalLine ' ) +
283+ color (verticalLineAtLevel ) +
263284 errorColor.resetForeground +
264285 errorColor (line) +
265286 errorColor.resetBackground,
266287 );
267288 }
268- buffer.add (color (_middleBorder));
289+ if (includeBox[level] ! ) buffer.add (color (_middleBorder));
269290 }
270291
271292 if (stacktrace != null ) {
272293 for (var line in stacktrace.split ('\n ' )) {
273- buffer.add (color ('$verticalLine $line ' ));
294+ buffer.add (color ('$verticalLineAtLevel $line ' ));
274295 }
275- buffer.add (color (_middleBorder));
296+ if (includeBox[level] ! ) buffer.add (color (_middleBorder));
276297 }
277298
278299 if (time != null ) {
279- buffer..add (color ('$verticalLine $time ' ))..add (color (_middleBorder));
300+ buffer.add (color ('$verticalLineAtLevel $time ' ));
301+ if (includeBox[level]! ) buffer.add (color (_middleBorder));
280302 }
281303
282304 var emoji = _getEmoji (level);
283305 for (var line in message.split ('\n ' )) {
284- buffer.add (color ('$verticalLine $emoji $line ' ));
306+ buffer.add (color ('$verticalLineAtLevel $emoji $line ' ));
285307 }
286- buffer.add (color (_bottomBorder));
308+ if (includeBox[level] ! ) buffer.add (color (_bottomBorder));
287309
288310 return buffer;
289311 }
0 commit comments