1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-10-27 20:34:16 +00:00

Xomw: Convert XomwLinkHolderArray

This commit is contained in:
gnosygnu 2017-02-20 08:48:31 -05:00
parent 7fe4ed59ac
commit dec8dbc713
6 changed files with 676 additions and 624 deletions

View File

@ -50,7 +50,7 @@ public class HashByInt {
int len = hash.Len(); int len = hash.Len();
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
HashByIntItem item = (HashByIntItem)hash.Get_at(i); HashByIntItem item = (HashByIntItem)hash.Get_at(i);
rv.Add(item.key, item); rv.Add(item.key, item.val);
} }
return rv; return rv;
} }

View File

@ -15,237 +15,134 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package gplx.xowa.mediawiki.includes.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.mediawiki.*; import gplx.xowa.mediawiki.includes.*; //namespace gplx.xowa.mediawiki.includes.parsers {
import gplx.langs.htmls.*; // using gplx.langs.htmls;
import gplx.xowa.mediawiki.includes.*; // using gplx.xowa.mediawiki.includes;
import gplx.xowa.mediawiki.includes.htmls.*; // using gplx.xowa.mediawiki.includes.htmls;
import gplx.xowa.mediawiki.includes.linkers.*; // using gplx.xowa.mediawiki.includes.linkers;
public class Xomw_link_holders { // public class Xomw_link_holders {
private final Xomw_link_renderer link_renderer; // private final Xomw_link_renderer link_renderer;
private final Bry_bfr tmp; // private final Bry_bfr tmp;
private int link_id = 0; // MOVED:Parser.php // private int link_id = 0; // MOVED:Parser.php
private final Xomw_link_holder_list internals = new Xomw_link_holder_list(); // private final XomwLinkHolderList internals = new XomwLinkHolderList();
private final Xomw_atr_mgr extra_atrs = new Xomw_atr_mgr(); // private final Xomw_atr_mgr extra_atrs = new Xomw_atr_mgr();
private final Xomw_qry_mgr query = new Xomw_qry_mgr(); // private final Xomw_qry_mgr query = new Xomw_qry_mgr();
public Xomw_link_holders(Xomw_link_renderer link_renderer, Bry_bfr tmp) { // public Xomw_link_holders(Xomw_link_renderer link_renderer, Bry_bfr tmp) {
this.link_renderer = link_renderer; // this.link_renderer = link_renderer;
this.tmp = tmp; // this.tmp = tmp;
} // }
public void Clear() { // public void Clear() {
internals.Clear(); // internals.Clear();
link_id = 0;
}
public void Make_holder(Bry_bfr bfr, XomwTitle nt, byte[] text, byte[][] query, byte[] trail, byte[] prefix) {
if (nt == null) {
// Fail gracefully
bfr.Add_str_a7("<!-- ERROR -->").Add(prefix).Add(text).Add(trail);
}
else {
// Separate the link trail from the rest of the link
// list( $inside, $trail ) = Linker::splitTrail( $trail );
byte[] inside = Bry_.Empty;
Xomw_link_holder_item entry = new Xomw_link_holder_item(nt, tmp.Add_bry_many(prefix, text, inside).To_bry_and_clear(), query);
boolean is_external = false; // $nt->isExternal()
if (is_external) {
// Use a globally unique ID to keep the objects mergable
// $key = $this->parent->nextLinkID();
// $this->interwikis[$key] = $entry;
// $retVal = "<!--IWLINK $key-->{$trail}";
}
else {
int key = link_id++;
internals.Add(key, entry);
bfr.Add(Bry__link__bgn).Add_int_variable(key).Add(Gfh_tag_.Comm_end).Add(trail); // "<!--LINK $ns:$key-->{$trail}";
}
}
}
public void Test__add(XomwTitle ttl, byte[] capt) {
int key = link_id++;
Xomw_link_holder_item item = new Xomw_link_holder_item(ttl, capt, Bry_.Ary_empty);
internals.Add(key, item);
}
public void Replace(Xomw_parser_ctx pctx, Xomw_parser_bfr pbfr) {
this.Replace_internal(pbfr);
// $this->replaceInterwiki( $text );
}
private void Replace_internal(Xomw_parser_bfr pbfr) {
if (internals.Len() == 0)
return;
// $colours = [];
// $linkCache = LinkCache::singleton();
// $output = $this->parent->getOutput();
// $linkRenderer = $this->parent->getLinkRenderer();
// $linkcolour_ids = [];
// SKIP:Replace_internals does db lookup to identify redlinks;
// Construct search and replace arrays
Bry_bfr src_bfr = pbfr.Src();
byte[] src = src_bfr.Bfr();
int src_bgn = 0;
int src_end = src_bfr.Len();
Bry_bfr bfr = pbfr.Trg();
pbfr.Switch();
int cur = src_bgn;
int prv = 0;
while (true) {
int link_bgn = Bry_find_.Find_fwd(src, Bry__link__bgn, cur, src_end);
if (link_bgn == Bry_find_.Not_found) {
bfr.Add_mid(src, prv, src_end);
break;
}
int key_bgn = link_bgn + Bry__link__bgn.length;
int key_end = Bry_find_.Find_fwd_while_num(src, key_bgn, src_end);
int link_key = Bry_.To_int_or(src, key_bgn, key_end, -1);
Xomw_link_holder_item item = internals.Get_by(link_key);
// $pdbk = $entry['pdbk'];
// $title = $entry['title'];
// $query = isset( $entry['query'] ) ? $entry['query'] : [];
// $key = "$ns:$index";
// $searchkey = "<!--LINK $key-->";
// $displayText = $entry['text'];
// if ( isset( $entry['selflink'] ) ) {
// $replacePairs[$searchkey] = Linker::makeSelfLinkObj( $title, $displayText, $query );
// continue;
// }
// if ( $displayText === '' ) {
// $displayText = null;
// } else {
// $displayText = new HtmlArmor( $displayText );
// }
// if ( !isset( $colours[$pdbk] ) ) {
// $colours[$pdbk] = 'new';
// }
// $attribs = [];
// if ( $colours[$pdbk] == 'new' ) {
// $linkCache->addBadLinkObj( $title );
// $output->addLink( $title, 0 );
// $link = $linkRenderer->makeBrokenLink(
// $title, $displayText, $attribs, $query
// );
// } else {
// $link = $linkRenderer->makePreloadedLink(
// $title, $displayText, $colours[$pdbk], $attribs, $query
// );
// }
bfr.Add_mid(src, prv, link_bgn);
link_renderer.Make_preloaded_link(bfr, item.Title(), item.Text(), Bry_.Empty, extra_atrs, query.Clear());
cur = key_end + Gfh_tag_.Comm_end_len;
prv = cur;
}
}
// private void Replace_internal__db() {
// // Generate query
// $lb = new LinkBatch();
// $lb->setCaller( __METHOD__ );
// //
// foreach ( $this->internals as $ns => $entries ) { // link_id = 0;
// foreach ( $entries as $entry ) { // }
// /** @var Title $title */ // public void Make_holder(Bry_bfr bfr, XomwTitle nt, byte[] text, byte[][] query, byte[] trail, byte[] prefix) {
// $title = $entry['title']; // if (nt == null) {
// $pdbk = $entry['pdbk']; // // Fail gracefully
// bfr.Add_str_a7("<!-- ERROR -->").Add(prefix).Add(text).Add(trail);
// }
// else {
// // Separate the link trail from the rest of the link
//// list( $inside, $trail ) = Linker::splitTrail( $trail );
// byte[] inside = Bry_.Empty;
// //
// # Skip invalid entries. // XomwLinkHolderItem entry = new XomwLinkHolderItem(nt, tmp.Add_bry_many(prefix, text, inside).To_bry_and_clear(), query);
// # Result will be ugly, but prevents crash.
// if ( is_null( $title ) ) {
// continue;
// }
// //
// # Check if it's a static known link, e.g. interwiki // boolean is_external = false; // $nt->isExternal()
// if ( $title->isAlwaysKnown() ) { // if (is_external) {
// $colours[$pdbk] = ''; // // Use a globally unique ID to keep the objects mergable
// } elseif ( $ns == NS_SPECIAL ) { //// $key = $this->parent->nextLinkID();
// $colours[$pdbk] = 'new'; //// $this->interwikis[$key] = $entry;
// } else { //// $retVal = "<!--IWLINK $key-->{$trail}";
// $id = $linkCache->getGoodLinkID( $pdbk );
// if ( $id != 0 ) {
// $colours[$pdbk] = $linkRenderer->getLinkClasses( $title );
// $output->addLink( $title, $id );
// $linkcolour_ids[$id] = $pdbk;
// } elseif ( $linkCache->isBadLink( $pdbk ) ) {
// $colours[$pdbk] = 'new';
// } else {
// # Not in the link cache, add it to the query
// $lb->addObj( $title );
// }
// }
// } // }
// } // else {
// if ( !$lb->isEmpty() ) { // int key = link_id++;
// $fields = array_merge( // internals.Add(key, entry);
// LinkCache::getSelectFields(), // bfr.Add(Bry__link__bgn).Add_int_variable(key).Add(Gfh_tag_.Comm_end).Add(trail); // "<!--LINK $ns:$key-->{$trail}";
// [ 'page_namespace', 'page_title' ]
// );
//
// $res = $dbr->select(
// 'page',
// $fields,
// $lb->constructSet( 'page', $dbr ),
// __METHOD__
// );
//
// # Fetch data and form into an associative array
// # non-existent = broken
// foreach ( $res as $s ) {
// $title = Title::makeTitle( $s->page_namespace, $s->page_title );
// $pdbk = $title->getPrefixedDBkey();
// $linkCache->addGoodLinkObjFromRow( $title, $s );
// $output->addLink( $title, $s->page_id );
// $colours[$pdbk] = $linkRenderer->getLinkClasses( $title );
// // add id to the extension todolist
// $linkcolour_ids[$s->page_id] = $pdbk;
// } // }
// unset( $res );
// }
// if ( count( $linkcolour_ids ) ) {
// // pass an array of page_ids to an extension
// Hooks::run( 'GetLinkColours', [ $linkcolour_ids, &$colours ] );
// }
//
// # Do a second query for different language variants of links and categories
// if ( $wgContLang->hasVariants() ) {
// $this->doVariants( $colours );
// } // }
// } // }
// public void Test__add(XomwTitle ttl, byte[] capt) {
private static final byte[] Bry__link__bgn = Bry_.new_a7("<!--LINK "); // int key = link_id++;
} // XomwLinkHolderItem item = new XomwLinkHolderItem(ttl, capt, Bry_.Ary_empty);
class Xomw_link_holder_list { // internals.Add(key, item);
private int ary_len = 0, ary_max = 128; // }
private Xomw_link_holder_item[] ary = new Xomw_link_holder_item[128]; // public void Replace(Xomw_parser_ctx pctx, Xomw_parser_bfr pbfr) {
public int Len() {return ary_len;} // this.Replace_internal(pbfr);
public void Clear() { //// $this->replaceInterwiki( $text );
ary_len = 0; // }
if (ary_max > 128) // private void Replace_internal(Xomw_parser_bfr pbfr) {
ary = new Xomw_link_holder_item[128]; // if (internals.Len() == 0)
} // return;
public void Add(int key, Xomw_link_holder_item item) { //
if (key >= ary_max) { //// $colours = [];
int new_max = ary_max * 2; //// $linkCache = LinkCache::singleton();
ary = (Xomw_link_holder_item[])Array_.Resize(ary, new_max); //// $output = $this->parent->getOutput();
ary_max = new_max; //// $linkRenderer = $this->parent->getLinkRenderer();
} //
ary[key] = item; //// $linkcolour_ids = [];
ary_len++; //
} // // SKIP:Replace_internals does db lookup to identify redlinks;
public Xomw_link_holder_item Get_by(int key) {return ary[key];} //
} // // Construct search and replace arrays
class Xomw_link_holder_item { // Bry_bfr src_bfr = pbfr.Src();
public Xomw_link_holder_item(XomwTitle title, byte[] text, byte[][] query) { // byte[] src = src_bfr.Bfr();
this.title = title; // int src_bgn = 0;
this.text = text; // int src_end = src_bfr.Len();
this.query = query; // Bry_bfr bfr = pbfr.Trg();
} // pbfr.Switch();
public XomwTitle Title() {return title;} private final XomwTitle title; //
public byte[] Text() {return text;} private final byte[] text; // int cur = src_bgn;
public byte[] Pdbk() {return title.getPrefixedDBkey();} // int prv = 0;
public byte[][] Query() {return query;} private final byte[][] query; // while (true) {
} // int link_bgn = Bry_find_.Find_fwd(src, Bry__link__bgn, cur, src_end);
// if (link_bgn == Bry_find_.Not_found) {
// bfr.Add_mid(src, prv, src_end);
// break;
// }
// int key_bgn = link_bgn + Bry__link__bgn.length;
// int key_end = Bry_find_.Find_fwd_while_num(src, key_bgn, src_end);
// int link_key = Bry_.To_int_or(src, key_bgn, key_end, -1);
// XomwLinkHolderItem item = internals.Get_by(link_key);
//
//// $pdbk = $entry['pdbk'];
//// $title = $entry['title'];
//// $query = isset( $entry['query'] ) ? $entry['query'] : [];
//// $key = "$ns:$index";
//// $searchkey = "<!--LINK $key-->";
//// $displayText = $entry['text'];
//// if ( isset( $entry['selflink'] ) ) {
//// $replacePairs[$searchkey] = Linker::makeSelfLinkObj( $title, $displayText, $query );
//// continue;
//// }
//// if ( $displayText === '' ) {
//// $displayText = null;
//// } else {
//// $displayText = new HtmlArmor( $displayText );
//// }
//// if ( !isset( $colours[$pdbk] ) ) {
//// $colours[$pdbk] = 'new';
//// }
//// $attribs = [];
//// if ( $colours[$pdbk] == 'new' ) {
//// $linkCache->addBadLinkObj( $title );
//// $output->addLink( $title, 0 );
//// $link = $linkRenderer->makeBrokenLink(
//// $title, $displayText, $attribs, $query
//// );
//// } else {
//// $link = $linkRenderer->makePreloadedLink(
//// $title, $displayText, $colours[$pdbk], $attribs, $query
//// );
//// }
//
// bfr.Add_mid(src, prv, link_bgn);
// link_renderer.Make_preloaded_link(bfr, item.Title(), item.Text(), Bry_.Empty, extra_atrs, query.Clear());
// cur = key_end + Gfh_tag_.Comm_end_len;
// prv = cur;
// }
// }
//
// private static final byte[] Bry__link__bgn = Bry_.new_a7("<!--LINK ");
// }
//}

