Commit c06653c3ab1ec3241b66e708750813a380378fad

Authored by m-holger
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 }
... ...