Instead of simply hiding control characters in esc_path by replacing them with '?', use Character Escape Codes (CEC) i.e. alphabetic backslash sequences like those found in C programming language and many other languages influenced by it, such as Java and Perl. If control characted doesn't have corresponding character escape code, use octal char sequence to escape it. Additionally use 'span' element with 'cntrl' attribute to mark escaped control characters. Add style for span.cntrl in the CSS. Below there is alternative quoting using Unicode Printable Representation (PR), i.e. replace control characters with appropriate Unicode Control Pictures U+2400 - U+243F (9216 - 9279), the Unicode characters reserved for representing control characters when it is necessary to print or display them: sub esc_path { my $str = shift; $str = esc_html($str); $str =~ s!([[:cntrl:]])!sprintf('<span class="cntrl">&#%04d;</span>', 0x2400+ord($1))!eg; return $str; } Signed-off-by: Jakub Narebski <jnareb@xxxxxxxxx> --- The styling (span.cntrl style) isn't best, I agree. gitweb/gitweb.css | 7 +++++++ gitweb/gitweb.perl | 25 ++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletions(-) diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css index 0eda982..e19e6bc 100644 --- a/gitweb/gitweb.css +++ b/gitweb/gitweb.css @@ -16,6 +16,13 @@ a:hover, a:visited, a:active { color: #880000; } +span.cntrl { + border: dashed #aaaaaa; + border-width: 1px; + padding: 0px 2px 0px 2px; + margin: 0px 2px 0px 2px; +} + img.logo { float: right; border-width: 0px; diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 32926f9..c9b16b5 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -587,8 +587,31 @@ sub esc_html ($;%) { # quote control characters and escape filename to HTML sub esc_path { my $str = shift; + + sub quot { + my $seq = shift; + my %es = ( # character escape codes, aka escape sequences + "\t" => '\t', # tab (HT, TAB) + "\n" => '\n', # newline (NL) + "\r" => '\r', # return (CR) + "\f" => '\f', # form feed (FF) + "\b" => '\b', # backspace (BS) + "\a" => '\a', # alarm (bell) (BEL) + "\e" => '\e', # escape (ESC) + "\013" => '\v', # vertical tab (VT) + "\000" => '\0', # null character (NUL) + ); + + if (exists $es{$seq}) { + # C escape sequence, aka character escape code + return $es{$seq}; + } + # octal char sequence + return sprintf('\%03o', ord($seq)); + } + $str = esc_html($str); - $str =~ s/[[:cntrl:]]/?/g; # like --hide-control-chars in ls + $str =~ s!([[:cntrl:]])!'<span class="cntrl">' . quot($1) . '</span>'!eg; return $str; } -- 1.4.3.4 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html