From dc87cdcb5ea877103f252f1b4090901c4cabff14 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Fri, 24 Feb 2017 08:38:12 -0500 Subject: [PATCH] Xomw: Convert XomwLinkRenderer --- .../xowa/mediawiki/includes/XomwLinker.java | 14 +- .../mediawiki/includes/htmls/XomwHtml.java | 2 +- .../includes/linkers/Xomw_link_renderer.java | 402 +++++++++++++++--- .../includes/parsers/XomwLinkHolderArray.java | 2 +- .../includes/parsers/lnkis/Xomw_lnki_wkr.java | 2 +- 5 files changed, 344 insertions(+), 78 deletions(-) diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwLinker.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwLinker.java index 9076f312a..b18e51c8c 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwLinker.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/XomwLinker.java @@ -146,16 +146,16 @@ public class XomwLinker { text = html; // null } if (options.known) { - link_renderer.Make_known_link(bfr, target, text, custom_attribs, query); + link_renderer.makeKnownLink(bfr, target, text, custom_attribs, query); } else if (options.broken) { - link_renderer.Make_broken_link(bfr, target, text, custom_attribs, query); + link_renderer.makeBrokenLink(bfr, target, text, custom_attribs, query); } else if (options.no_classes) { - link_renderer.Make_preloaded_link(bfr, target, text, Bry_.Empty, custom_attribs, query); + link_renderer.makePreloadedLink(bfr, target, text, Bry_.Empty, custom_attribs, query); } else { - link_renderer.Make_link(bfr, target, text, Bry_.Empty, custom_attribs, query); + link_renderer.makeLink(bfr, target, text, custom_attribs, query); } } @@ -646,14 +646,14 @@ public class XomwLinker { zoom_icon = Bry_.Empty; } else { - html_utl.Raw_element(tmp, Gfh_tag_.Bry__a + html_utl.rawElement(tmp, Gfh_tag_.Bry__a , tmp_attribs.Clear() .Add(Gfh_atr_.Bry__href , url) .Add(Gfh_atr_.Bry__class, Class__internal) .Add(Gfh_atr_.Bry__title, XomwGlobalFunctions.wfMessage(env, "thumbnail-more").text()) , Bry_.Empty); byte[] zoom_anch = tmp.To_bry_and_clear(); - html_utl.Raw_element(tmp, Gfh_tag_.Bry__div, tmp_attribs.Clear().Add(Gfh_atr_.Bry__class, Class__magnify), zoom_anch); + html_utl.rawElement(tmp, Gfh_tag_.Bry__div, tmp_attribs.Clear().Add(Gfh_atr_.Bry__class, Class__magnify), zoom_anch); zoom_icon = tmp.To_bry_and_clear(); } } @@ -890,7 +890,7 @@ public class XomwLinker { // XO.MW.HOOK:LinkerMakeExternalLink attribs.Set(Atr__href, url); - html_utl.Raw_element(bfr, Bry_.new_a7("a"), attribs, text); + html_utl.rawElement(bfr, Bry_.new_a7("a"), attribs, text); } // XO.MW: MW puts this function in Parser.php private byte[] getExternalLinkRel(byte[] url, byte[] title) { diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/htmls/XomwHtml.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/htmls/XomwHtml.java index 7ae040967..1c1c0cee6 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/htmls/XomwHtml.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/htmls/XomwHtml.java @@ -18,7 +18,7 @@ import gplx.core.btries.*; public class XomwHtml { private final Bry_bfr tmp = Bry_bfr_.New(); private final Btrie_rv trv = new Btrie_rv(); - public void Raw_element(Bry_bfr bfr, byte[] element, Xomw_atr_mgr attribs, byte[] contents) { + public void rawElement(Bry_bfr bfr, byte[] element, Xomw_atr_mgr attribs, byte[] contents) { Bry_.Lcase__all(element); // XO:lcase element Open_element__lcased(bfr, element, attribs); diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/linkers/Xomw_link_renderer.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/linkers/Xomw_link_renderer.java index 938a3563e..e40e4dc3d 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/linkers/Xomw_link_renderer.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/linkers/Xomw_link_renderer.java @@ -18,90 +18,304 @@ import gplx.langs.htmls.*; import gplx.xowa.mediawiki.includes.htmls.*; /* TODO.XO * P7: $html = HtmlArmor::getHtml($text); - * P3: Get_link_url [alternate urls? EX: mw/wiki/index.php/title?] + * P3: getLinkUrl [alternate urls? EX: mw/wiki/index.php/title?] * P2: titleFormatter->getPrefixedText [depends on redlinks] - * P1: Get_link_classes [depends on redlinks] + * P1: getLinkClasses [depends on redlinks] +*/ +/** +* Class that generates HTML links for pages. +* +* @see https://www.mediawiki.org/wiki/Manual:LinkRenderer +* @since 1.28 */ public class Xomw_link_renderer { - private boolean expand_urls = false; - private final XomwHtml html_utl = new XomwHtml(); + /** + * Whether to force the pretty article path + * + * @var boolean + */ + private boolean forceArticlePath = false; + + /** + * A PROTO_* constant or false + * + * @var String|boolean|int + */ + private boolean expandUrls = false; + + /** + * @var int + */ + private int stubThreshold = 0; + + /** + * @var TitleFormatter + */ +// private $titleFormatter; + + /** + * @var LinkCache + */ +// private $linkCache; + + /** + * Whether to run the legacy Linker hooks + * + * @var boolean + */ +// private boolean runLegacyBeginHook = true; + + private final XomwHtml html = new XomwHtml(); private final Xomw_atr_mgr attribs = new Xomw_atr_mgr(); private final List_adp tmp_merge_deleted = List_adp_.New(); private final XomwSanitizer sanitizer; - public Xomw_link_renderer(XomwSanitizer sanitizer) { +// /** +// * @param TitleFormatter $titleFormatter +// * @param LinkCache $linkCache +// */ + public Xomw_link_renderer(XomwSanitizer sanitizer) { // TitleFormatter $titleFormatter, LinkCache $linkCache +// this.titleFormatter = $titleFormatter; +// this.linkCache = $linkCache; this.sanitizer = sanitizer; } - // XO.MW:SYNC:1.29; DATE:2017-01-31 - public void Make_link(Bry_bfr bfr, XomwTitle target, byte[] text, byte[] classes, Xomw_atr_mgr extra_atrs, Xomw_qry_mgr query) { + + /** + * @param boolean $force + */ + public void setForceArticlePath(boolean force) { + this.forceArticlePath = force; + } + + /** + * @return boolean + */ + public boolean getForceArticlePath() { + return this.forceArticlePath; + } + + /** + * @param String|boolean|int $expand A PROTO_* constant or false + */ + public void setExpandURLs(boolean expand) { + this.expandUrls = expand; + } + + /** + * @return String|boolean|int a PROTO_* constant or false + */ + public boolean getExpandURLs() { + return this.expandUrls; + } + + /** + * @param int $threshold + */ + public void setStubThreshold(int threshold) { + this.stubThreshold = threshold; + } + + /** + * @return int + */ + public int getStubThreshold() { + return this.stubThreshold; + } + + /** + * @param boolean $run + */ +// public void setRunLegacyBeginHook(boolean run) { +// this.runLegacyBeginHook = run; +// } + + /** + * @param LinkTarget $target + * @param String|HtmlArmor|null $text + * @param array $extraAttribs + * @param array $query + * @return String + */ + public void makeLink(Bry_bfr bfr, + XomwTitle target, byte[] text, Xomw_atr_mgr extraAttribs, Xomw_qry_mgr query) { +// $title = Title::newFromLinkTarget($target); // does db lookup? if (target.isKnown()) { - this.Make_known_link(bfr, target, text, extra_atrs, query); + this.makeKnownLink(bfr, target, text, extraAttribs, query); } else { - this.Make_broken_link(bfr, target, text, extra_atrs, query); + this.makeBrokenLink(bfr, target, text, extraAttribs, query); } } - // If you have already looked up the proper CSS classes using LinkRenderer::getLinkClasses() - // or some other method, use this to avoid looking it up again. - // XO.MW:SYNC:1.29; DATE:2017-01-31 - public void Make_preloaded_link(Bry_bfr bfr, XomwTitle target, byte[] text, byte[] classes, Xomw_atr_mgr extra_atrs, Xomw_qry_mgr query) { - // XO.MW.HOOK: $this->runBeginHook --> 'HtmlPageLinkRendererBegin', 'LinkBegin' + /** + * Get the options in the legacy format + * + * @param boolean $isKnown Whether the link is known or broken + * @return array + */ +// private function getLegacyOptions($isKnown) { +// $options = [ 'stubThreshold' => this.stubThreshold ]; +// if (this.forceArticlePath) { +// $options[] = 'forcearticlepath'; +// } +// if (this.expandUrls === PROTO_HTTP) { +// $options[] = 'http'; +// } elseif (this.expandUrls === PROTO_HTTPS) { +// $options[] = 'https'; +// } +// +// $options[] = $isKnown ? 'known' : 'broken'; +// +// return $options; +// } +// +// private function runBeginHook(LinkTarget $target, &$text, &$extraAttribs, &$query, $isKnown) { +// $ret = null; +// if (!Hooks::run('HtmlPageLinkRendererBegin', +// [ $this, $target, &$text, &$extraAttribs, &$query, &$ret ]) +// ) { +// return $ret; +// } +// +// // Now run the legacy hook +// return this.runLegacyBeginHook($target, $text, $extraAttribs, $query, $isKnown); +// } +// +// private function runLegacyBeginHook(LinkTarget $target, &$text, &$extraAttribs, &$query, +// $isKnown +// ) { +// if (!this.runLegacyBeginHook || !Hooks::isRegistered('LinkBegin')) { +// // Disabled, or nothing registered +// return null; +// } +// +// $realOptions = $options = this.getLegacyOptions($isKnown); +// $ret = null; +// $dummy = new DummyLinker(); +// $title = Title::newFromLinkTarget($target); +// if ($text !== null) { +// $realHtml = $html = HtmlArmor::getHtml($text); +// } else { +// $realHtml = $html = null; +// } +// if (!Hooks::run('LinkBegin', +// [ $dummy, $title, &$html, &$extraAttribs, &$query, &$options, &$ret ]) +// ) { +// return $ret; +// } +// +// if ($html !== null && $html !== $realHtml) { +// // &$html was modified, so re-armor it as $text +// $text = new HtmlArmor($html); +// } +// +// // Check if they changed any of the options, hopefully not! +// if ($options !== $realOptions) { +// $factory = MediaWikiServices::getInstance()->getLinkRendererFactory(); +// // They did, so create a separate instance and have that take over the rest +// $newRenderer = $factory->createFromLegacyOptions($options); +// // Don't recurse the hook... +// $newRenderer->setRunLegacyBeginHook(false); +// if (in_array('known', $options, true)) { +// return $newRenderer->makeKnownLink($title, $text, $extraAttribs, $query); +// } elseif (in_array('broken', $options, true)) { +// return $newRenderer->makeBrokenLink($title, $text, $extraAttribs, $query); +// } else { +// return $newRenderer->makeLink($title, $text, $extraAttribs, $query); +// } +// } +// +// return null; +// } - target = Normalize_target(target); - byte[] url = Get_link_url(target, query); + /** + * If you have already looked up the proper CSS classes using LinkRenderer::getLinkClasses() + * or some other method, use this to avoid looking it up again. + * + * @param LinkTarget $target + * @param String|HtmlArmor|null $text + * @param String $classes CSS classes to add + * @param array $extraAttribs + * @param array $query + * @return String + */ + public void makePreloadedLink(Bry_bfr bfr, + XomwTitle target, byte[] text, byte[] classes, Xomw_atr_mgr extraAttribs, Xomw_qry_mgr query) { + // XO.MW.HOOK: this.runBeginHook --> 'HtmlPageLinkRendererBegin', 'LinkBegin' + + target = this.normalizeTarget(target); + byte[] url = this.getLinkUrl(target, query); attribs.Clear(); attribs.Add(Gfh_atr_.Bry__href, url); // XO.MW: add url 1st; MW does attribs["url", url] + attribs + extra_attribs - if (classes.length > 0) // XO.MW:do not bother adding if empty + if (classes.length > 0) // XO.MW: do not bother adding if empty attribs.Add(Gfh_atr_.Bry__class, classes); byte[] prefixed_text = target.getPrefixedText(); if (prefixed_text != Bry_.Empty) { attribs.Add(Gfh_atr_.Bry__title, prefixed_text); } - Merge_attribs(attribs, extra_atrs); + this.mergeAttribs(attribs, extraAttribs); // XO.MW: changed to not always create another array if (text == null) { - text = this.Get_link_text(target); + text = this.getLinkText(target); } - Build_a_element(bfr, target,text, attribs, true); - } - - // XO.MW:SYNC:1.29; DATE:2017-01-31 - public void Make_known_link(Bry_bfr bfr, XomwTitle target, byte[] text, Xomw_atr_mgr extra_atrs, Xomw_qry_mgr query) { + this.buildAElement(bfr, target, text, attribs, true); + } + + /** + * @param LinkTarget $target + * @param String|HtmlArmor|null $text + * @param array $extraAttribs + * @param array $query + * @return String + */ + public void makeKnownLink(Bry_bfr bfr, + XomwTitle target, byte[] text, Xomw_atr_mgr extraAttribs, Xomw_qry_mgr query) { byte[] classes = Bry_.Empty; if (target.isExternal()) { classes = Bry__classes__extiw; } - byte[] colour = Get_link_classes(target); + byte[] colour = this.getLinkClasses(target); if (colour != Bry_.Empty) { - classes = Bry_.Add(classes, Byte_ascii.Space_bry, colour); + classes = Bry_.Add(classes, Byte_ascii.Space_bry, colour); // XO.MW: also does "$classes ? implode(' ', $classes) : ''," } - Make_preloaded_link(bfr, target, text, classes, extra_atrs, query); + this.makePreloadedLink(bfr, + target, + text, + classes, + extraAttribs, + query); } - // XO.MW:SYNC:1.29; DATE:2017-01-31 - public void Make_broken_link(Bry_bfr bfr, XomwTitle target, byte[] text, Xomw_atr_mgr extra_atrs, Xomw_qry_mgr query) { + + /** + * @param LinkTarget $target + * @param String|HtmlArmor|null $text + * @param array $extraAttribs + * @param array $query + * @return String + */ + public void makeBrokenLink(Bry_bfr bfr, + XomwTitle target, byte[] text, Xomw_atr_mgr extraAttribs, Xomw_qry_mgr query) { // XO.MW.HOOK: Run legacy hook // We don't want to include fragments for broken links, because they // generally make no sense. if (target.hasFragment()) { - target = target.createFragmentTarget(target.getFragment()); + target = target.createFragmentTarget(Bry_.Empty); } - target = Normalize_target(target); + target = this.normalizeTarget(target); - if (query.action == null && target.getNamespace() != XomwDefines.NS_SPECIAL) { - query.action = Bry_.new_a7("edit"); + if (!XophpUtility.isset(query.action) && target.getNamespace() != XomwDefines.NS_SPECIAL) { + query.action = Bry__action__edit; query.redlink = 1; } - byte[] url = Get_link_url(target, query); + byte[] url = this.getLinkUrl(target, query); attribs.Clear(); - attribs.Add(Gfh_atr_.Bry__href, url); // $attribs = ['href' => $url,] + $this->mergeAttribs($attribs, $extraAttribs); - attribs.Add(Gfh_atr_.Bry__class, Bry_.new_a7("new")); - Merge_attribs(attribs, extra_atrs); + attribs.Add(Gfh_atr_.Bry__href, url); // $attribs = ['href' => $url,] + this.mergeAttribs($attribs, $extraAttribs); + attribs.Add(Gfh_atr_.Bry__class, Bry__class__new); -// $prefixedText = $this->titleFormatter->getPrefixedText($target); +// $prefixedText = this.titleFormatter->getPrefixedText($target); // if ($prefixedText !== '') { // // This ends up in parser cache! // $attribs['title'] = wfMessage('red-link-title', $prefixedText) @@ -109,25 +323,41 @@ public class Xomw_link_renderer { // ->text(); // } + this.mergeAttribs(attribs, extraAttribs); + if (text == null) { - text = Get_link_text(target); + text = this.getLinkText(target); } - Build_a_element(bfr, target, text, attribs, false); + this.buildAElement(bfr, target, text, attribs, false); } - // XO.MW:SYNC:1.29; DATE:2017-01-31 - private void Build_a_element(Bry_bfr bfr, XomwTitle target, byte[] text, Xomw_atr_mgr attribs, boolean is_known) { + + /** + * Builds the final element + * + * @param LinkTarget $target + * @param String|HtmlArmor $text + * @param array $attribs + * @param boolean $isKnown + * @return null|String + */ + private void buildAElement(Bry_bfr bfr, XomwTitle target, byte[] text, Xomw_atr_mgr attribs, boolean isKnown) { // XO.MW.HOOK:HtmlPageLinkRendererEnd - byte[] html = text; + byte[] htmlBry = text; // $html = HtmlArmor::getHtml($text); // XO.MW.HOOK:LinkEnd - html_utl.Raw_element(bfr, Gfh_tag_.Bry__a, attribs, html); + html.rawElement(bfr, Gfh_tag_.Bry__a, attribs, htmlBry); } + + /** + * @param LinkTarget $target + * @return String non-escaped text + */ // XO.MW:SYNC:1.29; DATE:2017-01-31 - private byte[] Get_link_text(XomwTitle target) { + private byte[] getLinkText(XomwTitle target) { byte[] prefixed_text = target.getPrefixedText(); // If the target is just a fragment, with no title, we return the fragment // text. Otherwise, we return the title text itself. @@ -136,41 +366,65 @@ public class Xomw_link_renderer { } return prefixed_text; } - private byte[] Get_link_url(XomwTitle target, Xomw_qry_mgr query) { - // TODO: Use a LinkTargetResolver service instead of Title -// if ($this->forceArticlePath) { + private byte[] getLinkUrl(XomwTitle target, Xomw_qry_mgr query) { + // TODO: Use a LinkTargetResolver service instead of Title +// $title = Title::newFromLinkTarget($target); +// if (this.forceArticlePath) { // $realQuery = $query; // $query = []; // } // else { // $realQuery = []; // } - byte[] url = target.getLinkURL(query, false, expand_urls); + byte[] url = target.getLinkURL(query, false, this.expandUrls); -// if ($this->forceArticlePath && $realQuery) { +// if (this.forceArticlePath && $realQuery) { // $url = wfAppendQuery($url, $realQuery); // } return url; } - // XO.MW:SYNC:1.29; DATE:2017-01-31 - private XomwTitle Normalize_target(XomwTitle target) { + + /** + * Normalizes the provided target + * + * @todo move the code from Linker actually here + * @param LinkTarget $target + * @return LinkTarget + */ + private XomwTitle normalizeTarget(XomwTitle target) { return XomwLinker.normaliseSpecialPage(target); } - // XO.MW:SYNC:1.29; DATE:2017-02-01 - private void Merge_attribs(Xomw_atr_mgr src, Xomw_atr_mgr trg) { - // XO.MW: ignore; src is always non-null and empty; if trg exists, it will be merged below - // if (!$attribs) {return $defaults;} + + /** + * Merges two sets of attributes + * + * @param array $defaults + * @param array $attribs + * + * @return array + */ + private void mergeAttribs(Xomw_atr_mgr defaults, Xomw_atr_mgr attribs) { + // XO.MW: ignore; defaults is always non-null and empty; if attribs exists, it will be merged below + // if (!$attribs) { + // return $defaults; + // } // Merge the custom attribs with the default ones, and iterate // over that, deleting all "false" attributes. - sanitizer.mergeAttributes(src, trg); + sanitizer.mergeAttributes(defaults, attribs); - // XO.MW:MW removes "false" values; XO removes "null" values + // XO.MW.PORTED.BGN:MW removes "false" values; XO removes "null" values + // foreach ($merged as $key => $val) { + // # A false value suppresses the attribute + // if ($val !== false) { + // $ret[$key] = $val; + // } + // } boolean deleted = false; - int len = trg.Len(); + int len = attribs.Len(); for (int i = 0; i < len; i++) { - Xomw_atr_itm trg_atr = trg.Get_at(i); + Xomw_atr_itm trg_atr = attribs.Get_at(i); // A false value suppresses the attribute if (trg_atr.Val() == null) { tmp_merge_deleted.Add(trg_atr); @@ -180,26 +434,34 @@ public class Xomw_link_renderer { if (deleted) { len = tmp_merge_deleted.Len(); for (int i = 0; i < len; i++) { - Xomw_atr_itm atr = (Xomw_atr_itm)trg.Get_at(i); - trg.Del(atr.Key_bry()); + Xomw_atr_itm atr = (Xomw_atr_itm)attribs.Get_at(i); + attribs.Del(atr.Key_bry()); } tmp_merge_deleted.Clear(); } + // XO.MW.PORTED.END } - public byte[] Get_link_classes(XomwTitle target) { + + /** + * Return the CSS classes of a known link + * + * @param LinkTarget $target + * @return String CSS class + */ + public byte[] getLinkClasses(XomwTitle target) { // Make sure the target is in the cache -// $id = $this->linkCache->addLinkObj($target); +// $id = this.linkCache->addLinkObj($target); // if ($id == 0) { // // Doesn't exist // return ''; // } -// if ($this->linkCache->getGoodLinkFieldObj($target, 'redirect')) { +// if (this.linkCache->getGoodLinkFieldObj($target, 'redirect')) { // Page is a redirect // return 'mw-redirect'; // } -// elseif ($this->stubThreshold > 0 && XomwNamespace::isContent($target->getNamespace()) -// && $this->linkCache->getGoodLinkFieldObj($target, 'length') < $this->stubThreshold +// elseif (this.stubThreshold > 0 && XomwNamespace::isContent($target->getNamespace()) +// && this.linkCache->getGoodLinkFieldObj($target, 'length') < this.stubThreshold // ) { // Page is a stub // return 'stub'; @@ -207,5 +469,9 @@ public class Xomw_link_renderer { return Bry_.Empty; } - private static final byte[] Bry__classes__extiw = Bry_.new_a7("extiw"); + private static final byte[] + Bry__classes__extiw = Bry_.new_a7("extiw") + , Bry__class__new = Bry_.new_a7("new") + , Bry__action__edit = Bry_.new_a7("edit") + ; } diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/parsers/XomwLinkHolderArray.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/parsers/XomwLinkHolderArray.java index e133b96f4..bbba14df5 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/parsers/XomwLinkHolderArray.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/parsers/XomwLinkHolderArray.java @@ -422,7 +422,7 @@ public class XomwLinkHolderArray { // } // } bfr.Add_mid(src, prv, link_bgn); - linkRenderer.Make_preloaded_link(bfr, item.Title(), item.Text(), Bry_.Empty, extraAtrs, query.Clear()); + linkRenderer.makePreloadedLink(bfr, item.Title(), item.Text(), Bry_.Empty, extraAtrs, query.Clear()); cur = key_end + Gfh_tag_.Comm_end_len; prv = cur; } diff --git a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/parsers/lnkis/Xomw_lnki_wkr.java b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/parsers/lnkis/Xomw_lnki_wkr.java index 30def1c90..216a9ec66 100644 --- a/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/parsers/lnkis/Xomw_lnki_wkr.java +++ b/gplx.xowa.mediawiki/src/gplx/xowa/mediawiki/includes/parsers/lnkis/Xomw_lnki_wkr.java @@ -814,7 +814,7 @@ public class Xomw_lnki_wkr {// THREAD.UNSAFE: caching for repeated calls tmp.Add_bry_escape_html(inside); text = tmp.To_bry_and_clear(); - link_renderer.Make_known_link(bfr, nt, text, extra_atrs, query); + link_renderer.makeKnownLink(bfr, nt, text, extra_atrs, query); byte[] link = bfr.To_bry_and_clear(); parser.armorLinks(bfr, link, 0, link.length); bfr.Add(trail);