Commit c06653c3ab1ec3241b66e708750813a380378fad
1 parent
b9bc0535
Refactor QPDF::writeJSON
Showing
1 changed file
with
52 additions
and
101 deletions
libqpdf/QPDF_json.cc
| ... | ... | @@ -849,48 +849,6 @@ writeJSONStreamFile( |
| 849 | 849 | } |
| 850 | 850 | |
| 851 | 851 | void |
| 852 | -writeJSONStream( | |
| 853 | - int version, | |
| 854 | - Pipeline* p, | |
| 855 | - bool& first, | |
| 856 | - std::string const& key, | |
| 857 | - QPDF_Stream& stream, | |
| 858 | - int id, | |
| 859 | - qpdf_stream_decode_level_e decode_level, | |
| 860 | - qpdf_json_stream_data_e json_stream_data, | |
| 861 | - std::string const& file_prefix) | |
| 862 | -{ | |
| 863 | - if (first) { | |
| 864 | - *p << "\n \"" << key << "\": {\n \"stream\": "; | |
| 865 | - first = false; | |
| 866 | - } else { | |
| 867 | - *p << ",\n \"" << key << "\": {\n \"stream\": "; | |
| 868 | - } | |
| 869 | - JSON::Writer jw{p, 4}; | |
| 870 | - if (json_stream_data == qpdf_sj_file) { | |
| 871 | - writeJSONStreamFile(version, jw, stream, id, decode_level, file_prefix); | |
| 872 | - } else { | |
| 873 | - stream.writeStreamJSON(version, jw, json_stream_data, decode_level, nullptr, ""); | |
| 874 | - } | |
| 875 | - *p << "\n }"; | |
| 876 | -} | |
| 877 | - | |
| 878 | -void | |
| 879 | -writeJSONObject( | |
| 880 | - int version, Pipeline* p, bool& first, std::string const& key, QPDFObjectHandle& obj) | |
| 881 | -{ | |
| 882 | - if (first) { | |
| 883 | - *p << "\n \"" << key << "\": {\n \"value\": "; | |
| 884 | - first = false; | |
| 885 | - } else { | |
| 886 | - *p << ",\n \"" << key << "\": {\n \"value\": "; | |
| 887 | - } | |
| 888 | - auto w = JSON::Writer(p, 4); | |
| 889 | - obj.writeJSON(version, w, true); | |
| 890 | - *p << "\n }"; | |
| 891 | -} | |
| 892 | - | |
| 893 | -void | |
| 894 | 852 | QPDF::writeJSON( |
| 895 | 853 | int version, |
| 896 | 854 | Pipeline* p, |
| ... | ... | @@ -914,82 +872,75 @@ QPDF::writeJSON( |
| 914 | 872 | std::string const& file_prefix, |
| 915 | 873 | std::set<std::string> wanted_objects) |
| 916 | 874 | { |
| 917 | - int const depth_outer = 1; | |
| 918 | - int const depth_top = 1; | |
| 919 | - int const depth_qpdf = 2; | |
| 920 | - int const depth_qpdf_inner = 3; | |
| 921 | - | |
| 922 | 875 | if (version != 2) { |
| 923 | 876 | throw std::runtime_error("QPDF::writeJSON: only version 2 is supported"); |
| 924 | 877 | } |
| 925 | - bool first = true; | |
| 878 | + JSON::Writer jw{p, 4}; | |
| 926 | 879 | if (complete) { |
| 927 | - JSON::writeDictionaryOpen(p, first, depth_outer); | |
| 928 | - } else { | |
| 929 | - first = first_key; | |
| 930 | - } | |
| 931 | - JSON::writeDictionaryKey(p, first, "qpdf", depth_top); | |
| 932 | - bool first_qpdf = true; | |
| 933 | - JSON::writeArrayOpen(p, first_qpdf, depth_top); | |
| 934 | - JSON::writeNext(p, first_qpdf, depth_qpdf); | |
| 935 | - bool first_qpdf_inner = true; | |
| 936 | - JSON::writeDictionaryOpen(p, first_qpdf_inner, depth_qpdf); | |
| 937 | - JSON::writeDictionaryItem( | |
| 938 | - p, first_qpdf_inner, "jsonversion", JSON::makeInt(version), depth_qpdf_inner); | |
| 939 | - JSON::writeDictionaryItem( | |
| 940 | - p, first_qpdf_inner, "pdfversion", JSON::makeString(getPDFVersion()), depth_qpdf_inner); | |
| 941 | - JSON::writeDictionaryItem( | |
| 942 | - p, | |
| 943 | - first_qpdf_inner, | |
| 944 | - "pushedinheritedpageresources", | |
| 945 | - JSON::makeBool(everPushedInheritedAttributesToPages()), | |
| 946 | - depth_qpdf_inner); | |
| 947 | - JSON::writeDictionaryItem( | |
| 948 | - p, | |
| 949 | - first_qpdf_inner, | |
| 950 | - "calledgetallpages", | |
| 951 | - JSON::makeBool(everCalledGetAllPages()), | |
| 952 | - depth_qpdf_inner); | |
| 953 | - JSON::writeDictionaryItem( | |
| 954 | - p, | |
| 955 | - first_qpdf_inner, | |
| 956 | - "maxobjectid", | |
| 957 | - JSON::makeInt(QIntC::to_longlong(getObjectCount())), | |
| 958 | - depth_qpdf_inner); | |
| 959 | - JSON::writeDictionaryClose(p, first_qpdf_inner, depth_qpdf); | |
| 960 | - JSON::writeNext(p, first_qpdf, depth_qpdf); | |
| 961 | - JSON::writeDictionaryOpen(p, first_qpdf_inner, depth_qpdf); | |
| 880 | + jw << "{"; | |
| 881 | + } else if (!first_key) { | |
| 882 | + jw << ","; | |
| 883 | + } | |
| 884 | + first_key = false; | |
| 885 | + | |
| 886 | + /* clang-format off */ | |
| 887 | + jw << "\n" | |
| 888 | + " \"qpdf\": [\n" | |
| 889 | + " {\n" | |
| 890 | + " \"jsonversion\": " << std::to_string(version) << ",\n" | |
| 891 | + " \"pdfversion\": \"" << getPDFVersion() << "\",\n" | |
| 892 | + " \"pushedinheritedpageresources\": " << (everPushedInheritedAttributesToPages() ? "true" : "false") << ",\n" | |
| 893 | + " \"calledgetallpages\": " << (everCalledGetAllPages() ? "true" : "false") << ",\n" | |
| 894 | + " \"maxobjectid\": " << std::to_string(getObjectCount()) << "\n" | |
| 895 | + " },\n" | |
| 896 | + " {"; | |
| 897 | + /* clang-format on */ | |
| 898 | + | |
| 962 | 899 | bool all_objects = wanted_objects.empty(); |
| 900 | + bool first = true; | |
| 963 | 901 | for (auto& obj: getAllObjects()) { |
| 964 | 902 | auto const og = obj.getObjGen(); |
| 965 | 903 | std::string key = "obj:" + og.unparse(' ') + " R"; |
| 966 | 904 | if (all_objects || wanted_objects.count(key)) { |
| 905 | + if (first) { | |
| 906 | + jw << "\n \"" << key; | |
| 907 | + first = false; | |
| 908 | + } else { | |
| 909 | + jw << "\n },\n \"" << key; | |
| 910 | + } | |
| 967 | 911 | if (auto* stream = obj.getObjectPtr()->as<QPDF_Stream>()) { |
| 968 | - writeJSONStream( | |
| 969 | - version, | |
| 970 | - p, | |
| 971 | - first_qpdf_inner, | |
| 972 | - key, | |
| 973 | - *stream, | |
| 974 | - og.getObj(), | |
| 975 | - decode_level, | |
| 976 | - json_stream_data, | |
| 977 | - file_prefix); | |
| 912 | + jw << "\": {\n \"stream\": "; | |
| 913 | + if (json_stream_data == qpdf_sj_file) { | |
| 914 | + writeJSONStreamFile( | |
| 915 | + version, jw, *stream, og.getObj(), decode_level, file_prefix); | |
| 916 | + } else { | |
| 917 | + stream->writeStreamJSON( | |
| 918 | + version, jw, json_stream_data, decode_level, nullptr, ""); | |
| 919 | + } | |
| 978 | 920 | } else { |
| 979 | - writeJSONObject(version, p, first_qpdf_inner, key, obj); | |
| 921 | + jw << "\": {\n \"value\": "; | |
| 922 | + obj.writeJSON(version, jw, true); | |
| 980 | 923 | } |
| 981 | 924 | } |
| 982 | 925 | } |
| 983 | 926 | if (all_objects || wanted_objects.count("trailer")) { |
| 984 | - auto trailer = getTrailer(); | |
| 985 | - writeJSONObject(version, p, first_qpdf_inner, "trailer", trailer); | |
| 927 | + if (!first) { | |
| 928 | + jw << "\n },"; | |
| 929 | + } | |
| 930 | + jw << "\n \"trailer\": {\n \"value\": "; | |
| 931 | + getTrailer().writeJSON(version, jw, true); | |
| 932 | + first = false; | |
| 986 | 933 | } |
| 987 | - JSON::writeDictionaryClose(p, first_qpdf_inner, depth_qpdf); | |
| 988 | - JSON::writeArrayClose(p, first_qpdf, depth_top); | |
| 934 | + if (!first) { | |
| 935 | + jw << "\n }"; | |
| 936 | + } | |
| 937 | + /* clang-format off */ | |
| 938 | + jw << "\n" | |
| 939 | + " }\n" | |
| 940 | + " ]"; | |
| 941 | + /* clang-format on */ | |
| 989 | 942 | if (complete) { |
| 990 | - JSON::writeDictionaryClose(p, first, 0); | |
| 991 | - *p << "\n"; | |
| 943 | + jw << "\n}\n"; | |
| 992 | 944 | p->finish(); |
| 993 | 945 | } |
| 994 | - first_key = false; | |
| 995 | 946 | } | ... | ... |