Cleaner implementation of LC subclass / Cutter spine label splitting
authordbs <dbs@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 27 Aug 2010 16:08:22 +0000 (16:08 +0000)
committerdbs <dbs@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 27 Aug 2010 16:08:22 +0000 (16:08 +0000)
TODO: detect whether this library is configured as an LC library and
only invoke these call number machinations if that is the case. That
leaves the door open for implementations of preferred Dewey splitting
mechanisms, etc.

git-svn-id: svn://svn.open-ils.org/ILS/trunk@17360 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/xul/staff_client/server/cat/spine_labels.js

index e9192a9..720348b 100644 (file)
 
         function generate_labels(volume, label_node, label_cfg, override) {
             var names;
+            var callnum;
 
             if (override && volume.id() == override.acn) {
                 /* If we're calling ourself, we'll have an altered label */
-                names = String(override.label).split(/\s+/);
+                callnum = String(override.label);
             } else {
                 /* take the call number and split it on whitespace */
-                names = String(volume.label()).split(/\s+/);
+                callnum = String(volume.label());
             }
-            var j = 0;
-            var name_cnt = 0;
+
             /* for LC, split between classification subclass letters and numbers */
-            var lc_class_re = /^([A-Z]{1,3})([0-9]+.*?$)/i;
+            var lc_class_re = /^([A-Z]{1,3})([0-9]+.*?)$/i;
+            var lc_class_match = lc_class_re.exec(callnum);
+            if (lc_class_match && lc_class_match.length > 1) {
+                callnum = lc_class_match[1] + ' ' + lc_class_match[2];
+            }
+
+            /* for LC, split between Cutter numbers */
+            var lc_cutter_re = /^(.*?)(\.[A-Z]{1}[0-9]+.*?)$/ig;
+            var lc_cutter_match = lc_cutter_re.exec(callnum);
+            if (lc_cutter_match && lc_cutter_match.length > 1) {
+                callnum = '';
+                for (var i = 1; i < lc_cutter_match.length; i++) {
+                    callnum += lc_cutter_match[i] + ' ';
+                }
+            }
+
+            names = callnum.split(/\s+/);
+            var j = 0;
             while (j < label_cfg.spine_length || j < label_cfg.pocket_length) {
                 var hb2 = document.createElement('hbox'); label_node.appendChild(hb2);
                 
                     if (name) {
                         name = String( name );
 
-                        /* Split LC subclass between alpha and numeric part */
-                        if (name_cnt == 0) {
-                            var lc_class_match = lc_class_re.exec(name);
-                            if (lc_class_match && lc_class_match.length > 1) {
-                                name = lc_class_match[1];
-                                names = [lc_class_match[2]].concat(names);
-                            }
-                            name_cnt = 1;
-                        }
-
                         /* if the name is greater than the label width... */
                         if (name.length > label_cfg.spine_width) {
                             /* then try to split it on periods */