mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
'v3.7.4.1'
This commit is contained in:
@@ -52,6 +52,7 @@ public class Xop_ctx {
|
||||
public Xot_invk_wkr Invk() {return invk;} private final Xot_invk_wkr invk = new Xot_invk_wkr();
|
||||
public Xop_curly_wkr Curly() {return curly;} private final Xop_curly_wkr curly = new Xop_curly_wkr();
|
||||
public Xop_xnde_tag_regy Xnde_tag_regy() {return xnde_tag_regy;} private final Xop_xnde_tag_regy xnde_tag_regy; // PERF:demeter
|
||||
public Xop_tmp_mgr Tmp_mgr() {return tmp_mgr;} private final Xop_tmp_mgr tmp_mgr = new Xop_tmp_mgr();
|
||||
|
||||
public byte Xnde_names_tid() {return xnde_names_tid;} public Xop_ctx Xnde_names_tid_(byte v) {xnde_names_tid = v; return this;} private byte xnde_names_tid = Xop_parser_tid_.Tid__null;
|
||||
public byte Parse_tid() {return parse_tid;} public Xop_ctx Parse_tid_(byte v) {parse_tid = v; xnde_names_tid = v; return this;} private byte parse_tid = Xop_parser_tid_.Tid__null;
|
||||
@@ -84,7 +85,6 @@ public class Xop_ctx {
|
||||
cur_page.Clear(clear_scrib);
|
||||
stack = Xop_tkn_itm_.Ary_empty;
|
||||
stack_len = stack_max = 0;
|
||||
app.Wiki_mgr().Wdata_mgr().Clear();
|
||||
if (lst_section_mgr != null) lst_section_mgr.Clear();
|
||||
if (lst_page_regy != null) lst_page_regy.Clear();
|
||||
tmpl_output = null;
|
||||
|
||||
28
400_xowa/src/gplx/xowa/parsers/Xop_tmp_mgr.java
Normal file
28
400_xowa/src/gplx/xowa/parsers/Xop_tmp_mgr.java
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
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/>.
|
||||
*/
|
||||
package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*;
|
||||
import gplx.core.primitives.*;
|
||||
import gplx.xowa.files.*;
|
||||
import gplx.xowa.xtns.pfuncs.exprs.*; import gplx.xowa.xtns.math.*;
|
||||
public class Xop_tmp_mgr {
|
||||
public Xof_math_itm Math_itm() {return math_itm;} private final Xof_math_itm math_itm = new Xof_math_itm();
|
||||
public Xof_xfer_itm Xfer_itm() {return xfer_itm;} private final Xof_xfer_itm xfer_itm = new Xof_xfer_itm();
|
||||
public Number_parser Pfunc_num_parser_0() {return num_parser_0;} private final Number_parser num_parser_0 = new Number_parser().Hex_enabled_(true);
|
||||
public Number_parser Pfunc_num_parser_1() {return num_parser_1;} private final Number_parser num_parser_1 = new Number_parser().Hex_enabled_(true);
|
||||
public Pfunc_expr_shunter Expr_shunter() {return expr_shunter;} private final Pfunc_expr_shunter expr_shunter = new Pfunc_expr_shunter();
|
||||
}
|
||||
@@ -16,9 +16,10 @@ 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/>.
|
||||
*/
|
||||
package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*;
|
||||
// using gplx.langs.jsons;
|
||||
import gplx.xowa.wikis.*; import gplx.core.envs.*;
|
||||
import gplx.xowa.files.*;
|
||||
import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.xtns.scribunto.*;
|
||||
import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.pfuncs.times.*;
|
||||
public class Xow_parser_mgr {
|
||||
private final Xowe_wiki wiki; private final Xop_tkn_mkr tkn_mkr;
|
||||
private Xop_parser anchor_encode_parser;
|
||||
@@ -27,11 +28,14 @@ public class Xow_parser_mgr {
|
||||
this.ctx = Xop_ctx.New__top(wiki);
|
||||
this.parser = Xop_parser.new_wiki(wiki);
|
||||
}
|
||||
public Xop_ctx Ctx() {return ctx;} private final Xop_ctx ctx;
|
||||
public Xop_parser Main() {return parser;} private final Xop_parser parser;
|
||||
public Scrib_core_mgr Scrib() {return scrib;} private final Scrib_core_mgr scrib = new Scrib_core_mgr();
|
||||
public Pfunc_ifexist_mgr Ifexist_mgr() {return ifexist_mgr;} private final Pfunc_ifexist_mgr ifexist_mgr = new Pfunc_ifexist_mgr();
|
||||
public Xof_url_bldr Url_bldr() {return url_bldr;} private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2();
|
||||
public Xop_ctx Ctx() {return ctx;} private final Xop_ctx ctx;
|
||||
public Xop_parser Main() {return parser;} private final Xop_parser parser;
|
||||
public Scrib_core_mgr Scrib() {return scrib;} private final Scrib_core_mgr scrib = new Scrib_core_mgr();
|
||||
public Pfunc_ifexist_mgr Ifexist_mgr() {return ifexist_mgr;} private final Pfunc_ifexist_mgr ifexist_mgr = new Pfunc_ifexist_mgr();
|
||||
public Xof_url_bldr Url_bldr() {return url_bldr;} private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2();
|
||||
public List_adp Time_parser_itms() {return time_parser_itms;} private final List_adp time_parser_itms = List_adp_.New();
|
||||
public Pft_func_formatdate_bldr Date_fmt_bldr() {return date_fmt_bldr;} private final Pft_func_formatdate_bldr date_fmt_bldr = new Pft_func_formatdate_bldr();
|
||||
// public Json_parser Wbase_jdoc_parser() {return wbase_jdoc_parser;} private final Json_parser wbase_jdoc_parser = new Json_parser();
|
||||
public Xop_parser Anchor_encoder() {
|
||||
if (anchor_encode_parser == null) {
|
||||
anchor_encode_parser = Xop_parser.new_(wiki, wiki.Parser_mgr().Main().Tmpl_lxr_mgr(), Xop_lxr_mgr.new_anchor_encoder());
|
||||
@@ -42,7 +46,7 @@ public class Xow_parser_mgr {
|
||||
}
|
||||
public void Parse(Xoae_page page, boolean clear) { // main parse method
|
||||
if (!Env_.Mode_testing()) wiki.Init_assert();
|
||||
scrib.Core_page_changed(page); // notify scribunto about page changed
|
||||
scrib.When_page_changed(page); // notify scribunto about page changed
|
||||
ctx.Page_(page);
|
||||
Xop_root_tkn root = ctx.Tkn_mkr().Root(page.Db().Text().Text_bry());
|
||||
if (clear) {page.Clear_all();}
|
||||
|
||||
@@ -287,7 +287,7 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr {
|
||||
int lnke_bgn_pos = lhs_dlm_pos + 1;
|
||||
byte[] rhs_dlm_bry = Bry_quote;
|
||||
if (lhs_dlm_pos - proto_end_pos > 0) {
|
||||
Bry_bfr bfr = ctx.App().Utl__bfr_mkr().Get_k004();
|
||||
Bry_bfr bfr = ctx.Wiki().Utl__bfr_mkr().Get_k004();
|
||||
rhs_dlm_bry = bfr.Add(Bry_quote).Add_mid(src, proto_end_pos, lhs_dlm_pos).To_bry_and_clear();
|
||||
bfr.Mkr_rls();
|
||||
}
|
||||
|
||||
@@ -41,14 +41,13 @@ public class Xop_lnki_wkr_ {
|
||||
return Parse_ttl(ctx, src, lnki, ttl_bgn, ttl_end);
|
||||
}
|
||||
public static boolean Parse_ttl(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki, int ttl_bgn, int ttl_end) {
|
||||
Xoae_app app = ctx.App();
|
||||
byte[] ttl_bry = Bry_.Mid(src, ttl_bgn, ttl_end);
|
||||
ttl_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url_ttl.Decode(ttl_bry);
|
||||
int ttl_bry_len = ttl_bry.length;
|
||||
Xoa_ttl page_ttl = ctx.Page().Ttl();
|
||||
if (page_ttl.Ns().Subpages_enabled()
|
||||
&& Pfunc_rel2abs.Rel2abs_ttl(ttl_bry, 0, ttl_bry_len)) { // Linker.php|normalizeSubpageLink
|
||||
Bry_bfr tmp_bfr = app.Utl__bfr_mkr().Get_b512();
|
||||
Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b512();
|
||||
byte[] new_bry = Pfunc_rel2abs.Rel2abs(tmp_bfr, ttl_bry, page_ttl.Raw(), rel2abs_tid.Val_zero_());
|
||||
lnki.Subpage_tid_(rel2abs_tid.Val());
|
||||
lnki.Subpage_slash_at_end_(Bry_.Get_at_end(ttl_bry) == Byte_ascii.Slash);
|
||||
|
||||
@@ -62,35 +62,33 @@ public class Xot_defn_tmpl implements Xot_defn {
|
||||
}
|
||||
public void Parse_tmpl(Xop_ctx ctx) {ctx.Wiki().Parser_mgr().Main().Parse_text_to_defn(this, ctx, ctx.Tkn_mkr(), ns, name, data_raw);} boolean onlyinclude_parsed = false;
|
||||
public boolean Tmpl_evaluate(Xop_ctx ctx, Xot_invk caller, Bry_bfr bfr) {
|
||||
// synchronized (this) { // LOCK:DELETE; DATE:2016-07-06
|
||||
if (root == null) Parse_tmpl(ctx);
|
||||
Xoae_page page = ctx.Page();
|
||||
if (!page.Tmpl_stack_add(full_name)) {
|
||||
bfr.Add_str_a7("<!-- template loop detected:" + gplx.langs.htmls.Gfh_utl.Escape_html_as_str(String_.new_u8(name)) + " -->");
|
||||
Xoa_app_.Usr_dlg().Log_many("", "", "template loop detected: url=~{0} name=~{1}", ctx.Page().Url().To_str(), name);
|
||||
return false;
|
||||
if (root == null) Parse_tmpl(ctx);
|
||||
Xoae_page page = ctx.Page();
|
||||
if (!page.Tmpl_stack_add(full_name)) {
|
||||
bfr.Add_str_a7("<!-- template loop detected:" + gplx.langs.htmls.Gfh_utl.Escape_html_as_str(String_.new_u8(name)) + " -->");
|
||||
Xoa_app_.Usr_dlg().Log_many("", "", "template loop detected: url=~{0} name=~{1}", ctx.Page().Url().To_str(), name);
|
||||
return false;
|
||||
}
|
||||
boolean rv = true;
|
||||
if (onlyInclude_exists) {
|
||||
Xowe_wiki wiki = ctx.Wiki();
|
||||
if (!onlyinclude_parsed) {
|
||||
onlyinclude_parsed = true;
|
||||
byte[] new_data = Extract_onlyinclude(data_raw, wiki.Utl__bfr_mkr());
|
||||
Xop_ctx new_ctx = Xop_ctx.New__sub(wiki, ctx, page); // COMMENT:changed from ctx.Page() to page; DATE:2016-07-11
|
||||
Xot_defn_tmpl tmpl = wiki.Parser_mgr().Main().Parse_text_to_defn_obj(new_ctx, new_ctx.Tkn_mkr(), wiki.Ns_mgr().Ns_template(), Bry_.Empty, new_data);
|
||||
tmpl.Root().Tmpl_compile(new_ctx, new_data, Xot_compile_data.Null);
|
||||
data_raw = new_data;
|
||||
root = tmpl.Root();
|
||||
}
|
||||
boolean rv = true;
|
||||
if (onlyInclude_exists) {
|
||||
Xowe_wiki wiki = ctx.Wiki();
|
||||
if (!onlyinclude_parsed) {
|
||||
onlyinclude_parsed = true;
|
||||
byte[] new_data = Extract_onlyinclude(data_raw, wiki.Utl__bfr_mkr());
|
||||
Xop_ctx new_ctx = Xop_ctx.New__sub(wiki, ctx, page); // COMMENT:changed from ctx.Page() to page; DATE:2016-07-11
|
||||
Xot_defn_tmpl tmpl = wiki.Parser_mgr().Main().Parse_text_to_defn_obj(new_ctx, new_ctx.Tkn_mkr(), wiki.Ns_mgr().Ns_template(), Bry_.Empty, new_data);
|
||||
tmpl.Root().Tmpl_compile(new_ctx, new_data, Xot_compile_data.Null);
|
||||
data_raw = new_data;
|
||||
root = tmpl.Root();
|
||||
}
|
||||
}
|
||||
int subs_len = root.Subs_len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
boolean result = root.Subs_get(i).Tmpl_evaluate(ctx, data_raw, caller, bfr);
|
||||
if (!result) rv = false;
|
||||
}
|
||||
page.Tmpl_stack_del();
|
||||
return rv;
|
||||
// }
|
||||
}
|
||||
int subs_len = root.Subs_len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
boolean result = root.Subs_get(i).Tmpl_evaluate(ctx, data_raw, caller, bfr);
|
||||
if (!result) rv = false;
|
||||
}
|
||||
page.Tmpl_stack_del();
|
||||
return rv;
|
||||
}
|
||||
public Xot_defn Clone(int id, byte[] name) {throw Err_.new_unimplemented();}
|
||||
boolean onlyInclude_exists;
|
||||
|
||||
@@ -20,7 +20,7 @@ import gplx.core.primitives.*;
|
||||
import gplx.xowa.xtns.scribunto.*;
|
||||
public class Xot_invk_temp implements Xot_invk {
|
||||
private List_adp list = List_adp_.New();
|
||||
private Hash_adp_bry arg_key_hash;
|
||||
private Hash_adp_bry arg_key_hash;
|
||||
private Hash_adp arg_idx_hash; private Int_obj_ref arg_idx_ref;
|
||||
Xot_invk_temp() {}
|
||||
public Xot_invk_temp(boolean root_frame) {this.root_frame = root_frame;}
|
||||
|
||||
@@ -233,7 +233,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
|
||||
}
|
||||
if (ignore_hash.Get_by_bry(name_ary) == null) {
|
||||
if (Pfunc_rel2abs.Rel2abs_ttl(name_ary, name_bgn, name_ary_len)) {// rel_path; EX: {{/../Peer page}}; DATE:2013-03-27
|
||||
Bry_bfr tmp_bfr = ctx.App().Utl__bfr_mkr().Get_b512();
|
||||
Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b512();
|
||||
name_ary = Pfunc_rel2abs.Rel2abs(tmp_bfr, Bry_.Mid(name_ary, name_bgn, name_ary_len), ctx.Page().Ttl().Raw());
|
||||
tmp_bfr.Mkr_rls();
|
||||
return SubEval(ctx, wiki, bfr, name_ary, caller, src);
|
||||
|
||||
@@ -21,7 +21,7 @@ import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.miscs.*;
|
||||
public class Xot_tmpl_wtr {
|
||||
public byte[] Write_all(Xop_ctx ctx, Xop_root_tkn root, byte[] src) {
|
||||
// synchronized (this) { // THREAD:added synchronized after "failed to write tkn" DATE:2015-04-29
|
||||
Bry_bfr rslt_bfr = ctx.App().Utl__bfr_mkr().Get_m001();
|
||||
Bry_bfr rslt_bfr = ctx.Wiki().Utl__bfr_mkr().Get_m001();
|
||||
ctx.Tmpl_output_(rslt_bfr);
|
||||
rslt_bfr.Reset_if_gt(Io_mgr.Len_mb);
|
||||
Write_tkn(ctx, src, src.length, rslt_bfr, root);
|
||||
@@ -68,7 +68,7 @@ public class Xot_tmpl_wtr {
|
||||
if (xnde.Tag_close_bgn() == Int_.Min_value)
|
||||
rslt_bfr.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); // write src from bgn/end
|
||||
else { // NOTE: if nowiki then "deactivate" all xndes by swapping out < for < nowiki_xnde_frag; DATE:2013-01-27
|
||||
Bry_bfr tmp_bfr = ctx.Wiki().Appe().Utl__bfr_mkr().Get_k004();
|
||||
Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_k004();
|
||||
int nowiki_content_bgn = xnde.Tag_open_end(), nowiki_content_end = xnde.Tag_close_bgn();
|
||||
boolean escaped = gplx.xowa.parsers.tmpls.Nowiki_escape_itm.Escape(tmp_bfr, src, nowiki_content_bgn, nowiki_content_end);
|
||||
rslt_bfr.Add_bfr_or_mid(escaped, tmp_bfr, src, nowiki_content_bgn, nowiki_content_end);
|
||||
|
||||
@@ -70,7 +70,7 @@ public class Xop_redirect_mgr {
|
||||
, Xop_tkn_.Lnki_end // "]]"
|
||||
);
|
||||
}
|
||||
public static byte[] Bld_redirect_msg(Xoae_app app, Xowe_wiki wiki, Xopg_redirect_data redirect_mgr) {
|
||||
public static byte[] Bld_redirect_msg(Xoae_app app, Xowe_wiki wiki, Xopg_redirect_mgr redirect_mgr) {
|
||||
int len = redirect_mgr.Itms__len(); if (len == 0) return Bry_.Empty;
|
||||
Bry_bfr redirect_bfr = Xoa_app_.Utl__bfr_mkr().Get_b512();
|
||||
boolean dirty = false;
|
||||
@@ -93,7 +93,7 @@ public class Xop_redirect_mgr {
|
||||
}
|
||||
if (!dirty) return Bry_.Empty; // ignore Special:Redirects else Special:Random will always show "redirected from"; DATE:2016-07-05
|
||||
Xol_msg_itm msg_itm = wiki.Lang().Msg_mgr().Itm_by_id_or_null(Xol_msg_itm_.Id_redirectedfrom);
|
||||
Bry_bfr fmt_bfr = app.Utl__bfr_mkr().Get_b512();
|
||||
Bry_bfr fmt_bfr = wiki.Utl__bfr_mkr().Get_b512();
|
||||
app.Tmp_fmtr().Fmt_(msg_itm.Val()).Bld_bfr_one(fmt_bfr, redirect_bfr);
|
||||
redirect_bfr.Clear().Mkr_rls(); fmt_bfr.Mkr_rls();
|
||||
return fmt_bfr.To_bry_and_clear();
|
||||
|
||||
@@ -76,7 +76,7 @@ class Xop_redirect_mgr_fxt {
|
||||
Tfds.Eq(expd_str, String_.new_u8(actl_bry));
|
||||
}
|
||||
public void Test__redirected_html(String page_str, String expd_str) {
|
||||
gplx.xowa.wikis.pages.redirects.Xopg_redirect_data redirect_mgr = new gplx.xowa.wikis.pages.redirects.Xopg_redirect_data();
|
||||
gplx.xowa.wikis.pages.redirects.Xopg_redirect_mgr redirect_mgr = new gplx.xowa.wikis.pages.redirects.Xopg_redirect_mgr();
|
||||
Xoa_ttl ttl = fxt.Wiki().Ttl_parse(Bry_.new_u8(page_str));
|
||||
Xoa_url url = Xoa_url.New(fxt.Wiki(), ttl);
|
||||
redirect_mgr.Itms__add__article(url, ttl, Bry_.Empty);
|
||||
|
||||
@@ -22,7 +22,6 @@ class Xop_xnde_wkr_ {
|
||||
private static final Btrie_slim_mgr xtn_end_tag_trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en; listed XML node names are en
|
||||
private static final int Find_xtn_end__tid__bgn = 0, Find_xtn_end__tid__end = 1, Find_xtn_end__tid__xtag = 2;
|
||||
private static final Int_obj_ref Find_xtn_end__key__bgn = Int_obj_ref.New(Find_xtn_end__tid__bgn), Find_xtn_end__key__end = Int_obj_ref.New(Find_xtn_end__tid__end), Find_xtn_end__key__xtag = Int_obj_ref.New(Find_xtn_end__tid__xtag);
|
||||
private static final Bry_bfr Find_xtag_end__bfr = Bry_bfr_.New_w_size(32);
|
||||
public static void AutoClose_handle_dangling_nde_in_caption(Xop_root_tkn root, Xop_tkn_itm owner) {
|
||||
int subs_bgn = -1, subs_len = owner.Subs_len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
@@ -73,8 +72,10 @@ class Xop_xnde_wkr_ {
|
||||
public static int Find_xtag_end(Xop_ctx ctx, byte[] src, int pos, int src_end) {
|
||||
int xtag_bgn = pos + Pfunc_tag.Xtag_bgn_lhs.length;
|
||||
int tag_id = Bry_.To_int_or(src, xtag_bgn, xtag_bgn + Pfunc_tag.Id_len, -1); if (tag_id == -1) {Xoa_app_.Usr_dlg().Warn_many("", "", "parser.xtn: could not extract id from xtag_bgn: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;}
|
||||
Find_xtag_end__bfr.Add(Pfunc_tag.Xtag_end_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, Pfunc_tag.Id_len, tag_id).Add(Pfunc_tag.Xtag_rhs);
|
||||
byte[] tag_end = Find_xtag_end__bfr.To_bry_and_clear();
|
||||
Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b128();
|
||||
tmp_bfr.Add(Pfunc_tag.Xtag_end_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, Pfunc_tag.Id_len, tag_id).Add(Pfunc_tag.Xtag_rhs);
|
||||
byte[] tag_end = tmp_bfr.To_bry_and_clear();
|
||||
tmp_bfr.Mkr_rls();
|
||||
int rv = Bry_find_.Find_fwd(src, tag_end, pos + Pfunc_tag.Xtag_rhs.length); if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find xtag end: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;}
|
||||
rv = Bry_find_.Find_bwd(src, Byte_ascii.Lt, rv - 1); if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find <: page=~{0}", ctx.Page().Url().To_str()); return Bry_find_.Not_found;}
|
||||
return rv;
|
||||
|
||||
Reference in New Issue
Block a user