blacklight-marc 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +19 -0
  4. data/Gemfile +15 -0
  5. data/LICENSE +15 -0
  6. data/README.md +40 -0
  7. data/Rakefile +68 -0
  8. data/app/helpers/blacklight_marc_helper.rb +24 -0
  9. data/app/views/bookmarks/_endnote.html.erb +3 -0
  10. data/app/views/bookmarks/_refworks.html.erb +3 -0
  11. data/app/views/catalog/_marc_view.html.erb +32 -0
  12. data/app/views/catalog/endnote.endnote.erb +1 -0
  13. data/app/views/catalog/librarian_view.html.erb +10 -0
  14. data/blacklight-marc.gemspec +31 -0
  15. data/config/jetty.yml +4 -0
  16. data/config/locales/blacklight.en.yml +13 -0
  17. data/config/locales/blacklight.fr.yml +13 -0
  18. data/config/routes.rb +17 -0
  19. data/lib/SolrMarc.jar +0 -0
  20. data/lib/blacklight/marc.rb +18 -0
  21. data/lib/blacklight/marc/catalog.rb +20 -0
  22. data/lib/blacklight/marc/engine.rb +8 -0
  23. data/lib/blacklight/marc/railtie.rb +17 -0
  24. data/lib/blacklight/marc/routes.rb +43 -0
  25. data/lib/blacklight/marc/version.rb +5 -0
  26. data/lib/blacklight/solr/document/marc.rb +72 -0
  27. data/lib/blacklight/solr/document/marc_export.rb +587 -0
  28. data/lib/generators/blacklight_marc/marc_generator.rb +57 -0
  29. data/lib/generators/blacklight_marc/templates/config/SolrMarc/config-test.properties +37 -0
  30. data/lib/generators/blacklight_marc/templates/config/SolrMarc/config.properties +37 -0
  31. data/lib/generators/blacklight_marc/templates/config/SolrMarc/index.properties +97 -0
  32. data/lib/generators/blacklight_marc/templates/config/SolrMarc/index_scripts/dewey.bsh +47 -0
  33. data/lib/generators/blacklight_marc/templates/config/SolrMarc/index_scripts/format.bsh +126 -0
  34. data/lib/generators/blacklight_marc/templates/config/SolrMarc/translation_maps/README_MAPS +1 -0
  35. data/lib/generators/blacklight_marc/templates/config/SolrMarc/translation_maps/callnumber_map.properties +407 -0
  36. data/lib/generators/blacklight_marc/templates/config/SolrMarc/translation_maps/composition_era_map.properties +56 -0
  37. data/lib/generators/blacklight_marc/templates/config/SolrMarc/translation_maps/country_map.properties +379 -0
  38. data/lib/generators/blacklight_marc/templates/config/SolrMarc/translation_maps/format_map.properties +50 -0
  39. data/lib/generators/blacklight_marc/templates/config/SolrMarc/translation_maps/instrument_map.properties +101 -0
  40. data/lib/generators/blacklight_marc/templates/config/SolrMarc/translation_maps/language_map.properties +490 -0
  41. data/lib/railties/solr_marc.rake +158 -0
  42. data/spec/controllers/catalog_controller_spec.rb +23 -0
  43. data/spec/features/librarian_view_spec.rb +13 -0
  44. data/spec/helpers/blacklight_marc_helper_spec.rb +26 -0
  45. data/spec/integration/solr_document_spec.rb +59 -0
  46. data/spec/lib/blacklight_solr_document_marc_spec.rb +89 -0
  47. data/spec/lib/marc_export_spec.rb +743 -0
  48. data/spec/lib/tasks/solr_marc_task_spec.rb +60 -0
  49. data/spec/routing/routes_spec.rb +16 -0
  50. data/spec/spec_helper.rb +27 -0
  51. data/spec/test_app_templates/Gemfile.extra +21 -0
  52. data/spec/test_app_templates/lib/generators/test_app_generator.rb +35 -0
  53. data/spec/test_app_templates/lib/tasks/blacklight_test_app.rake +14 -0
  54. data/spec/views/bookmarks/_endnote.html.erb_spec.rb +9 -0
  55. data/spec/views/bookmarks/_refworks.html.erb_spec.rb +10 -0
  56. data/test_support/data/test_data.utf8.mrc +1 -0
  57. metadata +231 -0
