<div dir="ltr"><div class="gmail_quote"><div dir="ltr"><div>It's funny, we humans run this non-existant algorithm all the time; the sole purpose of UAX 9 and FriBidi is feeding more inputs to our Vis2Log algo :-)<br></div><div><br></div><div>Some thoughts:</div><div><br></div><div>- Do you know base direction?  Autodetecting it from visual input is harder than from logical.</div><div>  E.g. "he said EMBEDDING" and "HE SAID embedding" both look like "ltr RTL" visually.</div><div>  Percentage might work better than first-strong.</div><div>  Dangling punctuation at one end — especially .?! — may be a quite robust sign, if present.</div><div><br></div><div>- If the visual input has any markup/formatting, translating all structure into FSI..PDI should help.<br></div><div><br></div><div>- Do you have line breaks?  It feels to me the per-line reordering should complicate reassembly and log2vis can not work well on split lines.</div><div>  Though experimenting with "bidiv -w 10" I have trouble finding any problematic example, so it's probably not severe... </div><div>  OK, got one with numbers:</div><div><br></div><div># The first `bidiv -w $w` generates visual data with line splits (can't use `fribidi --caprtl` because it still wrongly does line wrapping after reordering).</div><div># The second `bidiv` approximates vis2log; can be replaced with `fribidi --ltr --nopad` with exactly same results.</div><div><br></div><div><div>$ for w in $(seq 15); do </div><div>    echo 'foo bar BAZ 123456789 QUUX they said' | perl -C -pe 'use utf8; tr/A-Z/א-ש/' | </div><div>      bidiv -j -w $w | </div><div>      bidiv -j | </div><div>      perl -C -pe 'use utf8; tr/א-ש/A-Z/' | tr -d '\n'</div><div>    echo "  # -w $w"</div><div>done</div><div>foo bar BAZ 123456789 QUUX they said  # -w 1</div><div>foo bar BAZ 123456789 QUUX they said  # -w 2</div><div>foo bar BAZ 123456789 QUUX they said  # -w 3</div><div>foo bar BAZ 123456789 QUUX they said  # -w 4</div><div>foo bar BA123 Z456789 QUUX they said  # -w 5</div><div>foo bar BAZ 123456789 QUUX they said  # -w 6</div><div>foo bar 12 BAZ3456789 QUUX they said  # -w 7</div><div>foo bar 1234 BAZ56789 QUUX they said  # -w 8</div><div>foo bar B123456 AZ789 QUUX they said  # -w 9</div><div>foo bar BA12345678 Z9 QUUX they said  # -w 10</div><div>foo bar BAZ 123456789 QUUX they said  # -w 11</div><div>foo bar BAZ 123456789 QUUX they said  # -w 12</div><div>foo bar 1 BAZ23456789 QUUX they said  # -w 13</div><div>foo bar 12 BAZ3456789 QUUX they said  # -w 14</div><div>foo bar 123 BAZ456789 QUUX they said  # -w 15</div></div><div><br></div><div>As can be expected, joining the lines (`tr -d '\n'`) before the second "vis2log" bidiv makes things worse e.g. XQUU 456789Z 123BA.<br></div><div>Per-line reordering can make contiguous text non-contiguous and deleting the break points definitely looses data in way that'd be hard even for AI-complete humans.</div><div><br></div><div>[resending as first try from non-subscribed address was rejected, sorry if you get it twice]<br></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">2015-11-14 20:47 GMT+02:00 Dov Grobgeld <span dir="ltr"><<a href="mailto:dov.grobgeld@gmail.com" target="_blank">dov.grobgeld@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div style="font-family:arial,helvetica,sans-serif">Hi Hossein,<br><br></div><div style="font-family:arial,helvetica,sans-serif">Currently there is no algorithm in fribidi doing visual to logical, and as you said in general this inversion cannot be done. A first guess would be just to do logical to visual on the visual string. <br><br>A better approch would be something similar to the following:<br><br></div><div style="font-family:arial,helvetica,sans-serif">1. Let's call the algorithm doing L→V convertion V(s), i.e. fribidi_log2vis() in fribidi, and v the visual string and s the logical string.<br></div><div style="font-family:arial,helvetica,sans-serif">2. Make an initial guess of the logical string s_0 = V(v).<br></div><div style="font-family:arial,helvetica,sans-serif">3. While V(s_i) ≠ s: modify s_{i+1}=M(s_i) and try again.<br><br></div><div style="font-family:arial,helvetica,sans-serif">This basically turns the problem into a problem of how to write the modification function M(s). This may probably be done by comparing V(s) and v and using the differences between them to move misplaces characters to the other side of L and R boundaries. <br><br></div><div style="font-family:arial,helvetica,sans-serif">Another idea would be to check out the algorithm in the ICU sources. Or to ask the lead ICU author if he could provide some references to the heuristics they used.<br><br></div><div style="font-family:arial,helvetica,sans-serif">Regards,<br></div><div style="font-family:arial,helvetica,sans-serif">Dov<br></div><div style="font-family:arial,helvetica,sans-serif"><br><br></div><div style="font-family:arial,helvetica,sans-serif"><br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Sat, Nov 14, 2015 at 4:18 AM, Hossein Khatoonabadi <span dir="ltr"><<a href="mailto:hkhatoonabadi@pdftron.com" target="_blank">hkhatoonabadi@pdftron.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div><div dir="ltr">Hi / Dorood,<div><br></div><div>I'm looking for a function that converts a visual context to a logical string using FiriBidi library. </div><div><br></div><div>I know that there is no standard algorithm for this, and there is no unique answer. However, ICU has a function that approximates logical from visual order. I've read the FiriBidi mailing list regarding this topic (from couple of years ago), but there was no acceptable conclusion/workaround at the time. </div><div><br></div><div>It has been years now since that discussion and I'm sure many like us are still looking for such a function. Does anyone have any idea?</div><div><br></div></div></div></div></blockquote></div></div></blockquote></div></div></div></div></div><br></div>