"""Prep front cover for sidebar (based on st-bumblebee-st_app.py)."""
# pylint: disable=abstract-class-instantiated
import base64
from io import BytesIO
from textwrap import dedent
import logzero
import pandas as pd
import streamlit as st
from logzero import logger
from set_loglevel import set_loglevel
from st_mlbee import __version__
logzero.loglevel(set_loglevel())
msg = dedent(
"""
What would you like to do?
The following alignment engines are available.
**UFast-Engine**: ultra-fast, based on a home-brewed algorithm, faster than blazing fast but can only process en-zh para/sent pairs, not as sophisticated as DL-Engine;
**SFast-Engine**: super-fast, based on machine translation;
**Fast-Engine**: based on yet another home-brewed algorithm, blazing fast but can only process en-zh para/sent pairs;
**DL-Engin**: based on machine learning, multilingual, one para/sent takes about 1s.
"""
).strip()
msg = dedent(
"""
a multilingual (50+ language pairs) dualtext
aligner based on machine learning
It takes about 1-2 s to process a pair of blocks (be it
sents, paras of docus).
Extremely long blocks will likely have a negative impact
on aligning.
On a powerful computer such as an instance on huggingface spaces, the running time can be reduced by a factor of 10-20.
"""
).strip()
def sb_front_cover():
"""Prep front cover for sidebar."""
st.sidebar.markdown(f"### mlbee {__version__} ")
_ = "More info (click to toggle)"
sb_tit_expander = st.sidebar.expander(_, expanded=False)
with sb_tit_expander:
st.markdown(msg)
intructins = dedent(
f"""
* Set up options in the left sidebar
* Click expanders / +: to reveal more details; -: to hide them
* Press '**Click to start aligning**' to get
the ball rolling. (The button will appear when
everything is ready.)
* mlbee v.{__version__} from mu@qq41947782's
keyboard in cyberspace. Join **qq group 316287378**
for feedback and questions or to be kept updated.
mlbee is a member of the bee family.
"""
).strip()
def instructions():
"""Prep msg."""
logger.debug("instructions entry")
back_cover_expander = st.expander("Instructions")
with back_cover_expander:
st.markdown(intructins)
logger.debug("instructions exit")
about_msg = dedent(
f"""
# mlbee {__version__}
https://bumblebee.freeforums.net/thread/6/mlbee
or head to 桃花元 (qq group 316287378)
"""
).strip()
menu_items = {
"Get Help": "https://bumblebee.freeforums.net/thread/6/mlbee",
"Report a bug": "https://github.com/ffreemt/mlbee/issues",
"About": about_msg,
}
style_css = """
.row-widget.stTextInput > div:first-of-type {
background: #fff;
display: flex;
border: 1px solid #dfe1e5;
box-shadow: none;
border-radius: 24px;
height: 50px;
width: auto;
margin: 10px auto 30px;
}
.row-widget.stTextInput > div:first-of-type:hover,
.row-widget.stTextInput > div:first-of-type:focus {
box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.2);
}
.row-widget.stTextInput .st-bq {
background-color: #fff;
}
.row-widget.stTextInput > label {
color: #b3b3b3;
}
.row-widget.stButton > button {
border-radius: 24px;
background-color: #B6C9B1;
color: #fff;
border: none;
padding: 6px 20px;
float: right;
background-image: none;
}
.row-widget.stButton > button:hover {
box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.2);
}
.row-widget.stButton > button:focus {
border: none;
color: #fff;
}
.footer-custom {
position: fixed;
bottom: 0;
width: 100%;
color: var(--text-color);
max-width: 698px;
font-size: 14px;
height: 50px;
padding: 10px 0;
z-index: 50;
}
.main {
padding: 20px;
}
footer {
display: none !important;
}
.footer-custom a {
color: var(--text-color);
}
#wikipedia-assistant {
font-size: 36px;
}
.generated-answer p {
font-size: 16px;
font-weight: bold;
}
.react-json-view {
margin: 40px 0 80px;
}
.tooltip {
text-align: center;
line-height: 20px;
display: table-caption;
font-size: 10px;
border-radius: 50%;
height: 20px;
width: 20px;
position: relative;
cursor: pointer;
color:#000;
}
.tooltip .tooltiptext {
visibility: hidden;
width: 280px;
text-align: center;
border-radius: 6px;
padding: 10px;
position: absolute;
z-index: 1;
top: 25px;
left: 50%;
margin-left: -140px;
font-size: 14px;
background-color: #fff;
border: 1px solid #ccc;
box-shadow: 0px 0px 3px 1px rgba(0, 0, 0, 0.16);
color: #000;
}
.tooltip:hover .tooltiptext {
visibility: visible;
}
.sentence-wrapper {
border-left: 4px solid #ffc423;
padding-left: 20px;
margin-bottom: 40px;
}
#context {
padding: 2rem 0 1rem;
}
hr {
margin: 2em 0 1em;
}
.technical-details-info {
margin-bottom: 100px;
}
.loader-wrapper {
display: flex;
align-items: center;
background-color: rgba(250, 202, 43, 0.2);
padding: 15px 20px;
border-radius: 6px;
}
.loader-wrapper p {
margin-bottom: 0;
margin-left: 20px;
}
.loader {
width: 30px;
height: 30px;
border: dotted 5px #868686;
border-radius: 100%;
animation: spin 1s linear infinite;
}
.loader-note {
font-size: 14px;
color: #b3b3b3;
margin-left: 5px;
}
@keyframes spin {
0% {
transform: rotate(0deg) scale(0.8);
border-top-color: transparent;
border-right-color: transparent;
}
50% { transform: rotate(180deg) scale(1.2);
border-color: #949494;
border-top-color: transparent;
border-right-color: transparent;
}
100% { transform: rotate(360deg) scale(0.8);
border-color: #bbbbbb;
border-top-color: transparent;
border-right-color: transparent;
}
}
"""
def to_excel(df):
"""Convert df to excel.
ref. st-bumblebee st_app.py
"""
output = BytesIO()
writer = pd.ExcelWriter(output, engine="xlsxwriter")
df.to_excel(writer, sheet_name="Sheet1")
writer.save()
processed_data = output.getvalue()
return processed_data
def get_table_download_link(df):
"""Generates a link.
Allowing the data in a given panda dataframe
to be downloaded.
Args:
df: pandas.dataframe
Returns:
href string
"""
val = to_excel(df)
b64 = base64.b64encode(val) # val looks like b'...'
return f'Download aligned paras xlsx file' # decode b'abc' => abc
def get_table_download_link_sents(df):
"""Generates a link.
Allowing the data in a given panda dataframe to be
downloaded for sents aligned.
Args:
df: pandas.dataframe
Returns:
href string
"""
val = to_excel(df)
b64 = base64.b64encode(val) # val looks like b'...'
return f'Download aligned sents xlsx file' # decode b'abc' => abc # noqa