diff --git a/400_xowa/src/gplx/xowa/mws/parsers/Xomw_parser.java b/400_xowa/src/gplx/xowa/mws/parsers/Xomw_parser.java index 70de20239..acb205e42 100644 --- a/400_xowa/src/gplx/xowa/mws/parsers/Xomw_parser.java +++ b/400_xowa/src/gplx/xowa/mws/parsers/Xomw_parser.java @@ -21,6 +21,7 @@ import gplx.xowa.mws.parsers.prepros.*; import gplx.xowa.mws.parsers.headings.*; import gplx.xowa.mws.parsers.quotes.*; import gplx.xowa.mws.parsers.tables.*; import gplx.xowa.mws.parsers.hrs.*; import gplx.xowa.mws.parsers.nbsps.*; import gplx.xowa.mws.parsers.lnkes.*; import gplx.xowa.mws.parsers.lnkis.*; import gplx.xowa.mws.parsers.magiclinks.*; import gplx.xowa.mws.parsers.doubleunders.*; import gplx.xowa.mws.utls.*; import gplx.xowa.mws.linkers.*; +import gplx.xowa.mws.htmls.*; public class Xomw_parser { private final Xomw_parser_ctx pctx = new Xomw_parser_ctx(); private final Xomw_table_wkr table_wkr; @@ -55,6 +56,8 @@ public class Xomw_parser { regex_space = new Xomw_regex_space(); regex_boundary = new Xomw_regex_boundary(regex_space); regex_url = new Xomw_regex_url(regex_space); + Atr__rel = Bry_.new_a7("rel"); + Get_external_link_rel = Bry_.new_a7("nofollow"); } } @@ -65,7 +68,7 @@ public class Xomw_parser { this.lnke_wkr = new Xomw_lnke_wkr(this); this.lnki_wkr = new Xomw_lnki_wkr(this, holders, link_renderer, protocols_trie); this.heading_wkr_cbk = new Xomw_heading_cbk__html(); - this.magiclinks_wkr = new Xomw_magiclinks_wkr(sanitizer, linker, regex_boundary, regex_url); + this.magiclinks_wkr = new Xomw_magiclinks_wkr(this, sanitizer, linker, regex_boundary, regex_url); } public void Init_by_wiki(Xowe_wiki wiki) { linker.Init_by_wiki(wiki.Lang().Lnki_trail_mgr().Trie()); @@ -263,6 +266,19 @@ public class Xomw_parser { strip_state.Add_general(marker, text); return marker; } + public Xomwh_atr_mgr Get_external_link_attribs(Xomwh_atr_mgr atrs) { + atrs.Clear(); + byte[] rel = Get_external_link_rel; + + // XO.MW.UNSUPPORTED: XO will assume target is blank; MW will set target of "_blank", "_self", etc. depending on global opt + // $target = $this->mOptions->getExternalLinkTarget(); + atrs.Add(Atr__rel, rel); + return atrs; + } + // XO.MW.UNSUPPORTED: XO will always assume "nofollow"; MW will return "nofollow" if (a) ns is in ns-exception list or (b) domain is in domain-exception list; + // if ($wgNoFollowLinks && !in_array($ns, $wgNoFollowNsExceptions) && !wfMatchesDomainList($url, $wgNoFollowDomainExceptions) + public byte[] Get_external_link_rel; + private static byte[] Atr__rel; private static final byte[] Bry__strip_state_item = Bry_.new_a7("-item-"), Bry__noparse = Bry_.new_a7("NOPARSE"); private static final byte[] Bry__marker__noparse = Bry_.Add(Xomw_strip_state.Bry__marker__bgn, Bry__noparse); public static Btrie_slim_mgr Protocols__dflt() { diff --git a/400_xowa/src/gplx/xowa/mws/parsers/lnkes/Xomw_lnke_wkr.java b/400_xowa/src/gplx/xowa/mws/parsers/lnkes/Xomw_lnke_wkr.java index 78e3f911b..433eedc5a 100644 --- a/400_xowa/src/gplx/xowa/mws/parsers/lnkes/Xomw_lnke_wkr.java +++ b/400_xowa/src/gplx/xowa/mws/parsers/lnkes/Xomw_lnke_wkr.java @@ -24,13 +24,15 @@ public class Xomw_lnke_wkr {// THREAD.UNSAFE: caching for repeated calls private final Bry_bfr tmp; private Btrie_slim_mgr protocol_trie; private final Btrie_rv trv = new Btrie_rv(); private int autonumber; + private final Xomw_parser parser; private final Xomw_linker linker; private final Xomwh_atr_mgr attribs = new Xomwh_atr_mgr(); private Xomw_regex_url regex_url; private Xomw_regex_space regex_space; - public Xomw_lnke_wkr(Xomw_parser mgr) { - this.tmp = mgr.Tmp(); - this.linker = mgr.Linker(); + public Xomw_lnke_wkr(Xomw_parser parser) { + this.parser = parser; + this.tmp = parser.Tmp(); + this.linker = parser.Linker(); } public void Init_by_wiki(Btrie_slim_mgr protocol_trie, Xomw_regex_url regex_url, Xomw_regex_space regex_space) { this.protocol_trie = protocol_trie; @@ -187,9 +189,7 @@ public class Xomw_lnke_wkr {// THREAD.UNSAFE: caching for repeated calls // This means that users can paste URLs directly into the text // Funny characters like � aren't valid in URLs anyway // This was changed in August 2004 - // TODO.XO:getExternalLinkAttribs - attribs.Clear(); - linker.Make_external_link(bfr, Bry_.Mid(src, url_bgn, url_end), Bry_.Mid(src, text_bgn, text_end), Bool_.N, link_type, attribs, Bry_.Empty); + linker.Make_external_link(bfr, Bry_.Mid(src, url_bgn, url_end), Bry_.Mid(src, text_bgn, text_end), Bool_.N, link_type, parser.Get_external_link_attribs(attribs), Bry_.Empty); // Register link in the output Object. // Replace unnecessary URL escape codes with the referenced character @@ -198,36 +198,6 @@ public class Xomw_lnke_wkr {// THREAD.UNSAFE: caching for repeated calls // $this->mOutput->addExternalLink( $pasteurized ); } } -// public function getExternalLinkAttribs( $url ) { -// $attribs = []; -// $rel = self::getExternalLinkRel( $url, $this->mTitle ); -// -// $target = $this->mOptions->getExternalLinkTarget(); -// if ( $target ) { -// $attribs['target'] = $target; -// if ( !in_array( $target, [ '_self', '_parent', '_top' ] ) ) { -// // T133507. New windows can navigate parent cross-origin. -// // Including noreferrer due to lacking browser -// // support of noopener. Eventually noreferrer should be removed. -// if ( $rel !== '' ) { -// $rel .= ' '; -// } -// $rel .= 'noreferrer noopener'; -// } -// } -// $attribs['rel'] = $rel; -// return $attribs; -// } -// public static function getExternalLinkRel( $url = false, $title = null ) { -// global $wgNoFollowLinks, $wgNoFollowNsExceptions, $wgNoFollowDomainExceptions; -// $ns = $title ? $title->getNamespace() : false; -// if ( $wgNoFollowLinks && !in_array( $ns, $wgNoFollowNsExceptions ) -// && !wfMatchesDomainList( $url, $wgNoFollowDomainExceptions ) -// ) { -// return 'nofollow'; -// } -// return null; -// } private static final byte[] Link_type__free = Bry_.new_a7("free") diff --git a/400_xowa/src/gplx/xowa/mws/parsers/magiclinks/Xomw_magiclinks_wkr.java b/400_xowa/src/gplx/xowa/mws/parsers/magiclinks/Xomw_magiclinks_wkr.java index 63c459f03..83f1aa024 100644 --- a/400_xowa/src/gplx/xowa/mws/parsers/magiclinks/Xomw_magiclinks_wkr.java +++ b/400_xowa/src/gplx/xowa/mws/parsers/magiclinks/Xomw_magiclinks_wkr.java @@ -27,14 +27,17 @@ public class Xomw_magiclinks_wkr { private static byte[] Tag__anch__rhs; private boolean[] url_separators; private static Xomw_regex_link_interrupt regex_link_interrupt; + private final Xomw_parser parser; private final Xomw_regex_boundary regex_boundary; private final Xomw_regex_url regex_url; private final Xomw_sanitizer sanitizer; private final Xomw_linker linker; + private final Xomwh_atr_mgr atrs = new Xomwh_atr_mgr(); private byte[] page_title; private static final byte Regex__anch = 1, Regex__elem = 2, Regex__free = 3; - public Xomw_magiclinks_wkr(Xomw_sanitizer sanitizer, Xomw_linker linker, Xomw_regex_boundary regex_boundary, Xomw_regex_url regex_url) { + public Xomw_magiclinks_wkr(Xomw_parser parser, Xomw_sanitizer sanitizer, Xomw_linker linker, Xomw_regex_boundary regex_boundary, Xomw_regex_url regex_url) { + this.parser = parser; this.sanitizer = sanitizer; this.linker = linker; this.regex_boundary = regex_boundary; @@ -262,7 +265,7 @@ public class Xomw_magiclinks_wkr { linker.Make_external_link(bfr, url , url // $this->getConverterLanguage()->markNoConversion($url, true), , true, Bry_.new_a7("free") - , new Xomwh_atr_mgr() // $this->getExternalLinkAttribs($url) + , parser.Get_external_link_attribs(atrs) , page_title); // XO.MW.UNSUPPORTED.HOOK: registers link for processing by other extensions? diff --git a/400_xowa/src/gplx/xowa/mws/parsers/magiclinks/Xomw_magiclinks_wkr__tst.java b/400_xowa/src/gplx/xowa/mws/parsers/magiclinks/Xomw_magiclinks_wkr__tst.java index 2c3cfe585..d84c24166 100644 --- a/400_xowa/src/gplx/xowa/mws/parsers/magiclinks/Xomw_magiclinks_wkr__tst.java +++ b/400_xowa/src/gplx/xowa/mws/parsers/magiclinks/Xomw_magiclinks_wkr__tst.java @@ -76,7 +76,8 @@ class Xomw_magiclinks_wkr__fxt { Xomw_regex_space regex_space = new Xomw_regex_space(); pctx.Init_by_page(wiki.Ttl_parse(Bry_.new_a7("Page_1"))); - this.wkr = new Xomw_magiclinks_wkr(new Xomw_sanitizer(), new Xomw_linker(), new Xomw_regex_boundary(regex_space), new Xomw_regex_url(regex_space)); + Xomw_parser parser = new Xomw_parser(); + this.wkr = new Xomw_magiclinks_wkr(parser, parser.Sanitizer(), parser.Linker(), new Xomw_regex_boundary(regex_space), new Xomw_regex_url(regex_space)); wkr.Init_by_wiki(); } public void Test__parse(String src_str, String expd) {Test__parse(Bool_.Y, src_str, expd);}