1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
#! /bin/sh
#!perl -w # --*- Perl -*--
eval 'exec perl -x $0 ${1+"$@"}'
if 0;
#------------------------------------------------------------------------------
#$Author: antanas $
#$Revision: 8845 $
#$URL: svn+ssh://www.crystallography.net/home/coder/svn-repositories/cod-tools/tags/v3.11.0/scripts/cif_parse $
#$Date: 2021-08-01 23:10:01 +0300 (Sun, 01 Aug 2021) $
#------------------------------------------------------------------------------
#*
#* Parse CIF file and print out the structure generated by CIF parser.
#*
#* USAGE:
#* $0 --options input1.cif input*.cif
#**
use strict;
use warnings;
use COD::CIF::JSON qw( cif2json json2cif );
use COD::CIF::Parser qw( parse_cif );
use COD::SOptions qw( getOptions );
use COD::SUsage qw( usage options );
use COD::ErrorHandler qw( process_errors
process_parser_messages
report_message );
use COD::ToolsVersion qw( get_version_string );
use Data::Dumper;
my $die_on_error_level = {
ERROR => 0,
WARNING => 0,
NOTE => 0
};
my $output_format = 'dump';
my $input_json = 0;
my %options = ( no_print => 1 );
#* OPTIONS:
#* --input-cif,
#* --input-json
#* Specify the format of input file(s). Default CIF.
#*
#* --output-dump
#* Output parsed CIF file in internal dump format (default).
#*
#* --output-json
#* Output generated structure in JSON.
#*
#* --json
#* Set both input and output formats to JSON.
#*
#* --use-perl-parser
#* Use Perl parser for CIF parsing.
#*
#* --use-c-parser
#* Use Perl & C parser for CIF parsing.
#*
#* --help, --usage
#* Output a short usage message (this message) and exit.
#* --version
#* Output version information and exit.
#**
@ARGV = getOptions(
"--do-not-unprefix-text" => sub{ $options{do_not_unprefix_text} = 1 },
"--do-not-unfold-text" => sub{ $options{do_not_unfold_text} = 1 },
"--fix-errors" => sub{ $options{fix_errors} = 1 },
"--fix-duplicate-tags-with-same-values" =>
sub{ $options{fix_duplicate_tags_with_same_values} = 1 },
"--fix-duplicate-tags-with-empty-values" =>
sub{ $options{fix_duplicate_tags_with_empty_values} = 1 },
"--fix-data-header" => sub{ $options{fix_data_header} = 1 },
"--fix-datablock-names" => sub{ $options{fix_datablock_names} = 1 },
"--fix-string-quotes" => sub{ $options{fix_string_quotes} = 1 },
"--fix-missing-closing-double-quote" =>
sub{ $options{fix_missing_closing_double_quote} = 1 },
"--fix-missing-closing-single-quote" =>
sub{ $options{fix_missing_closing_single_quote} = 1 },
"--fix-ctrl-z" => sub{ $options{fix_ctrl_z} = 1 },
"--allow-uqstring-brackets" => sub{ $options{allow_uqstring_brackets} = 1 },
# Bison parser is default:
"--input-cif" => sub { $options{parser} = 'c' },
"--input-json" => sub { $options{parser} = 'json' },
"--output-dump" => sub { $output_format = 'dump' },
"--output-json" => sub { $output_format = 'json' },
"--json" => sub { $options{parser} = 'json'; $output_format = 'json' },
"--use-perl-parser" => sub { $options{parser} = 'perl' },
"--use-c-parser" => sub { $options{parser} = 'c' },
'--options' => sub { options; exit },
'--help,--usage' => sub { usage; exit },
'--version' => sub { print get_version_string(), "\n"; exit }
);
@ARGV = ( "-" ) unless @ARGV;
binmode STDOUT, ':encoding(UTF-8)';
binmode STDERR, ':encoding(UTF-8)';
foreach( @ARGV ) {
my( $data, $err_count, $messages );
if( $input_json ) {
eval {
open my $inp, '<' . $_ or die 'ERROR, '
. 'could not open bibliography file for reading -- '
. lcfirst($!) . "\n";
$data = json2cif( join( "\n", <$inp> ) );
close $inp or die 'ERROR, '
. 'error while closing file after reading -- '
. lcfirst($!) . "\n";
$err_count = 0;
};
if ($@) {
process_errors( {
'program' => $0,
'filename' => $_,
'message' => $@
}, 1 );
}
} else {
$options{no_print} = 1;
($data, $err_count, $messages) = parse_cif( $_, \%options );
process_parser_messages( $messages, $die_on_error_level );
}
foreach my $datablock ( @$data ) {
if( $output_format eq 'json' ) {
print cif2json( $datablock );
} else {
local $Data::Dumper::Indent = 1;
local $Data::Dumper::Sortkeys = 1;
local $Data::Dumper::Varname = 'datablock';
print Dumper( $datablock );
}
}
report_message( {
'program' => $0,
'filename' => $_,
'err_level' => 'NOTE',
'message' => "$err_count error(s) encountered while processing the file"
}, $die_on_error_level->{'NOTE'} );
}
|