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;
}
}
}