Compare commits

..

No commits in common. "3f48486a5cd2e66713430885f8826bd2af39412d" and "4d89b2903b5fc51fd6e1b8efe9a9ed46113b34d7" have entirely different histories.

7 changed files with 226 additions and 348 deletions

View File

@ -1,6 +1,5 @@
# -*- mode: perl; -*-
package CheckURL;
# file CheckURL.pm
#
# This file is part of LyX, the document processor.
@ -14,8 +13,7 @@ package CheckURL;
#
use strict;
our (@EXPORT, @ISA);
our(@EXPORT, @ISA);
BEGIN {
use Exporter ();
@ISA = qw(Exporter);
@ -27,18 +25,16 @@ sub check_http_url($$$$);
sub check_ftp_dir_entry($$);
sub check_ftp_url($$$$);
sub check_unknown_url($$$$);
sub check_url($$$$);
sub check_url($$);
################
my $fe;
my $fs;
sub check_http_url($$$$) {
sub check_http_url($$$$)
{
require LWP::UserAgent;
my ($protocol, $host, $path, $file) = @_;
my $ua = LWP::UserAgent->new(timeout => 20);
my $ua = LWP::UserAgent->new;
my $getp = "/";
if ($path ne "") {
$getp .= $path;
@ -58,7 +54,7 @@ sub check_http_url($$$$) {
$buf = $response->decoded_content;
}
else {
print $fe " " . $response->status_line . ": ";
print " " . $response->status_line . ": ";
return 3;
}
my @title = ();
@ -70,9 +66,9 @@ sub check_http_url($$$$) {
$title =~ s/^ //;
$title =~ s/ $//;
push(@title, $title);
print $fe "title = \"$title\": ";
print "title = \"$title\": ";
if ($title =~ /Error 404|Not Found/) {
print $fe " Page reports 'Not Found' from \"$protocol://$host$getp\": ";
print " Page reports 'Not Found' from \"$protocol://$host$getp\": ";
$res = 3;
}
}
@ -83,39 +79,39 @@ sub check_http_url($$$$) {
# returns 0, x if file does not match entry
# 1, x everything OK
# 2, x if not accesible (permission)
sub check_ftp_dir_entry($$) {
sub check_ftp_dir_entry($$)
{
my ($file, $e) = @_;
my $other = '---';
my $isdir = 0;
#print $fe "Checking '$file' against '$e'\n";
#print "Checking '$file' against '$e'\n";
$file =~ s/^\///;
$isdir = 1 if ($e =~ /^d/);
return (0, $isdir) if ($e !~ /\s$file$/);
return(0,$isdir) if ($e !~ /\s$file$/);
if ($e =~ /^.[-rwx]{6}([-rwx]{3})\s/) {
$other = $1;
}
else {
#print $fe "Invalid entry\n";
#print "Invalid entry\n";
# Invalid entry
return (0, $isdir);
return(0,$isdir);
}
return (2, $isdir) if ($other !~ /^r/); # not readable
return(2,$isdir) if ($other !~ /^r/); # not readable
if ($isdir) {
#return(2,$isdir) if ($other !~ /x$/); # directory, but not executable
}
return (1, $isdir);
return(1,$isdir);
}
sub check_ftp2_url($$$$) {
sub check_ftp2_url($$$$)
{
my ($protocol, $host, $path, $file) = @_;
my $checkentry = 1;
#print $fe "\nhost $host\n";
#print $fe "path $path\n";
#print $fe "file $file\n";
print "\nhost $host\n";
print "path $path\n";
print "file $file\n";
my $url = "$protocol://$host";
$path =~ s/\/$//;
if (defined($file)) {
@ -124,8 +120,7 @@ sub check_ftp2_url($$$$) {
else {
$url = "$url/$path/.";
}
#print $fe "curl $url, file = $file\n";
print "curl $url, file = $file\n";
my %listfiles = ();
if (open(FFTP, "curl --anyauth -l $url|")) {
while (my $l = <FFTP>) {
@ -135,44 +130,44 @@ sub check_ftp2_url($$$$) {
close(FFTP);
}
if (%listfiles) {
if (!defined($file)) {
return (0, "OK");
if (! defined($file)) {
return(0, "OK");
}
elsif (defined($listfiles{$file})) {
return (0, "OK");
return(0, "OK");
}
elsif (defined($listfiles{"ftpinfo.txt"})) {
return (0, "Probably a directory");
return(0, "Probably a directory");
}
else {
return (1, "Not found");
return(1, "Not found");
}
}
else {
return (1, "Error");
return(1, "Error");
}
}
sub check_ftp_url($$$$) {
sub check_ftp_url($$$$)
{
use Net::FTP;
my ($protocol, $host, $path, $file) = @_;
my $res = 0;
my $message = "";
my $ftp = Net::FTP->new($host, Debug => 0, Timeout => 20);
if (!$ftp) {
return (3, "Cannot connect to $host");
my $ftp = Net::FTP->new($host, Debug => 0, Timeout => 120);
if(!$ftp) {
return(3,"Cannot connect to $host");
}
if (!$ftp->login("anonymous", '-anonymous@')) {
if (! $ftp->login("anonymous",'-anonymous@')) {
$message = $ftp->message;
$res = 3;
}
else {
my $rEntries;
if ($path ne "") {
#print $fe "Path = $path\n";
#print "Path = $path\n";
#if (!$ftp->cwd($path)) {
# $message = $ftp->message;
# $res = 3;
@ -182,43 +177,41 @@ sub check_ftp_url($$$$) {
else {
$rEntries = $ftp->dir();
}
if (!$rEntries) {
if (! $rEntries) {
$res = 3;
$message = "Could not read directory \"$path\"";
}
elsif (defined($file)) {
my $found = 0;
my $found2 = 0;
for my $f (@{$rEntries}) {
#print $fe "Entry: $path $f\n";
my ($res1, $isdir) = check_ftp_dir_entry($file, $f);
for my $f ( @{$rEntries}) {
#print "Entry: $path $f\n";
my ($res1,$isdir) = check_ftp_dir_entry($file,$f);
if ($res1 == 1) {
$found = 1;
last;
}
elsif ($res1 == 2) {
# found, but not accessible
$found2 = 1;
$message = "Permission denied for '$file'";
}
}
if (!$found) {
if (! $found) {
$res = 4;
if (!$found2) {
if (! $found2) {
$message = "File or directory '$file' not found";
}
}
}
}
$ftp->quit;
#print $fe "returning ($res,$message)\n";
return ($res, $message);
#print "returning ($res,$message)\n";
return($res, $message);
}
sub check_unknown_url($$$$) {
sub check_unknown_url($$$$)
{
use LWP::Simple;
my ($protocol, $host, $path, $file) = @_;
@ -233,32 +226,29 @@ sub check_unknown_url($$$$) {
$url .= "/$path";
}
}
if (defined($file)) {
#print $fe "Trying $url$file\n";
if(defined($file)) {
#print "Trying $url$file\n";
$res = head("$url/$file");
if (!$res) {
if(! $res) {
# try to check for directory '/';
#print $fe "Trying $url$file/\n";
#print "Trying $url$file/\n";
$res = head("$url/$file/");
}
}
else {
#print $fe "Trying $url\n";
#print "Trying $url\n";
$res = head($url);
}
return (!$res);
return(! $res);
}
#
# Main entry
sub check_url($$$$) {
my ($url, $use_curl, $fex, $fsx) = @_;
$fe = $fex;
$fs = $fsx;
sub check_url($$)
{
my($url,$use_curl) = @_;
my $file = undef;
my ($protocol, $host, $path);
my ($protocol,$host,$path);
my $res = 0;
@ -268,10 +258,9 @@ sub check_url($$$$) {
$host = $2;
$path = $3;
$path =~ s/^\///;
if ($path =~ s/\/([^\/]+)$//) {
if($path =~ s/\/([^\/]+)$//) {
$file = $1;
if ($file =~ / /) {
if($file =~ / /) {
# Filename contains ' ', maybe invalid. Don't check
$file = undef;
}
@ -279,7 +268,7 @@ sub check_url($$$$) {
}
}
else {
print $fe " Invalid url '$url'";
print " Invalid url '$url'";
return 2;
}
if ($protocol =~ /^https?$/) {
@ -297,7 +286,7 @@ sub check_url($$$$) {
}
else {
# it never should reach this point
print $fe " What protocol is '$protocol'?";
print " What protocol is '$protocol'?";
$res = check_unknown_url($protocol, $host, $path, $file);
return $res;
}

View File

@ -2,4 +2,3 @@ http://www.uon.edu/doe
ftp://www.test.test
http://www.test.test
#proto://host.xx.ab/abcd
http://example.com/%20foo

View File

@ -10,7 +10,6 @@ http://jasa.peerx-press.org/html/jasa/Using_LaTeX
http://spie.org/app/Publications/index.cfm?fuseaction=authinfo&type=proceedings
http://www.jstatsoft.org/downloads/JSSstyle.zip
http://www.photogrammetry.ethz.ch/tarasp_workshop/isprs.cls
https://journals.aps.org/revtex
# The following ftp url is correct, but
# ftp commands like 'dir', 'get' do not work.

View File

@ -38,8 +38,6 @@ BEGIN {
unshift(@INC, "$p");
}
use warnings;
use Cwd qw(abs_path);
use CheckURL;
use Try::Tiny;
use locale;
@ -48,17 +46,12 @@ use POSIX qw(locale_h);
setlocale(LC_CTYPE, "");
setlocale(LC_MESSAGES, "en_US.UTF-8");
use File::Temp qw/ tempfile tempdir /;
use File::Spec;
use Fcntl qw(:flock SEEK_END);
# Prototypes
sub printNotUsedURLS($\%);
sub replaceSpecialChar($);
sub readUrls($\%);
sub parse_file($ );
sub handle_url($$$ );
sub printx($$$$);
##########
my %URLS = ();
@ -72,9 +65,8 @@ my $summaryFile = undef;
my $checkSelectedOnly = 0;
for my $arg (@ARGV) {
die("Bad argument \"$arg\"") if ($arg !~ /=/);
my ($type, $val) = split("=", $arg);
my ($type,$val) = split("=", $arg);
if ($type eq "filesToScan") {
#The file should be a list of files to search in
if (open(FLIST, $val)) {
while (my $l = <FLIST>) {
@ -111,8 +103,6 @@ for my $arg (@ARGV) {
}
my @urls = sort keys %URLS, keys %extraURLS;
my @testvals = ();
# Tests
#my @urls = ("ftp://ftp.edpsciences.org/pub/aa/readme.html", "ftp://ftp.springer.de/pub/tex/latex/compsc/proc/author");
my $errorcount = 0;
@ -136,76 +126,14 @@ for my $u (@urls) {
if (defined($selectedURLS{$u})) {
${selectedURLS}{$u}->{count} += 1;
}
next if ($checkSelectedOnly && !defined($selectedURLS{$u}));
next if ($checkSelectedOnly && ! defined($selectedURLS{$u}));
$URLScount++;
push(@testvals, {u => $u, use_curl => $use_curl,});
}
# Ready to go multitasking
my ($vol, $dir, $file) = File::Spec->splitpath($summaryFile);
my $tempdir = tempdir("$dir/CounterXXXXXXX", CLEANUP => 1);
my $countfile = "$tempdir/counter";
my $counter = 0;
if (open(my $FO, '>', $countfile)) {
print {$FO} $counter;
close($FO);
}
else {
unlink($countfile);
die("Could not write to $countfile");
}
print "Using tempdir \"" . abs_path($tempdir) . "\"\n";
my @wait = ();
for (my $i = 0; $i < 10; $i++) { # Number of subprocesses
my $pid = fork();
if ($pid == 0) {
# I am child
open(my $fe, '>:encoding(UTF-8)', "$tempdir/xxxError$i");
open(my $fs, '>:encoding(UTF-8)', "$tempdir/xxxSum$i");
while (1) {
open(my $fh, '+<', $countfile) or die("cannot open $countfile");
flock($fh, LOCK_EX) or die "$i: Cannot lock $countfile - $!\n";
my $l = <$fh>; # get actual count number
my $diff = undef;
if (defined($testvals[$l + 150])) {
$diff = 5;
}
elsif (defined($testvals[$l + 50])) {
$diff = 3;
}
elsif (defined($testvals[$l + 20])) {
$diff = 2;
}
elsif (defined($testvals[$l])) {
$diff = 1;
}
else {
close($fs);
print $fe "NumberOfErrors $errorcount\n";
close($fe);
exit(0);
}
my $next = $l + $diff;
seek($fh, 0, 0);
truncate($fh, 0);
print $fh $next;
close($fh);
for (my $i = 0; $i < $diff; $i++) {
my $entryidx = $l + $i;
my $rentry = $testvals[$entryidx];
next if (!defined($rentry));
my $u = $rentry->{u};
my $use_curl = $rentry->{use_curl};
print $fe "Checking($entryidx) '$u': ";
print "Checking '$u': ";
my ($res, $prnt, $outSum);
try {
$res = check_url($u, $use_curl, $fe, $fs);
$res = check_url($u, $use_curl);
if ($res) {
print $fe "Failed\n";
print "Failed\n";
$prnt = "";
$outSum = 1;
}
@ -219,7 +147,7 @@ for (my $i = 0; $i < 10; $i++) { # Number of subprocesses
$outSum = 1;
$res = 700;
};
printx("$prnt", $outSum, $fe, $fs);
printx("$prnt", $outSum);
my $printSourceFiles = 0;
my $err_txt = "Error url:";
@ -229,50 +157,23 @@ for (my $i = 0; $i < 10; $i++) { # Number of subprocesses
if ($res && defined($revertedURLS{$u})) {
$err_txt = "Failed url:";
}
$res = !$res if (defined($revertedURLS{$u}));
$res = ! $res if (defined($revertedURLS{$u}));
if ($res || $checkSelectedOnly) {
printx("$err_txt \"$u\"\n", $outSum, $fe, $fs);
printx("$err_txt \"$u\"\n", $outSum);
}
if ($printSourceFiles) {
if (defined($URLS{$u})) {
for my $f (sort keys %{$URLS{$u}}) {
for my $f(sort keys %{$URLS{$u}}) {
my $lines = ":" . join(',', @{$URLS{$u}->{$f}});
printx(" $f$lines\n", $outSum, $fe, $fs);
printx(" $f$lines\n", $outSum);
}
}
if ($res) {
if ($res ) {
$errorcount++;
}
}
}
}
}
$wait[$i] = $pid;
}
for (my $i = 0; $i < 10; $i++) {
my $p = $wait[$i];
if ($p > 0) {
waitpid($p, 0);
open(my $fe, '<', "$tempdir/xxxError$i");
while (my $l = <$fe>) {
if ($l =~ /^NumberOfErrors\s(\d+)/) {
$errorcount += $1;
}
else {
print $l;
}
}
close($fe);
open(my $fs, '<', "$tempdir/xxxSum$i");
while (my $l = <$fs>) {
print SFO $l;
}
close($fs);
}
}
unlink($countfile);
if (%URLS) {
printNotUsedURLS("Ignored", %ignoredURLS);
printNotUsedURLS("Selected", %selectedURLS);
@ -286,18 +187,20 @@ if (defined($summaryFile)) {
exit($errorcount);
###############################################################################
sub printx($$$$) {
my ($txt, $outSum, $fe, $fs) = @_;
print $fe "$txt";
sub printx($$)
{
my ($txt, $outSum) = @_;
print "$txt";
if ($outSum && defined($summaryFile)) {
print $fs "$txt";
print SFO "$txt";
}
}
sub printNotUsedURLS($\%) {
sub printNotUsedURLS($\%)
{
my ($txt, $rURLS) = @_;
my @msg = ();
for my $u (sort keys %{$rURLS}) {
for my $u ( sort keys %{$rURLS}) {
if ($rURLS->{$u}->{count} < 2) {
my @submsg = ();
for my $f (sort keys %{$rURLS->{$u}}) {
@ -308,20 +211,22 @@ sub printNotUsedURLS($\%) {
}
}
if (@msg) {
print "\n$txt URLs not found in sources: " . join(' ', @msg) . "\n";
print "\n$txt URLs not found in sources: " . join(' ',@msg) . "\n";
}
}
sub replaceSpecialChar($) {
sub replaceSpecialChar($)
{
my ($l) = @_;
$l =~ s/\\SpecialChar(NoPassThru)?\s*(TeX|LaTeX|LyX)[\s]?/\2/;
return ($l);
return($l);
}
sub readUrls($\%) {
sub readUrls($\%)
{
my ($file, $rUrls) = @_;
die("Could not read file $file") if (!open(ULIST, $file));
die("Could not read file $file") if (! open(ULIST, $file));
my $line = 0;
while (my $l = <ULIST>) {
$line++;
@ -333,27 +238,27 @@ sub readUrls($\%) {
if ($l =~ s/^\s*UseCurl\s*//) {
$use_curl = 1;
}
if (!defined($rUrls->{$l})) {
if (! defined($rUrls->{$l} )) {
$rUrls->{$l} = {$file => $line, count => 1, use_curl => $use_curl};
}
}
close(ULIST);
}
sub parse_file($) {
my ($f) = @_;
sub parse_file($)
{
my($f) = @_;
my $status = "out"; # outside of URL/href
return if ($f =~ /\/attic\//);
if (open(FI, $f)) {
if(open(FI, $f)) {
my $line = 0;
while (my $l = <FI>) {
while(my $l = <FI>) {
$line++;
$l =~ s/[\r\n]+$//; # Simulate chomp
if ($status eq "out") {
# searching for "\begin_inset Flex URL"
if ($l =~ /^\s*\\begin_inset\s+Flex\s+URL\s*$/) {
if($l =~ /^\s*\\begin_inset\s+Flex\s+URL\s*$/) {
$status = "inUrlInset";
}
elsif ($l =~ /^\s*\\begin_inset\s+CommandInset\s+href\s*$/) {
@ -368,7 +273,7 @@ sub parse_file($) {
}
}
else {
if ($l =~ /^\s*\\end_(layout|inset)\s*$/) {
if($l =~ /^\s*\\end_(layout|inset)\s*$/) {
$status = "out";
}
elsif ($status eq "inUrlInset") {
@ -391,14 +296,15 @@ sub parse_file($) {
}
}
sub handle_url($$$) {
my ($url, $f, $line) = @_;
sub handle_url($$$)
{
my($url, $f, $line) = @_;
$url = &replaceSpecialChar($url);
if (!defined($URLS{$url})) {
if(!defined($URLS{$url})) {
$URLS{$url} = {};
}
if (!defined($URLS{$url}->{$f})) {
if(!defined($URLS{$url}->{$f})) {
$URLS{$url}->{$f} = [];
}
push(@{$URLS{$url}->{$f}}, $line);

View File

@ -2040,9 +2040,7 @@ docstring const i18npreamble(docstring const & templ, Language const * lang,
else if (ascii_fallback)
translated = to_ascii(testenc->latexString(name).first);
else
// We need to \protect this as it can end up in a moving argument
// (\lstlistlistingname in book classes goes to \@mkboth via \contentsname)
translated = "\\protect\\inputencoding{" + texenc + "}"
translated = "\\inputencoding{" + texenc + "}"
+ s1 + langenc + s2 + to_utf8(name)
+ s1 + bufenc + s2;
preamble = subst(preamble, sub.str(), translated);

View File

@ -346,7 +346,7 @@ bool FloatPlacement::checkWidgets(bool readonly) const
if (readonly) {
floatTypeCO->setEnabled(false);
placementCO->setEnabled(false);
alignmentGB->setEnabled(false);
aligmentGB->setEnabled(false);
spanCB->setEnabled(false);
sidewaysCB->setEnabled(false);
} else

View File

@ -65,7 +65,7 @@
</spacer>
</item>
<item row="1" column="3">
<widget class="QGroupBox" name="alignmentGB">
<widget class="QGroupBox" name="aligmentGB">
<property name="title">
<string>Alignment of Contents</string>
</property>
@ -88,16 +88,6 @@
<property name="spacing">
<number>6</number>
</property>
<item row="4" column="0">
<widget class="QRadioButton" name="alignRightRB">
<property name="toolTip">
<string>Right-align float contents</string>
</property>
<property name="text">
<string>&amp;Right</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="alignDocDefaultRB">
<property name="toolTip">
@ -108,26 +98,6 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="alignClassDefaultRB">
<property name="toolTip">
<string>Use the class' default alignment for floats, whatever it is.</string>
</property>
<property name="text">
<string>Class &amp;Default</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="alignCenterRB">
<property name="toolTip">
<string>Center float contents</string>
</property>
<property name="text">
<string>&amp;Center</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="alignLeftRB">
<property name="toolTip">
@ -138,18 +108,35 @@
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<item row="3" column="0">
<widget class="QRadioButton" name="alignCenterRB">
<property name="toolTip">
<string>Center float contents</string>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
<property name="text">
<string>&amp;Center</string>
</property>
</spacer>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="alignRightRB">
<property name="toolTip">
<string>Right-align float contents</string>
</property>
<property name="text">
<string>&amp;Right</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="alignClassDefaultRB">
<property name="toolTip">
<string>Use the class' default alignment for floats, whatever it is.</string>
</property>
<property name="text">
<string>Class &amp;Default</string>
</property>
</widget>
</item>
</layout>
</widget>