blob: d47bb1685790022252a0b34114a7c4b4e7f03cef [file] [log] [blame]
#! /usr/bin/env perl
# generate_css_data.pl: generate perl hashes and C structures containing
# CSS data for HTML conversion.
#
# Copyright 2024-2026 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License,
# or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# ../maintain/generate_css_data.pl ../data/default_css_element_class_styles.csv perl Texinfo/HTMLDataCSS.pm
use strict;
use warnings;
# in Perl core standard modules
use File::Basename;
use Text::Wrap;
my $program_name = basename($0);
my $base_default_css_element_class_styles_file = $ARGV[0];
open (BDCSS, "<$base_default_css_element_class_styles_file")
or die "open $base_default_css_element_class_styles_file failed: $!";
my @header;
while (1) {
my $header_line = <BDCSS>;
chomp($header_line);
#print STDERR "$header_line\n";
@header = split(/\|/, $header_line);
if (scalar(@header) > 1) {
last;
}
}
my ($selector_index, $style_index, $notes_index);
my $header_index = 0;
foreach my $header (@header) {
if ($header eq 'selector') {
$selector_index = $header_index;
} elsif ($header eq 'style') {
$style_index = $header_index;
} elsif ($header eq 'notes') {
$notes_index = $header_index;
}
$header_index++;
}
if (!defined($selector_index) or !defined($style_index)
or !defined($notes_index)) {
die "missing header column ($selector_index, $style_index, $notes_index)\n";
}
my $lang = $ARGV[1];
my $perl_format = 0;
my $C_format = 0;
if ($lang eq 'perl') {
$perl_format = 1;
} else {
$C_format = 1;
}
my $out_file = $ARGV[2];
die "Need an output file\n" if (!defined($out_file));
open(OUT, ">$out_file") or die "Open $out_file: $!\n";
my $initial_notes_tab;
my $subsequent_notes_tab;
my $base_default_css_element_class_styles_base_name
= basename($base_default_css_element_class_styles_file);
if ($perl_format) {
$initial_notes_tab = ' # ';
$subsequent_notes_tab = ' # ';
print OUT "# Automatically generated by $program_name\n\n";
print OUT "package Texinfo::HTMLDataCSS;\n\n";
print OUT "use Texinfo::Common;\n\n";
print OUT "# Generated from $base_default_css_element_class_styles_base_name\n";
print OUT "my %base_default_css_element_class_styles = (\n";
} else {
# C format
my $header_file = $ARGV[3];
die "Need an output header\n" if (!defined($header_file));
open(HDR, ">$header_file") or die "Open $header_file: $!\n";
$initial_notes_tab = '';
$subsequent_notes_tab = ' ';
print OUT "/* Automatically generated by $program_name */\n\n";
print OUT "#include <config.h>\n\n";
print OUT "#include \"converter_types.h\"\n\n";
print OUT "/* Generated from $base_default_css_element_class_styles_base_name */\n";
print OUT "const CSS_SELECTOR_STYLE base_default_css_element_class_styles[] = {\n";
}
my $css_element_class_style_nr = 0;
while (<BDCSS>) {
chomp;
my @data = split (/\|/);
my $notes = $data[$notes_index];
if (defined($notes) and $notes ne '') {
my $lines;
if ($perl_format) {
$lines = wrap($initial_notes_tab, $subsequent_notes_tab, ($notes));
print OUT $lines."\n";
} else {
$lines = wrap($initial_notes_tab, $subsequent_notes_tab, ($notes . ' */'));
print OUT "/* $lines\n";
}
}
my $selector = $data[$selector_index];
if (!defined($selector) or $selector eq '') {
die "$base_default_css_element_class_styles_file: Bad selector\n";
}
my $style = $data[$style_index];
if (!defined($style) or $style eq '') {
die "$base_default_css_element_class_styles_file: Bad style\n";
}
$css_element_class_style_nr++;
if ($perl_format) {
print OUT " '$selector' => '$style',\n";
} else {
print OUT " {\"$selector\", \"$style\"},\n";
}
}
my $C_header_string = 'HTML_CSS_DATA_H';
if ($perl_format) {
print OUT ");\n\n";
print OUT 'sub get_base_default_css_info() {'."\n"
.' return \%base_default_css_element_class_styles;'."\n"
."}\n\n";
} else {
print OUT " {0, 0}\n";
print OUT "};\n\n";
print HDR "/* Automatically generated from $program_name */\n\n";
print HDR "#ifndef $C_header_string\n"
."#define $C_header_string\n\n";
print HDR "#define BASE_DEFAULT_CSS_ELEMENT_CLASS_STYLE_NR "
."$css_element_class_style_nr\n\n";
print HDR "#endif\n";
}
close(OUT);