@@ -0,0 +1,57 @@
1
+ require 'rails/generators'
2
+
3
+ module BlacklightMarc
4
+ class MarcGenerator < Rails::Generators::Base
5
+
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ desc """
9
+ 1. Creates config/SolrMarc/... with settings for SolrMarc
10
+ 2. Creates a CatalogController with some some demo fields for MARC-like data
11
+ 3. Injects MARC-specific behaviors into the SolrDocument
12
+ 4. Injects MARC-specific behaviors into the CatalogController
13
+ """
14
+
15
+ # Copy all files in templates/config directory to host config
16
+ def create_configuration_files
17
+ directory("config/SolrMarc")
18
+ end
19
+
20
+ # add MARC-specific extensions to the solr document
21
+ def add_marc_extension_to_solrdocument
22
+
23
+ insert_into_file "app/models/solr_document.rb", :after => "include Blacklight::Solr::Document" do <<EOF
24
+
25
+ # The following shows how to setup this blacklight document to display marc documents
26
+ extension_parameters[:marc_source_field] = :marc_display
27
+ extension_parameters[:marc_format_type] = :marcxml
28
+ use_extension( Blacklight::Solr::Document::Marc) do |document|
29
+ document.key?( :marc_display )
30
+ end
31
+
32
+ field_semantics.merge!(
33
+ :title => "title_display",
34
+ :author => "author_display",
35
+ :language => "language_facet",
36
+ :format => "format"
37
+ )
38
+
39
+ EOF
40
+ end
41
+ end
42
+
43
+ # Add MARC behaviors to the catalog controller
44
+ def inject_blacklight_controller_behavior
45
+ # prepend_file("app/controllers/application_controller.rb", "require 'blacklight/controller'\n\n")
46
+ inject_into_class "app/controllers/catalog_controller.rb", "CatalogController", :after => "include Blacklight::Catalog" do
47
+ " include Blacklight::Marc::Catalog\n"
48
+ end
49
+ end
50
+
51
+
52
+ def inject_blacklight_marc_routes
53
+ route('Blacklight::Marc.add_routes(self)')
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,37 @@
1
+ # If using the solr:marc:index task, you can define environment-specific
2
+ # config files that will be used instead of 'config.properties' for
3
+ # a specific environment. config-development.properties,
4
+ # config-production.properties, etc.
5
+
6
+ # Relative paths for solrmarc.solr.war.path and solr.path are relative
7
+ # to the location of SolrMarc.jar, which for blacklight is by default
8
+ # in blacklight/config/solr_marc.
9
+
10
+ # solrmarc.solr.war.path - must point to either a war file for the version of
11
+ # Solr that you want to use, or to a directory of jar files extracted from a
12
+ # Solr war files. If this is not provided, SolrMarc can only work by
13
+ # communicating with a running Solr server.
14
+ #solrmarc.solr.war.path=../jetty/webapps/solr.war
15
+ # Path to your solr instance
16
+ #solr.path = ../jetty/solr
17
+
18
+ # Relative paths for solr.indexer can be relative to the location of
19
+ # this config.properties file.
20
+ solr.indexer = org.solrmarc.index.SolrIndexer
21
+ solr.indexer.properties = index.properties
22
+
23
+ # URL of running solr search engine to cause updates to be recognized.
24
+ # * When solr.path and solrmarc.solr.war.path are defined, this is optional,
25
+ # but if defined SolrMarc will issue a 'commit' after it's done indexing.
26
+ # * Alternately, do not define solr.path or solrmarc.solr.war.path to have
27
+ # SolrMarc use HTTP Post to add documents.
28
+ # NOTE:
29
+ # When using the solr:marc:index rake task, this value will be automatically
30
+ # looked up from your solr.yml, and the value here will NOT be used.
31
+ solr.hosturl = http://localhost:8888/solr/update
32
+
33
+ # MARC handling parameters
34
+ marc.to_utf_8 = true
35
+ marc.permissive = true
36
+ marc.default_encoding = MARC8
37
+ marc.include_errors = false
@@ -0,0 +1,37 @@
1
+ # If using the solr:marc:index task, you can define environment-specific
2
+ # config files that will be used instead of 'config.properties' for
3
+ # a specific environment. config-development.properties,
4
+ # config-production.properties, etc.
5
+
6
+ # Relative paths for solrmarc.solr.war.path and solr.path are relative
7
+ # to the location of SolrMarc.jar, which for blacklight is by default
8
+ # in blacklight/config/solr_marc.
9
+
10
+ # solrmarc.solr.war.path - must point to either a war file for the version of
11
+ # Solr that you want to use, or to a directory of jar files extracted from a
12
+ # Solr war files. If this is not provided, SolrMarc can only work by
13
+ # communicating with a running Solr server.
14
+ # solrmarc.solr.war.path= ../../../../jetty/webapps/solr.war
15
+ # Path to your solr instance
16
+ # solr.path = ../../../../jetty/solr
17
+
18
+ # Relative paths for solr.indexer can be relative to the location of
19
+ # this config.properties file.
20
+ solr.indexer = org.solrmarc.index.SolrIndexer
21
+ solr.indexer.properties = index.properties
22
+
23
+ # URL of running solr search engine to cause updates to be recognized.
24
+ # * When solr.path and solrmarc.solr.war.path are defined, this is optional,
25
+ # but if defined SolrMarc will issue a 'commit' after it's done indexing.
26
+ # * Alternately, do not define solr.path or solrmarc.solr.war.path to have
27
+ # SolrMarc use HTTP Post to add documents.
28
+ # NOTE:
29
+ # When using the solr:marc:index rake task, this value will be automatically
30
+ # looked up from your solr.yml, and the value here will NOT be used.
31
+ solr.hosturl = http://localhost:8983/solr/update
32
+
33
+ # MARC handling parameters
34
+ marc.to_utf_8 = true
35
+ marc.permissive = true
36
+ marc.default_encoding = MARC8
37
+ marc.include_errors = false
@@ -0,0 +1,97 @@
1
+ # for more information on solrmarc mappings,
2
+ # see http://code.google.com/p/solrmarc/w/list
3
+ #
4
+ # GenericBlacklight uses these conventions, mostly.
5
+ # _t for indexed fields (for searching)
6
+ # _display for stored fields (for display in UI)
7
+ # _facet for facet fields
8
+ # _sort for sorting fields (fields used to sort results)
9
+ #
10
+ # see jetty/solr/conf/schema.xml in Blacklight demo project
11
+ # see http://blacklight.rubyforge.org/ DEMO_README file
12
+
13
+ id = 001, first
14
+ marc_display = FullRecordAsXML
15
+ text = custom, getAllSearchableFields(100, 900)
16
+
17
+ language_facet = 008[35-37]:041a:041d, language_map.properties
18
+ # format is for facet, display, and selecting partial for display in show view
19
+ format = 007[0-1]:000[6-7]:000[6], (map.format), first
20
+ isbn_t = 020a, (pattern_map.isbn_clean)
21
+ material_type_display = custom, removeTrailingPunct(300aa)
22
+
23
+ # Title fields
24
+ # primary title
25
+ title_t = custom, getLinkedFieldCombined(245a)
26
+ title_display = custom, removeTrailingPunct(245a)
27
+ title_vern_display = custom, getLinkedField(245a)
28
+ # subtitle
29
+ subtitle_t = custom, getLinkedFieldCombined(245b)
30
+ subtitle_display = custom, removeTrailingPunct(245b)
31
+ subtitle_vern_display = custom, getLinkedField(245b)
32
+ # additional title fields
33
+ title_addl_t = custom, getLinkedFieldCombined(245abnps:130[a-z]:240[a-gk-s]:210ab:222ab:242abnp:243[a-gk-s]:246[a-gnp]:247[a-gnp])
34
+ title_added_entry_t = custom, getLinkedFieldCombined(700[gk-pr-t]:710[fgk-t]:711fgklnpst:730[a-gk-t]:740anp)
35
+ title_series_t = custom, getLinkedFieldCombined(440anpv:490av)
36
+ title_sort = custom, getSortableTitle
37
+
38
+ # Author fields
39
+ author_t = custom, getLinkedFieldCombined(100abcegqu:110abcdegnu:111acdegjnqu)
40
+ author_addl_t = custom, getLinkedFieldCombined(700abcegqu:710abcdegnu:711acdegjnqu)
41
+ author_display = custom, removeTrailingPunct(100abcdq:110[a-z]:111[a-z])
42
+ author_vern_display = custom, getLinkedField(100abcdq:110[a-z]:111[a-z])
43
+ author_sort = custom, getSortableAuthor
44
+
45
+ # Subject fields
46
+ subject_t = custom, getLinkedFieldCombined(600[a-u]:610[a-u]:611[a-u]:630[a-t]:650[a-e]:651ae:653aa:654[a-e]:655[a-c])
47
+ subject_addl_t = custom, getLinkedFieldCombined(600[v-z]:610[v-z]:611[v-z]:630[v-z]:650[v-z]:651[v-z]:654[v-z]:655[v-z])
48
+ subject_topic_facet = custom, removeTrailingPunct(600abcdq:610ab:611ab:630aa:650aa:653aa:654ab:655ab)
49
+ subject_era_facet = custom, removeTrailingPunct(650y:651y:654y:655y)
50
+ subject_geo_facet = custom, removeTrailingPunct(651a:650z)
51
+
52
+ # Publication fields
53
+ published_display = custom, removeTrailingPunct(260a)
54
+ published_vern_display = custom, getLinkedField(260a)
55
+ # used for facet and display, and copied for sort
56
+ pub_date = custom, getDate
57
+
58
+ # Call Number fields
59
+ lc_callnum_display = 050ab, first
60
+ lc_1letter_facet = 050a[0], callnumber_map.properties, first
61
+ lc_alpha_facet = 050a, (pattern_map.lc_alpha), first
62
+ lc_b4cutter_facet = 050a, first
63
+
64
+ # URL Fields
65
+ url_fulltext_display = custom, getFullTextUrls
66
+ url_suppl_display = custom, getSupplUrls
67
+
68
+
69
+ # MAPPINGS
70
+
71
+ # format mapping
72
+ # leader 06-07
73
+ map.format.aa = Book
74
+ map.format.ab = Serial
75
+ map.format.am = Book
76
+ map.format.as = Serial
77
+ map.format.ta = Book
78
+ map.format.tm = Book
79
+ # leader 06
80
+ map.format.c = Musical Score
81
+ map.format.d = Musical Score
82
+ map.format.e = Map or Globe
83
+ map.format.f = Map or Globe
84
+ map.format.i = Non-musical Recording
85
+ map.format.j = Musical Recording
86
+ map.format.k = Image
87
+ map.format.m = Computer File
88
+ # 007[0] when it doesn't clash with above
89
+ map.format.h = Microform
90
+ map.format.q = Musical Score
91
+ map.format.v = Video
92
+ # none of the above
93
+ map.format = Unknown
94
+
95
+ pattern_map.lc_alpha.pattern_0 = ^([A-Z]{1,3})\\d+.*=>$1
96
+
97
+ pattern_map.isbn_clean.pattern_0 = ([- 0-9]*[0-9]).*=>$1
@@ -0,0 +1,47 @@
1
+ import org.marc4j.marc.Record;
2
+ import org.solrmarc.tools.Utils;
3
+ import org.solrmarc.tools.CallNumUtils;
4
+
5
+ // define the base level indexer so that its methods can be called from the script.
6
+ // note that the SolrIndexer code will set this value before the script methods are called.
7
+ org.solrmarc.index.SolrIndexer indexer = null;
8
+
9
+ /**
10
+ * returns the facet value for dewey hundreds digits, and dewey tens digits
11
+ * @param record
12
+ * @return Set of Strings containing facet value for dewey hundreds digits, and dewey tens digits
13
+ */
14
+ Set getDeweyFacet(Record record, String propertiesMapName)
15
+ {
16
+ LinkedHashSet resultSet = new LinkedHashSet();
17
+ Set values = indexer.getFieldList(record, "082a");
18
+ String mapName = indexer.loadTranslationMap(propertiesMapName);
19
+
20
+ for (String dewey : values)
21
+ {
22
+ if (! CallNumUtils.isValidDewey(dewey)) continue;
23
+ String hundreds = dewey.substring(0, 1) + "00";
24
+ String tens = dewey.substring(0,2) + "0";
25
+ String hundredsMapped = Utils.remap(hundreds, indexer.findMap(mapName), true);
26
+ String tensMapped = Utils.remap(tens, indexer.findMap(mapName), true);
27
+ if (hundredsMapped != null) resultSet.add(hundredsMapped);
28
+ if (tensMapped != null) resultSet.add(tensMapped);
29
+ }
30
+
31
+ return resultSet;
32
+ }
33
+
34
+ Set getDeweyText(Record record)
35
+ {
36
+ LinkedHashSet resultSet = new LinkedHashSet();
37
+ Set values = indexer.getFieldList(record, "082a");
38
+
39
+ for (String dewey : values)
40
+ {
41
+ if (! CallNumUtils.isValidDewey(dewey)) continue;
42
+ dewey = dewey.replaceAll("/[.]", ".").replaceAll("/", " ");
43
+ resultSet.add(dewey);
44
+ }
45
+
46
+ return resultSet;
47
+ }
@@ -0,0 +1,126 @@
1
+ import org.marc4j.marc.Record;
2
+ import org.solrmarc.tools.Utils;
3
+
4
+ // define the base level indexer so that its methods can be called from the script.
5
+ // note that the SolrIndexer code will set this value before the script methods are called.
6
+ org.solrmarc.index.SolrIndexer indexer = null;
7
+
8
+ /**
9
+ * Determine Record Format(s)
10
+ *
11
+ * @param Record record
12
+ * @return Set format of record
13
+ */
14
+
15
+ public Set getFormat(Record record)
16
+ {
17
+ Set result = new LinkedHashSet();
18
+
19
+ // check if there's an h in the 245
20
+ Set title_245h = indexer.getFieldList(record, "245h");
21
+ if (Utils.setItemContains(title_245h, "electronic resource"))
22
+ {
23
+ result.add("Electronic");
24
+ return result;
25
+ }
26
+ boolean field007hasC = false;
27
+ // check the 007 - this is a repeating field
28
+ // if we find a matching value there, grab it and return.
29
+ Set fields007 = indexer.getFieldList(record, "007[0-1]");
30
+ for (String f_007 : fields007)
31
+ {
32
+ f_007 = f_007.toUpperCase();
33
+ if (f_007.startsWith("A"))
34
+ if (f_007.equals( "AD")) result.add("Atlas");
35
+ else result.add("Map");
36
+ else if (f_007.startsWith("C"))
37
+ if (f_007.equals("CA")) result.add("TapeCartridge");
38
+ else if (f_007.equals("CB")) result.add("ChipCartridge");
39
+ else if (f_007.equals("CC")) result.add("DiscCartridge");
40
+ else if (f_007.equals("CF")) result.add("TapeCassette");
41
+ else if (f_007.equals("CH")) result.add("TapeReel");
42
+ else if (f_007.equals("CJ")) result.add("FloppyDisk");
43
+ else if (f_007.equals("CM")) result.add("CDROM");
44
+ else if (f_007.equals("C0")) result.add("CDROM");
45
+ else if (f_007.equals("CR")) field007hasC = true; // Do not return - this will cause anything with an 856 field to be labeled as "Electronic"
46
+ else result.add("Software");
47
+ else if (f_007.startsWith("D")) result.add("Globe");
48
+ else if (f_007.startsWith("F")) result.add("Braille");
49
+ else if (f_007.startsWith("G"))
50
+ if (f_007.equals("GC")) result.add("Filmstrip");
51
+ else if (f_007.equals("GD")) result.add("Filmstrip");
52
+ else if (f_007.equals("GT")) result.add("Transparency");
53
+ else result.add("Slide");
54
+ else if (f_007.startsWith("H")) result.add("Microfilm");
55
+ else if (f_007.startsWith("K"))
56
+ if (f_007.equals("KC")) result.add("Collage");
57
+ else if (f_007.equals("KD")) result.add("Drawing");
58
+ else if (f_007.equals("KE")) result.add("Painting");
59
+ else if (f_007.equals("KF")) result.add("Print");
60
+ else if (f_007.equals("KG")) result.add("Photonegative");
61
+ else if (f_007.equals("KJ")) result.add("Print");
62
+ else if (f_007.equals("KL")) result.add("Drawing");
63
+ else if (f_007.equals("K0")) result.add("FlashCard");
64
+ else if (f_007.equals("KN")) result.add("Chart");
65
+ else result.add("Photo");
66
+ else if (f_007.startsWith("M"))
67
+ if (f_007.equals("MF")) result.add("VideoCassette");
68
+ else if (f_007.equals("MR")) result.add("Filmstrip");
69
+ else result.add("MotionPicture");
70
+ else if (f_007.startsWith("O")) result.add("Kit");
71
+ else if (f_007.startsWith("Q")) result.add("MusicalScore");
72
+ else if (f_007.startsWith("R")) result.add("SensorImage");
73
+ else if (f_007.startsWith("S"))
74
+ if (f_007.equals("SD")) result.add("SoundDisc");
75
+ else if (f_007.equals("SS")) result.add("SoundCassette");
76
+ else result.add("SoundRecording");
77
+ else if (f_007.startsWith("V"))
78
+ if (f_007.equals("VC")) result.add("VideoCartridge");
79
+ else if (f_007.equals("VD")) result.add("VideoDisc");
80
+ else if (f_007.equals("VF")) result.add("VideoCassette");
81
+ else if (f_007.equals("VR")) result.add("VideoReel");
82
+ else result.add("Video");
83
+
84
+ // if we found a matching value and return it.
85
+ if (!result.isEmpty()) return result;
86
+ }
87
+ // check the Leader - this is NOT a repeating field
88
+ // if we find a matching value there, grab it and return.
89
+ String f_000 = indexer.getFirstFieldVal(record, null, "000[6-7]");
90
+ f_000 = f_000.toUpperCase();
91
+ if (f_000.startsWith("C")) result.add("MusicalScore");
92
+ else if (f_000.startsWith("D")) result.add("MusicalScore");
93
+ else if (f_000.startsWith("E")) result.add("Map");
94
+ else if (f_000.startsWith("F")) result.add("Map");
95
+ else if (f_000.startsWith("G")) result.add("Slide");
96
+ else if (f_000.startsWith("I")) result.add("SoundRecording");
97
+ else if (f_000.startsWith("J")) result.add("MusicRecording");
98
+ else if (f_000.startsWith("K")) result.add("Photo");
99
+ else if (f_000.startsWith("M")) result.add("Electronic");
100
+ else if (f_000.startsWith("O")) result.add("Kit");
101
+ else if (f_000.startsWith("P")) result.add("Kit");
102
+ else if (f_000.startsWith("R")) result.add("PhysicalObject");
103
+ else if (f_000.startsWith("T")) result.add("Manuscript");
104
+ else if (f_000.startsWith("A"))
105
+ {
106
+ if (f_000.equals("AM"))
107
+ {
108
+ if (field007hasC) result.add("eBook");
109
+ else result.add("Book");
110
+ }
111
+ else if (f_000.equals("AS"))
112
+ {
113
+ // Look in 008 to determine what type of Continuing Resource
114
+ String formatCode = indexer.getFirstFieldVal(record, null, "008[21]");
115
+ if (formatCode.equals("N")) result.add("Newspaper");
116
+ else if (formatCode.equals("P")) result.add("Journal");
117
+ else result.add("Serial");
118
+ }
119
+ }
120
+ // Nothing worked!
121
+ if (result.isEmpty()) {
122
+ result.add("Unknown");
123
+ }
124
+
125
+ return result;
126
+ }
@@ -0,0 +1 @@
1
+ This is the directory in which you should place locally defined translation maps.
@@ -0,0 +1,407 @@
1
+ # Map Call Number Classification pieces to User Friendly Description
2
+ displayRawIfMissing = true
3
+
4
+ # note: need more specific call numbers first so first matching is most specific
5
+ AC = AC - Collections Works
6
+ AE = AE - Encyclopedias
7
+ AG = AG - General Reference Works
8
+ AI = AI - Indexes
9
+ AM = AM - Museums
10
+ AN = AN - Newspapers
11
+ AP = AP - Periodicals
12
+ AS = AS - Academies & Learned Societies
13
+ AY = AY - Yearbooks, Almanacs, Directories
14
+ AZ = AZ - History of Scholarship & Learning
15
+ A = A - General Works
16
+ BC = BC - Logic
17
+ BD = BD - Speculative Philosophy
18
+ BF = BF - Psychology
19
+ BH = BH - Aesthetics
20
+ BJ = BJ - Ethics
21
+ BL = BL - Religions (General)
22
+ BM = BM - Judaism
23
+ BP = BP - Islam, Bahaism, Theosophy, etc.
24
+ BQ = BQ - Buddhism
25
+ BR = BR - Christianity
26
+ BS = BS - The Bible
27
+ BT = BT - Doctrinal Theology
28
+ BV = BV - Practical Theology
29
+ BX = BX - Christian Denominations
30
+ B = B - Philosophy, Psychology, Religion
31
+ CB = CB - History of Civilization
32
+ CC = CC - Archaeology
33
+ CD = CD - Diplomatics
34
+ CE = CE - Technical Chronology
35
+ CJ = CJ - Numismatics
36
+ CN = CN - Inscriptions
37
+ CR = CR - Heraldry
38
+ CS = CS - Genealogy
39
+ CT = CT - Biography
40
+ C = C - Historical Sciences (Archaeology, Genealogy)
41
+ DA = DA - Great Britain (History)
42
+ DB = DB - Austria, Liechtenstein, Czech Rep., Hungary, Slovakia (History)
43
+ DC = DC - France (History)
44
+ DD = DD - Germany (History)
45
+ DE = DE - Greco-Roman World (History)
46
+ DF = DF - Greece (History)
47
+ DG = DG - Italy (History)
48
+ DH = DH - Low Countries (History)
49
+ DJK = DJK - Eastern Europe (History)
50
+ DJ = DJ - Netherlands (History)
51
+ DK = DK - Russia. Former Soviet Republics. Poland (History)
52
+ DL = DL - Scandinavia (History)
53
+ DP = DP - Spain. Portugal (History)
54
+ DQ = DQ - Switzerland (History)
55
+ DR = DR - Balkan Peninsula (History)
56
+ DS = DS - Asia (History)
57
+ DT = DT - Africa (History)
58
+ DU = DU - Oceanía (History)
59
+ DX = DX - Gypsies (History)
60
+ D = D - World History
61
+ E = E - History of the Americas (General)
62
+ F = F - History of the Americas (Local)
63
+ GA = GA - Mathematical Geography, Cartography
64
+ GB = GB - Physical Geography
65
+ GC = GC - Oceanography
66
+ GE = GE - Environmental Sciences
67
+ GF = GF - Human Ecology, Anthropogeography
68
+ GN = GN - Anthropology
69
+ GR = GR - Folklore
70
+ GT = GT - Manners & Customs
71
+ GV = GV - Recreation. Leisure
72
+ G = G - Geography, Anthropology, Recreation
73
+ HA = HA - Statistics
74
+ HB = HB - Economic Theory, Demography
75
+ HC = HC - Economic History & Conditions
76
+ HD = HD - Industries, Land use, Labor
77
+ HE = HE - Transportation & Communications
78
+ HF = HF - Commerce
79
+ HG = HG - Finance
80
+ HJ = HJ - Public Finance
81
+ HM = HM - Sociology
82
+ HN = HN - Social History & Conditions
83
+ HQ = HQ - The Family, Marriage, Woman
84
+ HS = HS - Societies
85
+ HT = HT - Communities, Classes, Races
86
+ HV = HV - Social Pathology, Social & Public Welfare, Criminology
87
+ HX = HX - Socialism, Communism, Anarchism
88
+ H = H - Social Sciences
89
+ JA = JA - Political Science
90
+ JC = JC - Political Theory
91
+ JF = JF - Political Institutions
92
+ JK = JK - Political Institutions (U.S.)
93
+ JL = JL - Political Institutions (Canada, Latin America)
94
+ JN = JN - Political Institutions (Europe)
95
+ JQ = JQ - Political Institutions (Asia, Africa, Australia, Pacific Area)
96
+ JS = JS - Local Government
97
+ JV = JV - Colonies & Colonization, Emigration & Immigration
98
+ JX = JX - International Law
99
+ JZ = JZ - International Relations
100
+ J = J - Political Science
101
+ KBM = KBM - Jewish Law
102
+ KBP = KBP - Islamic Law
103
+ KBR = KBR - Canon Law
104
+ KBU = KBU - Law of Roman Catholic Church
105
+ KB = KB - Religious Law (General)
106
+ KDC = KDC - Law of Scotland
107
+ KDE = KDE - Law of Northern Ireland
108
+ KDG = KDG - Law of Isle of Man, Channel Islands
109
+ KDK = KDK - Law of Ireland (EIRE)
110
+ KDZ = KDZ - Law of America, North America
111
+ KD = KD - Law of England & Wales
112
+ KE = KE - Law of Canada
113
+ KF = KF - Law of the U.S.
114
+ KG = KG - Law of Latin America, Mexico, Central America, West Indies, Caribbean
115
+ KH = KH - South America
116
+ KJA = KJA - Roman Law
117
+ KJC = KJC - Regional Comparative & Uniform Law
118
+ KJE = KJE - Regional Organization & Integration
119
+ KJG = KJG - Law of Albania
120
+ KJH = KJH - Law of Andorra
121
+ KJJ = KJJ - Law of Austria
122
+ KJK = KJK - Law of Belgium, Bosnia & Hercegovina (Republic)
123
+ KJM = KJM - Law of Bulgaria, Croatia
124
+ KJN = KJN - Law of Cyprus
125
+ KJP = KJP - Law of Czechoslovakia, Czech Republic
126
+ KJQ = KJQ - Law of Slovakia
127
+ KJR = KJR - Law of Denmark
128
+ KJS = KJS - Law of Estonia
129
+ KJT = KJT - Law of Finland
130
+ KJV = KJV - Law of France
131
+ KJW = KJW - Law of French Regions, Provinces, Departments
132
+ KJ = KJ - Law of Europe
133
+ KKE = KKE - Law of Greece
134
+ KKF = KKF - Law of Hungary
135
+ KKG = KKG - Law of Iceland
136
+ KKH = KKH - Law of Italy
137
+ KKI = KKI - Law of Latvia
138
+ KKJ = KKJ - Law of Lithuania, Liechtenstein
139
+ KKK = KKK - Law of Luxemburg, Malta
140
+ KKL = KKL - Law of Monaco
141
+ KKM = KKM - Law of the Netherlands
142
+ KKN = KKN - Law of Norway
143
+ KKP = KKP - Law of Poland
144
+ KKQ = KKQ - Law of Portugal
145
+ KKR = KKR - Law of Romania
146
+ KKT = KKT - Law of Spain
147
+ KKV = KKV - Law of Sweden
148
+ KKW = KKW - Law of Switzerland
149
+ KKX = KKX - Law of Turkey
150
+ KKY = KKY - Law of Ukraine
151
+ KKZ = KKZ - Law of Yugoslavia
152
+ KK = KK - Law of Germany
153
+ KLA = KLA - Law of Russia, Soviet Union
154
+ KLB = KLB - Law of Russia (Federation)
155
+ KLD = KLD - Law of Armenia (Republic)
156
+ KLE = KLE - Law of Azerbaijan
157
+ KLF = KLF - Law of Belarus
158
+ KLH = KLH - Law of Georgia
159
+ KLM = KLM - Law of Moldova
160
+ KLP = KLP - Law of Ukraine
161
+ KLR = KLR - Law of Kazakhstan
162
+ KLS = KLS - Law of Kyrgyzstan
163
+ KLT = KLT - Law of Tajikistan
164
+ KLV = KLV - Law of Turkmenistan
165
+ KLW = KLW - Law of Uzbekistan
166
+ KL = KL - History of Law, The Ancient Orient
167
+ KMC = KMC - Law of the Middle East, Southwest Asia
168
+ KMH = KMH - Law of Iran
169
+ KMJ = KMJ - Law of Iraq
170
+ KMK = KMK - Law of Israel
171
+ KML = KML - Law of Jerusalem
172
+ KMM = KMM - Law of Jordan
173
+ KMN = KMN - Law of Kuwait
174
+ KMP = KMP - Law of Lebanon
175
+ KMT = KMT - Law of Saudi Arabia
176
+ KMU = KMU - Law of Syria
177
+ KMX = KMX - Law of Yemen
178
+ KM = KM - Law of Asia
179
+ KNC = KNC - Law of South Asia
180
+ KNN = KNN - Law of China
181
+ KNP = KNP - Law of Taiwan
182
+ KNR = KNR - Law of Hong Kong
183
+ KNS = KNS - Law of India
184
+ KNW = KNW - Law of Indonesia
185
+ KNX = KNX - Law of Japan
186
+ KPA = KPA - Law of Korea, South Korea
187
+ KPC = KPC - Law of Korea, North Korea
188
+ KQ = KQ - Law of Africa
189
+ KU = KU - Law of the Pacific Area, Australia, New Zealand
190
+ KWX = KWX - Law of Antarctica
191
+ KZ = KZ - Law of Nations
192
+ K = K - Law
193
+ LA = LA - History of Education
194
+ LB = LB - Theory & Practice of Education
195
+ LC = LC - Special Aspects of Education
196
+ LD = LD - Individual Educational Institutions (U.S.)
197
+ LE = LE - Individual Educational Institutions: America (except U.S.)
198
+ LF = LF - Individual Educational Institutions: Europe
199
+ LG = LG - Individual Educational Institutions: Asia, Africa, Oceania
200
+ LH = LH - College & School Magazines & Papers
201
+ LT = LT - Textbooks
202
+ L = L - Education
203
+ MLCME = Unknown
204
+ MLCSN = Unknown
205
+ ML = ML - Literature on Music
206
+ MT = MT - Musical Instruction & Study
207
+ M = M - Music
208
+ NA = NA - Architecture
209
+ NB = NB - Sculpture
210
+ NC = NC - Drawing, Design, Illustration
211
+ ND = ND - Painting
212
+ NE = NE - Print Media
213
+ NK = NK - Decorative Arts
214
+ NX = NX - Arts in General
215
+ N = N - Fine Arts
216
+ PA = PA - Greek & Latin Language & Literature
217
+ PB = PB - Modern Language, Celtic Languages
218
+ PC = PC - Romanic Languages
219
+ PD = PD - Germanic Languages
220
+ PE = PE - English Languages
221
+ PF = PF - West Germanic Languages
222
+ PG = PG - Slavic, Baltic, Albanian Languages, Russian Language & Literature
223
+ PH = PH - Uralic & Basque Languages
224
+ PJ = PJ - Oriental Languages & Literature
225
+ PK = PK - Indo-Iranian Languages & Literature
226
+ PL = PL - Languages & Literatures of Eastern Asia, Africa, Oceania
227
+ PM = PM - Hyperborean, Indian & Artificial Languages
228
+ PN = PN - Literature (General)
229
+ PQ = PQ - French, Italian, Spanish & Portuguese Literature
230
+ PR = PR - English Literature
231
+ PS = PS - American Literature
232
+ PT = PT - Germanic & Scandinavian Literatures
233
+ PZ = PZ - Children’s Literature
234
+ P = P - Language & Literature
235
+ QA = QA - Mathematics
236
+ QB = QB - Astronomy
237
+ QC = QC - Physics
238
+ QD = QD - Chemistry
239
+ QE = QE - Geology
240
+ QH = QH - Natural History, Biology
241
+ QK = QK - Botany
242
+ QL = QL - Zoology
243
+ QM = QM - Human Anatomy
244
+ QP = QP - Physiology
245
+ QR = QR - Microbiology
246
+ Q = Q - Science
247
+ RA = RA - Public Aspects of Medicine
248
+ RB = RB - Pathology
249
+ RC = RC - Internal Medicine
250
+ RD = RD - Surgery
251
+ RE = RE - Ophthalmology
252
+ RF = RF - Otorhinolaryngology
253
+ RG = RG - Gynecology & Obstetrics
254
+ RJ = RJ - Pediatrics
255
+ RK = RK - Dentistry
256
+ RL = RL - Dermatology
257
+ RM = RM - Therapeutics, Pharmacology
258
+ RS = RS - Pharmacy & Materia Medica
259
+ RT = RT - Nursing
260
+ RV = RV - Botanic, Thomsonian, & Eclectic Medicine
261
+ RX = RX - Homeopathy
262
+ RZ = RZ - Other Systems of Medicine
263
+ R = R - Medicine
264
+ SB = SB - Plant Culture
265
+ SD = SD - Forestry
266
+ SF = SF - Animal Culture
267
+ SH = SH - Aquaculture
268
+ SK = SK - Hunting Sports
269
+ S = S - Agriculture
270
+ TA = TA - Engineering, Civil Engineering
271
+ TC = TC - Hydraulic Engineering
272
+ TD = TD - Environmental Technology
273
+ TE = TE - Highway Engineering
274
+ TF = TF - Railroad Engineering & Operation
275
+ TG = TG - Bridge Engineering
276
+ TH = TH - Building Construction
277
+ TJ = TJ - Mechanical Engineering & Machinery
278
+ TK = TK - Electrical Engineering, Nuclear Engineering
279
+ TL = TL - Motor Vehicles, Aeronautics, Astronautics
280
+ TN = TN - Mining Engineering
281
+ TP = TP - Chemical Technology
282
+ TR = TR - Photography
283
+ TS = TS - Manufactures
284
+ TT = TT - Handicrafts
285
+ TX = TX - Home Economics
286
+ T = T - Technology
287
+ UA = UA - Armies
288
+ UB = UB - Military Administration
289
+ UC = UC - Maintenance & Transportation
290
+ UD = UD - Infantry
291
+ UE = UE - Cavalry, Armor
292
+ UF = UF - Artillery
293
+ UG = UG - Military Engineering, Air Forces, Military Astronautics
294
+ UH = UH - Other Military Services
295
+ U = U - Military Science
296
+ VA = VA - Navies
297
+ VB = VB - Naval Administration
298
+ VC = VC - Naval Maintenance
299
+ VD = VD - Naval Seamen
300
+ VE = VE - Marines
301
+ VF = VF - Naval Ordnance
302
+ VG = VG - Minor Services of Navies
303
+ VK = VK - Navigation, Merchant Marine
304
+ VM = VM - Naval Architecture, Marine Engineering
305
+ V = V - Naval Science
306
+ ZA = ZA - Information Science
307
+ Z = Z - Bibliography, Library Science, Information Resources
308
+
309
+ 000 = 000s - Computer Science, Information & General Works
310
+ 010 = 010s - Bibliography
311
+ 020 = 020s - Library & Information Sciences
312
+ 030 = 030s - General Encyclopedic Works
313
+ 050 = 050s - General Serials & their Indexes
314
+ 060 = 060s - General Organization & Museology
315
+ 070 = 070s - News Media, Journalism, Publishing
316
+ 080 = 080s - General Collections
317
+ 090 = 090s - Manuscripts & Rare Books
318
+ 100 = 100s - Philosophy & Psychology
319
+ 110 = 110s - Metaphysics
320
+ 120 = 120s - Epistemology, Causation, Humankind
321
+ 130 = 130s - Paranormal Phenomena
322
+ 140 = 140s - Specific Philosophical Schools
323
+ 150 = 150s - Psychology
324
+ 160 = 160s - Logic
325
+ 170 = 170s - Ethics (Moral Philosophy)
326
+ 180 = 180s - Ancient, Medieval, Oriental Philosophy
327
+ 190 = 190s - Modern Western Philosophy
328
+ 200 = 200s - Religion
329
+ 210 = 210s - Natural Theology
330
+ 220 = 220s - Bible
331
+ 230 = 230s - Christian Theology
332
+ 240 = 240s - Christian Moral & Devotional Theology
333
+ 250 = 250s - Christian Orders & Local Church
334
+ 260 = 260s - Christian Social Theology
335
+ 270 = 270s - Christian Church History
336
+ 280 = 280s - Christian Denominations & Sects
337
+ 290 = 290s - Other & Comparative Religions
338
+ 300 = 300s - Social Sciences
339
+ 310 = 310s - General Statistics
340
+ 320 = 320s - Political Science
341
+ 330 = 330s - Economics
342
+ 340 = 340s - Law
343
+ 350 = 350s - Public Administration
344
+ 360 = 360s - Social Services; Association
345
+ 370 = 370s - Education
346
+ 380 = 380s - Commerce, Communications, Transport
347
+ 390 = 390s - Customs, Etiquette, Folklore
348
+ 400 = 400s - Language
349
+ 410 = 410s - Linguistics
350
+ 420 = 420s - English & Old English
351
+ 430 = 430s - Germanic Languages German
352
+ 440 = 440s - Romance Languages French
353
+ 450 = 450s - Italian, Romanian, Rhaeto-Romantic
354
+ 460 = 460s - Spanish & Portugese Languages
355
+ 470 = 470s - Italic Latin
356
+ 480 = 480s - Hellenic Languages Classical Greek
357
+ 490 = 490s - Other Languages
358
+ 500 = 500s - Science
359
+ 510 = 510s - Mathematics
360
+ 520 = 520s - Astronomy & Allied Sciences
361
+ 530 = 530s - Physics
362
+ 540 = 540s - Chemistry & Allied Sciences
363
+ 550 = 550s - Earth Sciences
364
+ 560 = 560s - Paleontology Paleozoology
365
+ 570 = 570s - Life Sciences
366
+ 580 = 580s - Botanical Sciences
367
+ 590 = 590s - Zoological Sciences
368
+ 600 = 600s - Technology
369
+ 610 = 610s - Medical Sciences Medicine
370
+ 620 = 620s - Engineering & Allied Operations
371
+ 630 = 630s - Agriculture
372
+ 640 = 640s - Home economics & Family Living
373
+ 650 = 650s - Management & Auxiliary Services
374
+ 660 = 660s - Chemical Engineering
375
+ 670 = 670s - Manufacturing
376
+ 680 = 680s - Manufacture for Specific Uses
377
+ 690 = 690s - Buildings
378
+ 700 = 700s - Arts & Recreation
379
+ 710 = 710s - Civic & Landscape Art
380
+ 720 = 720s - Architecture
381
+ 730 = 730s - Plastic Arts Sculpture
382
+ 740 = 740s - Drawing & Decorative Arts
383
+ 750 = 750s - Painting & Paintings
384
+ 760 = 760s - Graphic Arts Printmaking & Prints
385
+ 770 = 770s - Photography & Photographs
386
+ 780 = 780s - Music
387
+ 790 = 790s - Recreational & Performing Arts
388
+ 800 = 800s - Literature
389
+ 810 = 810s - American Literature in English
390
+ 820 = 820s - English & Old English Literatures
391
+ 830 = 830s - Literatures of Germanic Languages
392
+ 840 = 840s - Literatures of Romance Languages
393
+ 850 = 850s - Italian, Romanian, Rhaeto-Romanic
394
+ 860 = 860s - Spanish & Portuguese Literatures
395
+ 870 = 870s - Italic Literatures Latin
396
+ 880 = 880s - Hellenic Literatures Classical Greek
397
+ 890 = 890s - Literatures of Other Languages
398
+ 900 = 900s - History & Geography
399
+ 910 = 910s - Geography & Travel
400
+ 920 = 920s - Biography, Genealogy, Insignia
401
+ 930 = 930s - History of Ancient World
402
+ 940 = 940s - General History of Europe
403
+ 950 = 950s - General History of Asia Far East
404
+ 960 = 960s - General History of Africa
405
+ 970 = 970s - General History of North America
406
+ 980 = 980s - General History of South America
407
+ 990 = 990s - General History of Other Areas