App-Greple-xlate
view release on metacpan or search on metacpan
write_file($md, "# title\n");
write_file($pm, "package F;\n1;\n");
like(run_cli(qw(-n -t JA), $md)->{out}, qr/\^\[-\+#\]/, 'markdown area pattern');
my $pmout = run_cli(qw(-n -t JA), $pm)->{out};
like($pmout, qr/-Mperl/, 'perl module loaded for .pm');
like($pmout, qr/--pod/, 'pod option for .pm');
};
sub find_gmake {
for my $make (qw(gmake make)) {
my $v = qx($make --version 2>/dev/null) // '';
return $make if $v =~ /GNU/;
}
return;
}
subtest 'XLATE.mk expansion' => sub {
my $gmake = find_gmake() or plan skip_all => 'GNU make not found';
my $mk = abs_path('share/XLATE.mk');
my $sub = "$dir/mk"; mkdir $sub;
write_file("$sub/doc.txt", "hello\n");
my $run = sub {
my(@vars) = @_;
qx(cd '$sub' && '$gmake' -n -f '$mk' XLATE_LANG=JA @vars 2>&1);
};
my $out = $run->();
like($out, qr/-e gpt5/, 'default engine is gpt5');
$out = $run->('XLATE_ANONYMIZE=dict.json', 'XLATE_CONTEXT_WINDOW=3',
'XLATE_FRONTMATTER=1', 'XLATE_TEMPLATE=1',
'XLATE_MARK=1', 'XLATE_SEED=prev.json');
like($out, qr/--anonymize='dict\.json'/, 'XLATE_ANONYMIZE');
like($out, qr/--context='3'/, 'XLATE_CONTEXT_WINDOW');
like($out, qr/--frontmatter/, 'XLATE_FRONTMATTER');
like($out, qr/--template(?:\s|$)/m, 'XLATE_TEMPLATE=1 -> bare --template');
like($out, qr/--mark(?:\s|$)/m, 'XLATE_MARK=1 -> bare --mark');
like($out, qr/--seed='prev\.json'/, 'XLATE_SEED');
$out = $run->('XLATE_TEMPLATE=X%.*?%X');
like($out, qr/--template='X%\.\*\?%X'/, 'XLATE_TEMPLATE=regex');
# xlate -M ã¯å¤ãäºéå¼ç¨ç¬¦ã§å
ãã§æ¸¡ã (XLATE_MARK="1") ãã
# GNU Make ã¯ã³ãã³ãã©ã¤ã³å¤æ°ä»£å
¥ã®å¼ç¨ç¬¦ãå¥ãããªãã®ã§ã
# REMOVE_QUOTE ã§å¥ãããã¦å¾å¾©ãããã¨ã確èªãã
$out = $run->(q{XLATE_MARK='"1"'}, q{XLATE_TEMPLATE='"1"'},
q{XLATE_ANONYMIZE='"dict.json"'});
like($out, qr/--mark(?:\s|$)/m, 'quoted XLATE_MARK="1" -> bare --mark');
like($out, qr/--template(?:\s|$)/m, 'quoted XLATE_TEMPLATE="1" -> bare --template');
like($out, qr/--anonymize='dict\.json'/, 'quoted XLATE_ANONYMIZE unquoted');
unlike($out, qr/--anonymize='?"/, 'no literal double quotes leak into option');
# FILE.ANONYMIZE 㯠XLATE_ANONYMIZE ããåªå
write_file("$sub/doc.txt.ANONYMIZE", qq([{"category":"person","text":"X"}]\n));
$out = $run->('XLATE_ANONYMIZE=global.json');
like($out, qr/--anonymize='doc\.txt\.ANONYMIZE'/, 'FILE.ANONYMIZE wins');
unlike($out, qr/--anonymize=global\.json/, 'variable overridden');
};
subtest 'XOPT quotes values so custom regexes survive the shell' => sub {
my $gmake = find_gmake() or plan skip_all => 'GNU make not found';
my $mk = abs_path('share/XLATE.mk');
my $sub2 = "$dir/mk3"; mkdir $sub2;
mkdir "$sub2/bin" or die $!;
write_file("$sub2/bin/xlate", "#!/bin/sh\nprintf '%s\\n' \"\$@\"\n");
chmod 0755, "$sub2/bin/xlate";
write_file("$sub2/doc.txt", "hello\n");
# A realistic custom mark regex: unquoted parentheses in XLATE_MARK
# are a hard /bin/sh syntax error at recipe execution time (make -n
# never shows it, since -n never invokes the shell).
my $mark_re = '@@(?<category>[a-z]+):(?<text>[^@]+)@@';
my $target = 'doc.gpt5-JA.xtxt';
my $cmd = "cd '$sub2' && PATH='$sub2/bin:'\"\$PATH\" '$gmake' -f '$mk' " .
"XLATE_LANG=JA 'XLATE_MARK=$mark_re' '$target' 2>&1";
my $out = qx($cmd);
my $status = $? >> 8;
is($status, 0, 'make exits 0 (no shell syntax error from unquoted regex)')
or diag($out);
my $content = -f "$sub2/$target"
? do { open my $fh, '<', "$sub2/$target" or die; local $/; <$fh> }
: '';
like($content, qr/^--mark=\Q$mark_re\E$/m,
'mark regex reaches xlate intact; quotes are stripped only by the shell');
};
subtest 'xlate -M passes new variables' => sub {
my $gmake = find_gmake() or plan skip_all => 'GNU make not found';
# ã¤ã³ã¹ãã¼ã«æ¸ã¿ã®å¤ã share/XLATE.mk ã解決ããããã®ã§ã
# make åºåã§ã¯ãªã --trace (set -x) ã® exec è¡ã§è»¢éãæ¤è¨¼ãã
my $sub = "$dir/mk2"; mkdir $sub;
write_file("$sub/doc.txt", "hello\n");
my $cwd = Cwd::getcwd();
chdir $sub or die;
my $r = run_cli(qw(-M -n --trace -t JA --anonymize=dict.json --context=3 --frontmatter));
chdir $cwd or die;
is($r->{status}, 0, 'exit 0') or diag($r->{err});
like($r->{err}, qr/XLATE_ANONYMIZE=.?dict\.json/, 'XLATE_ANONYMIZE passed');
like($r->{err}, qr/XLATE_CONTEXT_WINDOW=.?3/, 'XLATE_CONTEXT_WINDOW passed');
like($r->{err}, qr/XLATE_FRONTMATTER=1/, 'XLATE_FRONTMATTER passed');
};
done_testing;
( run in 1.887 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )