Mw_parse: Add Get_external_link_attribs

pull/620/head
gnosygnu 8 years ago
parent df45f141ca
commit 7bb09a8320

@ -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.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.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.utls.*; import gplx.xowa.mws.linkers.*;
import gplx.xowa.mws.htmls.*;
public class Xomw_parser { public class Xomw_parser {
private final Xomw_parser_ctx pctx = new Xomw_parser_ctx(); private final Xomw_parser_ctx pctx = new Xomw_parser_ctx();
private final Xomw_table_wkr table_wkr; private final Xomw_table_wkr table_wkr;
@ -55,6 +56,8 @@ public class Xomw_parser {
regex_space = new Xomw_regex_space(); regex_space = new Xomw_regex_space();
regex_boundary = new Xomw_regex_boundary(regex_space); regex_boundary = new Xomw_regex_boundary(regex_space);
regex_url = new Xomw_regex_url(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.lnke_wkr = new Xomw_lnke_wkr(this);
this.lnki_wkr = new Xomw_lnki_wkr(this, holders, link_renderer, protocols_trie); this.lnki_wkr = new Xomw_lnki_wkr(this, holders, link_renderer, protocols_trie);
this.heading_wkr_cbk = new Xomw_heading_cbk__html(); 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) { public void Init_by_wiki(Xowe_wiki wiki) {
linker.Init_by_wiki(wiki.Lang().Lnki_trail_mgr().Trie()); linker.Init_by_wiki(wiki.Lang().Lnki_trail_mgr().Trie());
@ -263,6 +266,19 @@ public class Xomw_parser {
strip_state.Add_general(marker, text); strip_state.Add_general(marker, text);
return marker; 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__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); private static final byte[] Bry__marker__noparse = Bry_.Add(Xomw_strip_state.Bry__marker__bgn, Bry__noparse);
public static Btrie_slim_mgr Protocols__dflt() { public static Btrie_slim_mgr Protocols__dflt() {

@ -24,13 +24,15 @@ public class Xomw_lnke_wkr {// THREAD.UNSAFE: caching for repeated calls
private final Bry_bfr tmp; private final Bry_bfr tmp;
private Btrie_slim_mgr protocol_trie; private final Btrie_rv trv = new Btrie_rv(); private Btrie_slim_mgr protocol_trie; private final Btrie_rv trv = new Btrie_rv();
private int autonumber; private int autonumber;
private final Xomw_parser parser;
private final Xomw_linker linker; private final Xomw_linker linker;
private final Xomwh_atr_mgr attribs = new Xomwh_atr_mgr(); private final Xomwh_atr_mgr attribs = new Xomwh_atr_mgr();
private Xomw_regex_url regex_url; private Xomw_regex_url regex_url;
private Xomw_regex_space regex_space; private Xomw_regex_space regex_space;
public Xomw_lnke_wkr(Xomw_parser mgr) { public Xomw_lnke_wkr(Xomw_parser parser) {
this.tmp = mgr.Tmp(); this.parser = parser;
this.linker = mgr.Linker(); 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) { 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; 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 // This means that users can paste URLs directly into the text
// Funny characters like <20> aren't valid in URLs anyway // Funny characters like <20> aren't valid in URLs anyway
// This was changed in August 2004 // This was changed in August 2004
// TODO.XO:getExternalLinkAttribs 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);
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);
// Register link in the output Object. // Register link in the output Object.
// Replace unnecessary URL escape codes with the referenced character // 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 ); // $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[] private static final byte[]
Link_type__free = Bry_.new_a7("free") Link_type__free = Bry_.new_a7("free")

@ -27,14 +27,17 @@ public class Xomw_magiclinks_wkr {
private static byte[] Tag__anch__rhs; private static byte[] Tag__anch__rhs;
private boolean[] url_separators; private boolean[] url_separators;
private static Xomw_regex_link_interrupt regex_link_interrupt; 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_boundary regex_boundary;
private final Xomw_regex_url regex_url; private final Xomw_regex_url regex_url;
private final Xomw_sanitizer sanitizer; private final Xomw_sanitizer sanitizer;
private final Xomw_linker linker; private final Xomw_linker linker;
private final Xomwh_atr_mgr atrs = new Xomwh_atr_mgr();
private byte[] page_title; private byte[] page_title;
private static final byte Regex__anch = 1, Regex__elem = 2, Regex__free = 3; 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.sanitizer = sanitizer;
this.linker = linker; this.linker = linker;
this.regex_boundary = regex_boundary; this.regex_boundary = regex_boundary;
@ -262,7 +265,7 @@ public class Xomw_magiclinks_wkr {
linker.Make_external_link(bfr, url linker.Make_external_link(bfr, url
, url // $this->getConverterLanguage()->markNoConversion($url, true), , url // $this->getConverterLanguage()->markNoConversion($url, true),
, true, Bry_.new_a7("free") , true, Bry_.new_a7("free")
, new Xomwh_atr_mgr() // $this->getExternalLinkAttribs($url) , parser.Get_external_link_attribs(atrs)
, page_title); , page_title);
// XO.MW.UNSUPPORTED.HOOK: registers link for processing by other extensions? // XO.MW.UNSUPPORTED.HOOK: registers link for processing by other extensions?

@ -76,7 +76,8 @@ class Xomw_magiclinks_wkr__fxt {
Xomw_regex_space regex_space = new Xomw_regex_space(); Xomw_regex_space regex_space = new Xomw_regex_space();
pctx.Init_by_page(wiki.Ttl_parse(Bry_.new_a7("Page_1"))); 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(); wkr.Init_by_wiki();
} }
public void Test__parse(String src_str, String expd) {Test__parse(Bool_.Y, src_str, expd);} public void Test__parse(String src_str, String expd) {Test__parse(Bool_.Y, src_str, expd);}

Loading…
Cancel
Save