View File

@ -26,7 +26,7 @@ public class Xomw_link_holders__tst {
} }
} }
class Xomw_link_holders__fxt { class Xomw_link_holders__fxt {
private final Xomw_link_holders holders = new Xomw_link_holders(new Xomw_link_renderer(new XomwSanitizer()), Bry_bfr_.New()); private final XomwLinkHolderArray holders = new XomwLinkHolderArray(new Xomw_parser());
private final Xomw_parser_bfr pbfr = new Xomw_parser_bfr(); private final Xomw_parser_bfr pbfr = new Xomw_parser_bfr();
private boolean apos = true; private boolean apos = true;
public Xomw_link_holders__fxt() { public Xomw_link_holders__fxt() {

View File

@ -33,7 +33,7 @@ public class Xomw_parser {
private final Xomw_magiclinks_wkr magiclinks_wkr; private final Xomw_magiclinks_wkr magiclinks_wkr;
private final Xomw_doubleunder_wkr doubleunder_wkr = new Xomw_doubleunder_wkr(); private final Xomw_doubleunder_wkr doubleunder_wkr = new Xomw_doubleunder_wkr();
private final Xomw_link_renderer link_renderer; private final Xomw_link_renderer link_renderer;
private final Xomw_link_holders holders; private final XomwLinkHolderArray holders;
private final Xomw_heading_cbk__html heading_wkr_cbk; private final Xomw_heading_cbk__html heading_wkr_cbk;
private final Btrie_slim_mgr protocols_trie; private final Btrie_slim_mgr protocols_trie;
private final Xomw_doubleunder_data doubleunder_data = new Xomw_doubleunder_data(); private final Xomw_doubleunder_data doubleunder_data = new Xomw_doubleunder_data();
@ -63,6 +63,23 @@ public class Xomw_parser {
} }
/**
* Get a LinkRenderer instance to make links with
*
* @since 1.28
* @return LinkRenderer
*/
public Xomw_link_renderer getLinkRenderer() {
// if ( !$this->mLinkRenderer ) {
// $this->mLinkRenderer = MediaWikiServices::getInstance()
// ->getLinkRendererFactory()->create();
// $this->mLinkRenderer->setStubThreshold(
// $this->getOptions()->getStubThreshold()
// );
// }
return link_renderer;
}
public Xomw_parser() { public Xomw_parser() {
if (regex_space == null) { if (regex_space == null) {
synchronized (Type_adp_.ClassOf_obj(this)) { synchronized (Type_adp_.ClassOf_obj(this)) {
@ -77,7 +94,7 @@ public class Xomw_parser {
this.link_renderer = new Xomw_link_renderer(sanitizer); this.link_renderer = new Xomw_link_renderer(sanitizer);
this.linker = new XomwLinker(link_renderer); this.linker = new XomwLinker(link_renderer);
this.protocols_trie = Xomw_parser.Protocols__dflt(); this.protocols_trie = Xomw_parser.Protocols__dflt();
this.holders = new Xomw_link_holders(link_renderer, tmp); this.holders = new XomwLinkHolderArray(this);
this.table_wkr = new Xomw_table_wkr(this); this.table_wkr = new Xomw_table_wkr(this);
this.quote_wkr = new Xomw_quote_wkr(this); this.quote_wkr = new Xomw_quote_wkr(this);
this.lnke_wkr = new Xomw_lnke_wkr(this); this.lnke_wkr = new Xomw_lnke_wkr(this);

View File

@ -37,7 +37,7 @@ import gplx.xowa.parsers.uniqs.*;
* P1: link_prefix; EX: b[[A]]; [not enabled on enwiki] * P1: link_prefix; EX: b[[A]]; [not enabled on enwiki]
*/ */
public class Xomw_lnki_wkr {// THREAD.UNSAFE: caching for repeated calls public class Xomw_lnki_wkr {// THREAD.UNSAFE: caching for repeated calls
private final Xomw_link_holders holders; private final XomwLinkHolderArray holders;
private final XomwLinker linker; private final XomwLinker linker;
private final Xomw_link_renderer link_renderer; private final Xomw_link_renderer link_renderer;
// private final Btrie_slim_mgr protocols_trie; // private final Btrie_slim_mgr protocols_trie;
@ -55,7 +55,7 @@ public class Xomw_lnki_wkr {// THREAD.UNSAFE: caching for repeated calls
private final List_adp tmp_list = List_adp_.New(); private final List_adp tmp_list = List_adp_.New();
private final Hash_adp mImageParams = Hash_adp_bry.cs(); private final Hash_adp mImageParams = Hash_adp_bry.cs();
private final Hash_adp mImageParamsMagicArray = Hash_adp_bry.cs(); private final Hash_adp mImageParamsMagicArray = Hash_adp_bry.cs();
public Xomw_lnki_wkr(Xomw_parser parser, Xomw_link_holders holders, Xomw_link_renderer link_renderer, Btrie_slim_mgr protocols_trie) { public Xomw_lnki_wkr(Xomw_parser parser, XomwLinkHolderArray holders, Xomw_link_renderer link_renderer, Btrie_slim_mgr protocols_trie) {
this.parser = parser; this.parser = parser;
this.holders = holders; this.holders = holders;
this.link_renderer = link_renderer; this.link_renderer = link_renderer;
@ -77,7 +77,7 @@ public class Xomw_lnki_wkr {// THREAD.UNSAFE: caching for repeated calls
} }
} }
public void Clear_state() { public void Clear_state() {
holders.Clear(); holders.clear();
} }
public void Replace_internal_links(Xomw_parser_ctx pctx, Xomw_parser_bfr pbfr) { public void Replace_internal_links(Xomw_parser_ctx pctx, Xomw_parser_bfr pbfr) {
// XO.PBFR // XO.PBFR
@ -440,11 +440,11 @@ public class Xomw_lnki_wkr {// THREAD.UNSAFE: caching for repeated calls
} }
else { else {
// Links will be added to the output link list after checking // Links will be added to the output link list after checking
holders.Make_holder(bfr, nt, text, Bry_.Ary_empty, trail, prefix); holders.makeHolder(bfr, nt, text, Bry_.Ary_empty, trail, prefix);
} }
} }
} }
public void makeImage(Xomw_parser_ctx pctx, Bry_bfr bfr, XomwTitle title, byte[] options_at_link, Xomw_link_holders holders) { public void makeImage(Xomw_parser_ctx pctx, Bry_bfr bfr, XomwTitle title, byte[] options_at_link, XomwLinkHolderArray holders) {
// Check if the options text is of the form "options|alt text" // Check if the options text is of the form "options|alt text"
// Options are: // Options are:
// * thumbnail make a thumbnail with enlarge-icon and caption, alignment depends on lang // * thumbnail make a thumbnail with enlarge-icon and caption, alignment depends on lang