+ // 1. move consistent list item styles up to list root.\r
+ // 2. clear out unnecessary list item numbering.\r
+ function postProcessList( list )\r
+ {\r
+ var children = list.children,\r
+ child,\r
+ attrs,\r
+ count = list.children.length,\r
+ match,\r
+ mergeStyle,\r
+ styleTypeRegexp = /list-style-type:(.*?)(?:;|$)/,\r
+ stylesFilter = CKEDITOR.plugins.pastefromword.filters.stylesFilter;\r
+\r
+ attrs = list.attributes;\r
+ if ( styleTypeRegexp.exec( attrs.style ) )\r
+ return;\r
+\r
+ for ( var i = 0; i < count; i++ )\r
+ {\r
+ child = children[ i ];\r
+\r
+ if ( child.attributes.value && Number( child.attributes.value ) == i + 1 )\r
+ delete child.attributes.value;\r
+\r
+ match = styleTypeRegexp.exec( child.attributes.style );\r
+\r
+ if ( match )\r
+ {\r
+ if ( match[ 1 ] == mergeStyle || !mergeStyle )\r
+ mergeStyle = match[ 1 ];\r
+ else\r
+ {\r
+ mergeStyle = null;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if ( mergeStyle )\r
+ {\r
+ for ( i = 0; i < count; i++ )\r
+ {\r
+ attrs = children[ i ].attributes;\r
+ attrs.style && ( attrs.style = stylesFilter( [ [ 'list-style-type'] ] )( attrs.style ) || '' );\r
+ }\r
+\r
+ list.addStyle( 'list-style-type', mergeStyle );\r
+ }\r
+ }\r
+\r
+ var cssLengthRelativeUnit = /^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i;\r
+ var emptyMarginRegex = /^(?:\b0[^\s]*\s*){1,4}$/; // e.g. 0px 0pt 0px\r
+ var romanLiternalPattern = '^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$',\r
+ lowerRomanLiteralRegex = new RegExp( romanLiternalPattern ),\r
+ upperRomanLiteralRegex = new RegExp( romanLiternalPattern.toUpperCase() );\r
+\r
+ var orderedPatterns = { 'decimal' : /\d+/, 'lower-roman': lowerRomanLiteralRegex, 'upper-roman': upperRomanLiteralRegex, 'lower-alpha' : /^[a-z]+$/, 'upper-alpha': /^[A-Z]+$/ },\r
+ unorderedPatterns = { 'disc' : /[l\u00B7\u2002]/, 'circle' : /[\u006F\u00D8]/,'square' : /[\u006E\u25C6]/},\r
+ listMarkerPatterns = { 'ol' : orderedPatterns, 'ul' : unorderedPatterns },\r
+ romans = [ [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'], [100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'], [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I'] ],\r
+ alpahbets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";\r
+\r
+ // Convert roman numbering back to decimal.\r
+ function fromRoman( str )\r
+ {\r
+ str = str.toUpperCase();\r
+ var l = romans.length, retVal = 0;\r
+ for ( var i = 0; i < l; ++i )\r
+ {\r
+ for ( var j = romans[i], k = j[1].length; str.substr( 0, k ) == j[1]; str = str.substr( k ) )\r
+ retVal += j[ 0 ];\r
+ }\r
+ return retVal;\r
+ }\r
+\r
+ // Convert alphabet numbering back to decimal.\r
+ function fromAlphabet( str )\r
+ {\r
+ str = str.toUpperCase();\r
+ var l = alpahbets.length, retVal = 1;\r
+ for ( var x = 1; str.length > 0; x *= l )\r
+ {\r
+ retVal += alpahbets.indexOf( str.charAt( str.length - 1 ) ) * x;\r
+ str = str.substr( 0, str.length - 1 );\r
+ }\r
+ return retVal;\r
+ }\r