view interps/c-intercal/doc/fix83.pl @ 11293:a7899ef2d7b6

<wob_jonas> learn Aristotle said that every illness can be cured by balancing the four vitreous humors, and everyone believed him for two thousand years, even though people still died of illnesses. It wasn\'t until the 20th century that Szent-Gy\xc3\xb6rgyi Albert realized that Aristotle didn\'t find fifth kind of vitreous humor, vitamin C, because the Greek alphabet
author HackBot
date Mon, 01 Jan 2018 17:57:43 +0000
parents 859f9b4339e6
children
line wrap: on
line source

#!/bin/perl

# Change .html to .htm and change all URLs appropriately in the file
# being edited; also fix a bug in makeinfo that sometimes causes
# incorrect anchors to be used in the META REFRESH commands.
#
# This script assumes the output from makeinfo is reasonably correct, so it
# needs to be run on a system that supports filenames longer than 8.3; it
# converts these long filenames into 8.3 form.

my @base32str=qw{0 1 2 3 4 5 6 7 8 9 a b c d e f
		 g h i j k l m n o p q r s t u v};

# Hash a string into 8 5-bit segments, base32 encoded
# The algorithm isn't designed to be secure or anything like that, but simply
# to avoid collisions in what filenames are mapped to. I don't know how well
# it succeeds at this. Note that this can't map to "index" unless the input
# is "index", in which case it always does; this is a special case. The
# hashing is case-insensitive to reduce errors on DOS.
sub hash8x5($)
{
    my $low32sf=0;
    my $high32sf=0;
    my $str=shift;
    $str=lc $str;
    defined($str) or die;
    return "index" if $str eq "index";
    while($str ne '')
    {
	$low32sf ^= !!($low32sf & (1<<19));
	$low32sf &= (1<<19)-1;
	$low32sf <<= 1;
	$low32sf ^= ord $str;
	$low32sf *= 41;
	$high32sf ^= !!($high32sf & (511<<11));
	$high32sf &= (1<<11)-1;
	$high32sf <<= 9;
	$high32sf ^= ord $str;
	$high32sf *= 43;
	$str = substr $str, 1;
    }
    $str = $base32str[$low32sf & 31]; $low32sf >>= 5;
    $str .= $base32str[$low32sf & 31]; $low32sf >>= 5;
    $str .= $base32str[$low32sf & 31]; $low32sf >>= 5;
    $str .= $base32str[$low32sf & 31];
    $str .= $base32str[$high32sf & 31]; $high32sf >>= 5;
    $str .= $base32str[$high32sf & 31]; $high32sf >>= 5;
    $str .= $base32str[$high32sf & 31]; $high32sf >>= 5;
    $str .= $base32str[$high32sf & 31];
    return $str;
}

$/=undef; #read the whole file at a time

open CSSFILE, "<ickstyle.css";
my $css = <CSSFILE>;
close CSSFILE;

while(<>)
{
    /^<meta http-equiv="refresh"/s and do{
	s/\#\%/'#g_t%'/ge;
	s/\%/_00/g;
	s/(url=)([^\">]*?).html([\"\#])/$1 . hash8x5($2) . ".htm" . $3/ge;
    };
    s/(\-\-><\/style>)/$css$1/;
    s/(href=\")([^\">]*?).html([\"\#])/$1 . hash8x5($2) . ".htm" . $3/ge;
    s=^(.*?)\.html$="mv html/".$1.".html html/".hash8x5($1).".htm"=gemi;
    print;
}