#------------------------------------------------------------------------------ # Copyright 2006-2007 Adrian Milliner (ps1 at soapyfrog dot com) # http://ps1.soapyfrog.com # # This work is licenced under the Creative Commons # Attribution-NonCommercial-ShareAlike 2.5 License. # To view a copy of this licence, visit # http://creativecommons.org/licenses/by-nc-sa/2.5/ # or send a letter to # Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. #------------------------------------------------------------------------------ # $Id: get-bufferhtml.ps1 162 2007-01-26 16:30:12Z adrian $ #------------------------------------------------------------------------------ # This script grabs text from the console buffer and outputs to the pipeline # lines of HTML that represent it. # # Usage: get-bufferhtml [args] # # Where args are: # # -last n - how many lines back from current line to grab # default is (effectively) everything # -all - grab all lines in console, overrides -last # -trim - trims blank space from the right of each line # this is ok unless you have lots of text with # varying background colours # -font s - optional css font name. default is nothing which # means the browser will use whatever is default for a #
tag. "Courier New" is quite a good alternative # -fontsize s - optional css font size, eg "9pt" or "80%" # -style s - optional addition css, eg "overflow:hidden" # -palette p - choose a colour palette, one of: # "powershell" normal for a PowerShell window (ie with # strange colours for darkmagenta and darkyellow # "standard" normal ansi colours as used by a standard # cmd.exe session # "print" like powershell, but with colours handy # for printing where you want to save ink. # # The output is one large wrappedtag to keep whitespace intact. # param( [int]$last = 50000, [switch]$all, [switch]$trim, [string]$font=$null, [string]$fontsize=$null, [string]$style="", [string]$palette="powershell" ) $ui = $host.ui.rawui [int]$start = 0 if ($all) { [int]$end = $ui.BufferSize.Height [int]$start = 0 } else { [int]$end = ($ui.CursorPosition.Y - 1) [int]$start = $end - $last if ($start -le 0) { $start = 0 } } $height = $end - $start if ($height -le 0) { write-warning "There must be one or more lines to get" return } $width = $ui.BufferSize.Width $dims = 0,$start,($width-1),($end-1) $rect = new-object Management.Automation.Host.Rectangle -argumentList $dims $cells = $ui.GetBufferContents($rect) # set default colours $fg = $ui.ForegroundColor; $bg = $ui.BackgroundColor $defaultfg = $fg; $defaultbg = $bg # character translations # wordpress weirdness means I do special stuff for < and \ $cmap = @{ [char]"<" = "<" [char]"\" = "\" [char]">" = ">" [char]"'" = "'" [char]"`"" = """ [char]"&" = "&" } # console colour mapping # the powershell console has some odd colour choices, # marked with a 6-char hex codes below $palettes = @{} $palettes.powershell = @{ "Black" ="#000" "DarkBlue" ="#008" "DarkGreen" ="#080" "DarkCyan" ="#088" "DarkRed" ="#800" "DarkMagenta" ="#012456" "DarkYellow" ="#eeedf0" "Gray" ="#ccc" "DarkGray" ="#888" "Blue" ="#00f" "Green" ="#0f0" "Cyan" ="#0ff" "Red" ="#f00" "Magenta" ="#f0f" "Yellow" ="#ff0" "White" ="#fff" } # now a variation for the standard console (used by cmd.exe) based # on ansi colours $palettes.standard = ($palettes.powershell).Clone() $palettes.standard.DarkMagenta = "#808" $palettes.standard.DarkYellow = "#880" # this is a weird one... takes the normal powershell one and # inverts a few colours so normal ps1 output would save ink when # printed (eg from a web page). $palettes.print = ($palettes.powershell).Clone() $palettes.print.DarkMagenta = "#eee" $palettes.print.DarkYellow = "#000" $palettes.print.Yellow = "#440" $palettes.print.Black = "#fff" $palettes.print.White = "#000" $comap = $palettes[$palette] # inner function to translate a console colour to an html/css one function c2h{return $comap[[string]$args[0]]} $f="" if ($font) { $f += " font-family: `"$font`";" } if ($fontsize) { $f += " font-size: $fontsize;" } $line = "" for ([int]$row=0; $row -lt $height; $row++ ) { for ([int]$col=0; $col -lt $width; $col++ ) { $cell = $cells[$row,$col] # do we need to change colours? $cfg = [string]$cell.ForegroundColor $cbg = [string]$cell.BackgroundColor if ($fg -ne $cfg -or $bg -ne $cbg) { if ($fg -ne $defaultfg -or $bg -ne $defaultbg) { $line += "" # remove any specialisation $fg = $defaultfg; $bg = $defaultbg; } if ($cfg -ne $defaultfg -or $cbg -ne $defaultbg) { # start a new colour span $line += "" } $fg = $cfg $bg = $cbg } $ch = $cell.Character $ch2 = $cmap[$ch]; if ($ch2) { $ch = $ch2 } $line += $ch } if ($trim) { $line = $Line.TrimEnd() } $line $line="" } if ($fg -ne $defaultfg -or $bg -ne $defaultbg) { "" } # close off any specialisation of colour "
"