private static void resolveWeak()

in fop-core/src/main/java/org/apache/fop/complexscripts/bidi/UnicodeBidiAlgorithm.java [305:411]


    private static void resolveWeak(int[] wca, int defaultLevel, int[] ea, int[] la, int start, int end, int level, int sor, int eor) {

        // W1 - X BN* NSM -> X BN* X
        for (int i = start, n = end, bcPrev = sor; i < n; i++) {
            int bc = wca [ i ];
            if (bc == NSM) {
                wca [ i ] = bcPrev;
            } else if (bc != BN) {
                bcPrev = bc;
            }
        }

        // W2 - AL ... EN -> AL ... AN
        for (int i = start, n = end, bcPrev = sor; i < n; i++) {
            int bc = wca [ i ];
            if (bc == EN) {
                if (bcPrev == AL) {
                    wca [ i ] = AN;
                }
            } else if (isStrong(bc)) {
                bcPrev = bc;
            }
        }

        // W3 - AL -> R
        for (int i = start, n = end; i < n; i++) {
            int bc = wca [ i ];
            if (bc == AL) {
                wca [ i ] = R;
            }
        }

        // W4 - EN BN* ES BN* EN -> EN BN* EN BN* EN; XN BN* CS BN* XN -> XN BN* XN BN* XN
        for (int i = start, n = end, bcPrev = sor; i < n; i++) {
            int bc = wca [ i ];
            if (bc == ES) {
                int bcNext = eor;
                for (int j = i + 1; j < n; j++) {
                    if ((bc = wca [ j ]) != BN) {
                        bcNext = bc;
                        break;
                    }
                }
                if ((bcPrev == EN) && (bcNext == EN)) {
                    wca [ i ] = EN;
                }
            } else if (bc == CS) {
                int bcNext = eor;
                for (int j = i + 1; j < n; j++) {
                    if ((bc = wca [ j ]) != BN) {
                        bcNext = bc;
                        break;
                    }
                }
                if ((bcPrev == EN) && (bcNext == EN)) {
                    wca [ i ] = EN;
                } else if ((bcPrev == AN) && (bcNext == AN)) {
                    wca [ i ] = AN;
                }
            }
            if (bc != BN) {
                bcPrev = bc;
            }
        }

        // W5 - EN (ET|BN)* -> EN (EN|BN)*; (ET|BN)* EN -> (EN|BN)* EN
        for (int i = start, n = end, bcPrev = sor; i < n; i++) {
            int bc = wca [ i ];
            if (bc == ET) {
                int bcNext = eor;
                for (int j = i + 1; j < n; j++) {
                    bc = wca [ j ];
                    if ((bc != BN) && (bc != ET)) {
                        bcNext = bc;
                        break;
                    }
                }
                if ((bcPrev == EN) || (bcNext == EN)) {
                    wca [ i ] = EN;
                }
            } else if (bc != BN) {
                bcPrev = bc;
            }
        }

        // W6 - BN* (ET|ES|CS) BN* -> ON* ON ON*
        for (int i = start, n = end; i < n; i++) {
            int bc = wca [ i ];
            if ((bc == ET) || (bc == ES) || (bc == CS)) {
                wca [ i ] = ON;
                resolveAdjacentBoundaryNeutrals(wca, start, end, i, ON);
            }
        }

        // W7 - L ... EN -> L ... L
        for (int i = start, n = end, bcPrev = sor; i < n; i++) {
            int bc = wca [ i ];
            if (bc == EN) {
                if (bcPrev == L) {
                    wca [ i ] = L;
                }
            } else if ((bc == L) || (bc == R)) {
                bcPrev = bc;
            }
        }

    }