1#! /usr/bin/env perl
2
3# gpinyin - European-like Chinese writing 'pinyin' into 'groff'
4
5# Source file position: <groff-source>/contrib/gpinyin/gpinyin.pl
6# Installed position: <prefix>/bin/gpinyin
7
8# Copyright (C) 2014-2018 Free Software Foundation, Inc.
9
10# Written by Bernd Warken <groff-bernd.warken-72@web.de>.
11
12my $version = '1.0.4';
13
14# This file is part of 'gpinyin', which is part of 'groff'.
15
16# 'groff' is free software; you can redistribute it and/or modify it
17# under the terms of the GNU General Public License as published by
18# the Free Software Foundation, either version 2 of the License, or
19# (at your option) any later version.
20
21# 'groff' is distributed in the hope that it will be useful, but
22# WITHOUT ANY WARRANTY; without even the implied warranty of
23# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24# General Public License for more details.
25
26# You can find a copy of the GNU General Public License in the internet
27# at <http://www.gnu.org/licenses/gpl-2.0.html>.
28
29########################################################################
30
31use strict;
32use warnings;
33#use diagnostics;
34
35# temporary dir and files
36use File::Temp qw/ tempfile tempdir /;
37
38# needed for temporary dir
39use File::Spec;
40
41# for 'copy' and 'move'
42use File::Copy;
43
44# for fileparse, dirname and basename
45use File::Basename;
46
47# current working directory
48use Cwd;
49
50# $Bin is the directory where this script is located
51use FindBin;
52
53
54########################################################################
55# system variables and exported variables
56########################################################################
57
58$\ = "\n";	# final part for print command
59
60########################################################################
61# read-only variables with double-@ construct
62########################################################################
63
64our $File_split_env_sh;
65our $File_version_sh;
66our $Groff_Version;
67
68my $before_make;		# script before run of 'make'
69{
70  my $at = '@';
71  $before_make = 1 if '@VERSION@' eq "${at}VERSION${at}";
72}
73
74my %at_at;
75my $file_gpinyin_test_pl;
76my $gpinyin_libdir;
77
78if ($before_make) {
79  my $gpinyin_source_dir = $FindBin::Bin;
80  $at_at{'BINDIR'} = $gpinyin_source_dir;
81  $at_at{'G'} = '';
82  $gpinyin_libdir = '@gpinyin_dir@';
83} else {
84  $at_at{'BINDIR'} = '@BINDIR@';
85  $at_at{'G'} = '@g@';
86  $gpinyin_libdir = '@gpinyin_dir@';
87  unshift(@INC, $gpinyin_libdir);
88}
89
90require 'subs.pl';
91
92
93########################################################################
94# options
95########################################################################
96
97foreach (@ARGV) {
98  if ( /^(-h|--h|--he|--hel|--help)$/ ) {
99    print q(Usage for the 'gpinyin' program:);
100    print 'gpinyin [-] [--] [filespec...] normal file name arguments';
101    print 'gpinyin [-h|--help]            gives usage information';
102    print 'gpinyin [-v|--version]         displays the version number';
103    print q(This program is a 'groff' preprocessor that handles ) .
104      q(pinyin parts in 'roff' files.);
105    exit;
106  } elsif (/^(-v|--v|--ve|--ver|--vers|--versi|--versio|--version)$/) {
107    print q('gpinyin' version ) . $version;
108    exit;
109  }
110}
111
112
113########################################################################
114# input
115########################################################################
116
117my $pinyin_mode = 0;	# not in Pinyin mode
118
119my @output_n =	# nroff
120  (
121   '.ie n \\{\\',
122  );
123
124my @output_t =	# troff
125  (
126   '.el \\{\\',
127  );
128
129foreach (<>) {	# get line from input
130  chomp;
131  s/\s+$//;		# remove final spaces
132# &err('gpinyin: ' . $_);
133
134  my $line = $_;	# with starting blanks
135
136  # .pinyin start or begin line
137  if ( $line =~ /^[.']\s*pinyin\s+(start|begin)$/ ) {
138    if ( $pinyin_mode ) {
139      # '.pinyin' was started twice, ignore
140      &err( q['.pinyin' starter was run several times] );
141    } else {	# new pinyin start
142      $pinyin_mode = 1;
143    }
144    next;
145  }
146
147  # .pinyin stop or end line
148  if ( $line =~ /^[.']\s*pinyin\s+(stop|end)$/ ) {
149    if ( $pinyin_mode ) {		# normal stop
150      $pinyin_mode = 0;
151      &finish_pinyin_mode( \@output_n, \@output_t );
152    } else {	# ignore
153      &err( 'gpinyin: there was a .pinyin stop without ' .
154	'being in pinyin mode' );
155    }
156    next;
157  }
158
159  # now not a .pinyin line
160
161
162  if ( $pinyin_mode ) {	# within Pinyin
163    my $starting_blanks = '';
164    $starting_blanks = $1 if ( s/^(s+)// );	# handle starting spaces
165
166    my %outline = &handle_line($starting_blanks, $line);
167#&err('gpinyin outline n: ' . $outline{'n'} );
168#&err('gpinyin outline t: ' . $outline{'t'} );
169    push @output_n, $outline{'n'};
170    push @output_t, $outline{'t'};
171  } else {	# normal roff line, not within Pinyin
172    print $line;
173  }
174  next;
175}	# end of input line
176
177
178########################################################################
179# end of file without stopping 'pinyin' mode
180if ( $pinyin_mode ) {
181  &finish_pinyin_mode( \@output_n, \@output_t );
182}
183
184########################################################################
185
186
1871;
188########################################################################
189### Emacs settings
190# Local Variables:
191# mode: CPerl
192# End:
193