Skip to content

Instantly share code, notes, and snippets.

@user12986714
Last active August 7, 2020 01:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save user12986714/38184a7d64eeb2658b14a8c504d70287 to your computer and use it in GitHub Desktop.
Save user12986714/38184a7d64eeb2658b14a8c504d70287 to your computer and use it in GitHub Desktop.
regex benchmark (for spam detection)
import time
import regex
# !!!!!!!!!!!!!!!!!!!!!
# WARNING
# !!!!!!!!!!!!!!!!!!!!!
# Spam ahead. These test posts are taken from metasmoke (https://metasmoke.erwaysoftware.com) at random.
# The author of this file assumes completely no responsibility for these text.
test_posts = "x" * 30000, "asdfghjkl" * 5000, "!@/#*%|^&&)" * 5000, """
<p>Hi I'm new in foundation framework, I run my html email using zurb foundation framework in server but doesn't work. not show anything in email also.nthis is my code</p>nn<pre><code><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">n<html xmlns="http://www.w3.org/1999/xhtml">n<head>n <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />n <meta name="viewport" content="width=device-width, initial-scale=1.0">n <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">n <meta name="format-detection" content="telephone=no" /> <!-- disable auto telephone linking in iOS -->n <title>The Bandha HTML email</title>nn <style type="text/css">n /* RESET STYLES */n html { background-color:#E1E1E1; margin:0; padding:0; }n body, #bodyTable, #bodyCell, #bodyCell{height:100% !important; margin:0; padding:0; width:100% !important;font-family:Helvetica, Arial, "Lucida Grande", sans-serif;}n table{border-collapse:collapse;}n table[id=bodyTable] {width:100%!important;margin:auto;max-width:500px!important;color:#7A7A7A;font-weight:normal;}n img, a img{border:0; outline:none; text-decoration:none;height:auto; line-height:100%;}n a {text-decoration:none !important;border-bottom: 1px solid;}n h1, h2, h3, h4, h5, h6{color:#5F5F5F; font-weight:normal; font-family:Helvetica; font-size:20px; line-height:125%; text-align:Left; letter-spacing:normal;margin-top:0;margin-right:0;margin-bottom:10px;margin-left:0;padding-top:0;padding-bottom:0;padding-left:0;padding-right:0;}nn /* CLIENT-SPECIFIC STYLES */n .ReadMsgBody{width:100%;} .ExternalClass{width:100%;} /* Force Hotmail/Outlook.com to display emails at full width. */n .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div{line-height:100%;} /* Force Hotmail/Outlook.com to display line heights normally. */n table, td{mso-table-lspace:0pt; mso-table-rspace:0pt;} /* Remove spacing between tables in Outlook 2007 and up. */n #outlook a{padding:0;} /* Force Outlook 2007 and up to provide a "view in browser" message. */n img{-ms-interpolation-mode: bicubic;display:block;outline:none; text-decoration:none;} /* Force IE to smoothly render resized images. */n body, table, td, p, a, li, blockquote{-ms-text-size-adjust:100%; -webkit-text-size-adjust:100%; font-weight:normal!important;} /* Prevent Windows- and Webkit-based mobile platforms from changing declared text sizes. */n .ExternalClass td[class="ecxflexibleContainerBox"] h3 {padding-top: 10px !important;} /* Force hotmail to push 2-grid sub headers down */nn /* /\/\/\/\/\/\/\/\/ TEMPLATE STYLES /\/\/\/\/\/\/\/\/ */nn /* ========== Page Styles ========== */n h1{display:block;font-size:26px;font-style:normal;font-weight:normal;line-height:100%;}n h2{display:block;font-size:20px;font-style:normal;font-weight:normal;line-height:120%;}n h3{display:block;font-size:17px;font-style:normal;font-weight:normal;line-height:110%;}n h4{display:block;font-size:18px;font-style:italic;font-weight:normal;line-height:100%;}n .flexibleImage{height:auto;}n .linkRemoveBorder{border-bottom:0 !important;}n table[class=flexibleContainerCellDivider] {padding-bottom:0 !important;padding-top:0 !important;}nn body, #bodyTable{background-color:#E1E1E1;}n #emailHeader{background-color:#E1E1E1;}n #emailBody{background-color:#FFFFFF;}n #emailFooter{background-color:#E1E1E1;}n .nestedContainer{background-color:#F8F8F8; border:1px solid #CCCCCC;}n .emailButton{background-color:#205478; border-collapse:separate;}n .buttonContent{color:#FFFFFF; font-family:Helvetica; font-size:18px; font-weight:bold; line-height:100%; padding:15px; text-align:center;}n .buttonContent a{color:#FFFFFF; display:block; text-decoration:none!important; border:0!important;}n .emailCalendar{background-color:#FFFFFF; border:1px solid #CCCCCC;}n .emailCalendarMonth{background-color:#205478; color:#FFFFFF; font-family:Helvetica, Arial, sans-serif; font-size:16px; font-weight:bold; padding-top:10px; padding-bottom:10px; text-align:center;}n .emailCalendarDay{color:#205478; font-family:Helvetica, Arial, sans-serif; font-size:60px; font-weight:bold; line-height:100%; padding-top:20px; padding-bottom:20px; text-align:center;}n .imageContentText {margin-top: 10px;line-height:0;}n .imageContentText a {line-height:0;}n #invisibleIntroduction {display:none !important;} /* Removing the introduction text from the view */nn /*FRAMEWORK HACKS & OVERRIDES */n span[class=ios-color-hack] a {color:#275100!important;text-decoration:none!important;} /* Remove all link colors in IOS (below are duplicates based on the color preference) */n span[class=ios-color-hack2] a {color:#205478!important;text-decoration:none!important;}n span[class=ios-color-hack3] a {color:#8B8B8B!important;text-decoration:none!important;}nn .a[href^="tel"], a[href^="sms"] {text-decoration:none!important;color:#606060!important;pointer-events:none!important;cursor:default!important;}n .mobile_link a[href^="tel"], .mobile_link a[href^="sms"] {text-decoration:none!important;color:#606060!important;pointer-events:auto!important;cursor:default!important;}nnn /* MOBILE STYLES */n @media only screen and (max-width: 480px){n /*////// CLIENT-SPECIFIC STYLES //////*/n body{width:100% !important; min-width:100% !important;} /* Force iOS Mail to render the email at full width. */nnn table[id="emailHeader"],n table[id="emailBody"],n table[id="emailFooter"],n table[class="flexibleContainer"],n td[class="flexibleContainerCell"] {width:100% !important;}n td[class="flexibleContainerBox"], td[class="flexibleContainerBox"] table {display: block;width: 100%;text-align: left;}nn td[class="imageContent"] img {height:auto !important; width:100% !important; max-width:100% !important; }n img[class="flexibleImage"]{height:auto !important; width:100% !important;max-width:100% !important;}n img[class="flexibleImageSmall"]{height:auto !important; width:auto !important;}nnnn table[class="flexibleContainerBoxNext"]{padding-top: 10px !important;}nnn table[class="emailButton"]{width:100% !important;}n td[class="buttonContent"]{padding:0 !important;}n td[class="buttonContent"] a{padding:15px !important;}nn }nnnn @media only screen and (-webkit-device-pixel-ratio:.75){n /* Put CSS for low density (ldpi) Android layouts in here */n }nn @media only screen and (-webkit-device-pixel-ratio:1){n /* Put CSS for medium density (mdpi) Android layouts in here */n }nn @media only screen and (-webkit-device-pixel-ratio:1.5){n /* Put CSS for high density (hdpi) Android layouts in here */n }n /* end Android targeting */nn /* CONDITIONS FOR IOS DEVICES ONLYn =====================================================*/n @media only screen and (min-device-width : 320px) and (max-device-width:568px) {nn }n /* end IOS targeting */n </style>n</head>n<body bgcolor="#E1E1E1" leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">nnn <center style="background-color:#E1E1E1;">n <table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%" id="bodyTable" style="table-layout: fixed;max-width:100% !important;width: 100% !important;min-width: 100% !important;">n <tr>n <td align="center" valign="top" id="bodyCell">nnn <table bgcolor="#E1E1E1" border="0" cellpadding="0" cellspacing="0" width="500" id="emailHeader">nn <!-- HEADER ROW // -->n <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="10" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td valign="top" width="500" class="flexibleContainerCell">nn <!-- CONTENT TABLE // -->n <table align="left" border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>nn <td align="left" valign="middle" id="invisibleIntroduction" class="flexibleContainerBox" style="display:none !important; mso-hide:all;">n <table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:100%;">n <tr>n <td align="left" class="textContent">n <div style="font-family:Helvetica,Arial,sans-serif;font-size:13px;color:#828282;text-align:center;line-height:120%;">n The introduction of your message preview goes here. Try to make it short.n </div>n </td>n </tr>n </table>n </td>n <td align="right" valign="middle" class="flexibleContainerBox">n <table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:100%;">n <tr>n <td align="left" class="textContent">n <!-- CONTENT // -->n <div style="font-family:Helvetica,Arial,sans-serif;font-size:13px;color:#828282;text-align:center;line-height:120%;">n If you can't see this message, <a href="#" target="_blank" style="text-decoration:none;border-bottom:1px solid #828282;color:#828282;"><span style="color:#828282;">view&nbsp;it&nbsp;in&nbsp;your&nbsp;browser</span></a>.n </div>n </td>n </tr>n </table>n </td>n </tr>n </table>n </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // END -->nn </table>n <!-- // END -->nn <table bgcolor="#FFFFFF" border="0" cellpadding="0" cellspacing="0" width="500" id="emailBody">nnn <tr>n <td align="center" valign="top">nn <table border="0" cellpadding="0" cellspacing="0" width="100%" style="color:#FFFFFF;" bgcolor="#816b46">n <tr>n <td align="center" valign="top">nn <table border="0" cellpadding="0" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td align="center" valign="top" width="500" class="flexibleContainerCell">nnn <table border="0" cellpadding="30" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top" class="textContent">n <h1 style="color:#FFFFFF;line-height:100%;font-family:Helvetica,Arial,sans-serif;font-size:35px;font-weight:normal;margin-bottom:5px;text-align:center;width: auto;display: inline-block;"><img src="images/logo.png"></h1>nn </td>n </tr>n </table>n <!-- // CONTENT TABLE -->nn </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // MODULE ROW -->nnnnnnnnn <!-- MODULE ROW // -->n <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#fff">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="0" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td align="center" valign="top" width="500" class="flexibleContainerCell">n <table border="0" cellpadding="30" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">nn <!-- CONTENT TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td valign="top" class="textContent">nn <h3 mc:edit="header" style="color:#999999;line-height:125%;font-family:Helvetica,Arial,sans-serif;font-size:20px;font-weight:normal;margin-top:0;margin-bottom:3px;text-align:left;">Welcome to The Bandha Rewards, Wilda<br><br></h3>n <div mc:edit="body" style="text-align:left;font-family:Helvetica,Arial,sans-serif;font-size:12.5px;margin-bottom:0;color:#999999;line-height:135%;">We are delighted to welcome you as a family of The Bandha Hotel & Suites. Please be advised that once you made a booking to our website, you will be automatically becoming a member. Click to see your points. <br><br>nAt The Bandha, we strive to deliver a memorable, yet excellent services to our valued guests. We look forward to assisting you as you explore the rewarding experiences with us.</div>n </td>n </tr>n </table>n <!-- // CONTENT TABLE -->nn </td>n </tr>n </table>n </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // MODULE ROW -->nn <!-- MODULE ROW // -->n <tr>n <td align="left" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr style="padding-top:0;">n <td align="left" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="30" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td style="padding-top:0;" align="left" valign="top" width="500" class="flexibleContainerCell">nn <!-- CONTENT TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="50%" class="emailButton" style="background-color: #ddaa37;">n <tr>n <td align="left" valign="middle" class="buttonContent" style="padding-top:15px;padding-bottom:15px;padding-right:15px;padding-left:15px;">n <a style="color:#FFFFFF;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12.5px;line-height:135%;" href="#" target="_blank">See Your Rewards</a>n </td>n </tr>n </table>n <!-- // CONTENT TABLE -->nn </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // MODULE ROW -->n <!-- MODULE ROW // -->n <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="0" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td align="center" valign="top" width="500" class="flexibleContainerCell">nn <!-- CONTENT TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td valign="top" class="imageContent">n <img src="images/banner.jpg" width="500" class="flexibleImage" style="max-width:500px;width:100%;display:block;" alt="Text" title="Text" />n </td>n </tr>n </table>n <!-- // CONTENT TABLE -->nn </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // MODULE ROW -->n <!-- MODULE ROW // -->n <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="30" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td valign="top" width="500" class="flexibleContainerCell">nn <!-- CONTENT TABLE // -->n <table align="left" border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="left" valign="top" class="flexibleContainerBox">n <table border="0" cellpadding="0" cellspacing="0" width="210" style="max-width: 100%;">n <tr>n <td align="left" class="textContent">n <h3 style="color:#999;line-height:125%;font-family:Helvetica,Arial,sans-serif;font-size:13.5px;font-weight:normal;margin-top:0;margin-bottom:3px;text-align:left;">Username : </h3>nn </td>n </tr>n </table>n </td>n <td align="right" valign="middle" class="flexibleContainerBox">n <table class="flexibleContainerBoxNext" border="0" cellpadding="0" cellspacing="0" width="210" style="max-width: 100%;">n <tr>n <td align="left" class="textContent">n <h3 style="color:#999;line-height:125%;font-family:Helvetica,Arial,sans-serif;font-size:13.5px;font-weight:normal;margin-top:0;margin-bottom:3px;text-align:left;">Password :</h3>nn </td>n </tr>n </table>n </td>n </tr>n </table>n <!-- // CONTENT TABLE -->nn </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // MODULE ROW -->nnnnn <!-- MODULE ROW // -->n <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="0" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td align="center" valign="top" width="500" class="flexibleContainerCell">n <table border="0" cellpadding="30" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">nn <!-- CONTENT TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td valign="top" class="textContent">n <h3 style="color:#999;line-height:125%;font-family:Helvetica,Arial,sans-serif;font-size:35px;font-weight:normal;margin-top:0;margin-bottom:3px;text-align:left;">ENJOY YOUR BENEFITS</h3>n <div style="text-align:left;font-family:Helvetica,Arial,sans-serif;font-size:12.5px;margin-bottom:0;margin-top:3px;color:#999;line-height:135%;">At The Bandha Hotel & Suites, you will find benefits and privileges that provide convenience when you travel, including an exclusive rate, upgrade, airport transfer, and free night stay.</div>n </td>n </tr>n </table>n <!-- // CONTENT TABLE -->nn </td>n </tr>n </table>n </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // MODULE ROW -->nnn <!-- MODULE DIVIDER // -->n <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="0" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td align="center" valign="top" width="500" class="flexibleContainerCell">n <table class="flexibleContainerCellDivider" border="0" cellpadding="30" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top" style="padding-top:0px;padding-bottom:0px;">nn <!-- CONTENT TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top" style="border-top:2px solid #C8C8C8;"></td>n </tr>n </table>n <!-- // CONTENT TABLE -->nn </td>n </tr>n </table>n </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // END -->nnnnn <!-- MODULE ROW // -->n <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="30" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td style="padding-top:0;" align="center" valign="top" width="500" class="flexibleContainerCell">nn <!-- CONTENT TABLE // -->n <table align="left" border="0" cellpadding="0" cellspacing="0" class="flexibleContainer">n <tr>n <td align="left" valign="top" class="textContent">n <div style="text-align:left;font-family:Helvetica,Arial,sans-serif;font-size:12.5px;margin-bottom:0;margin-top:10px;color:#999;line-height:135%;">n To view your benefits, click here<br><br>n <img src="images/icon-fb.jpg" style="width: 37px;display: inline;">n <img src="images/icon-twitter.jpg" style="width: 37px;display: inline;">n <img src="images/icon-instagram.jpg" style="width: 37px;display: inline;">n <img src="images/icon-tripadvisor.jpg" style="width: 37px;display: inline;">n <br><br>n Jl. Padma Utara, Legian, Bali 80361 - Indonesia | T. +62 361 757150 | F. +62 361 756361n </div>n </td>n </tr>n </table>n <!-- // CONTENT TABLE -->nn </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // MODULE ROW -->nnnnnn <!-- MODULE ROW // -->n <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#816b46">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="0" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td align="center" valign="top" width="500" class="flexibleContainerCell">n <table border="0" cellpadding="30" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">nnnn </td>n </tr>n </table>n </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>n <!-- // MODULE ROW -->nn </table>n <!-- // END -->nnn <table bgcolor="#E1E1E1" border="0" cellpadding="0" cellspacing="0" width="500" id="emailFooter">nnn <tr>n <td align="center" valign="top">n <!-- CENTERING TABLE // -->n <table border="0" cellpadding="0" cellspacing="0" width="100%">n <tr>n <td align="center" valign="top">n <!-- FLEXIBLE CONTAINER // -->n <table border="0" cellpadding="0" cellspacing="0" width="500" class="flexibleContainer">n <tr>n <td align="center" valign="top" width="500" class="flexibleContainerCell">n <table border="0" cellpadding="30" cellspacing="0" width="100%">n <tr>n <td valign="top" bgcolor="#E1E1E1">nn <div style="font-family:Helvetica,Arial,sans-serif;font-size:13px;color:#828282;text-align:center;line-height:120%;">nn <div>If you do not want to recieve emails from us, you can <a href="#" target="_blank" style="text-decoration:none;color:#828282;"><span style="color:#828282;">unsubscribe</span></a>.</div>n </div>nn </td>n </tr>n </table>n </td>n </tr>n </table>n <!-- // FLEXIBLE CONTAINER -->n </td>n </tr>n </table>n <!-- // CENTERING TABLE -->n </td>n </tr>nn </table>n <!-- // END -->nn </td>n </tr>n </table>n </center>n</body>n</code></pre>nn<p></p>nn<p>the output in email is just one wording "Object"nWhat it that mean ? please help men................................................................................................................................................................................................................................................</p>n
""", """
<p>This is my project I have created a yoga app on android studio can someone review through the code to see if I have used the best practices of programming.Thank you.</p>nn<p>MainActivity:</p>nn<pre><code>package mo.youga;nnimport android.content.Intent;nimport android.os.Bundle;nimport android.support.v7.app.AppCompatActivity;nimport android.view.View;nimport android.widget.Button;nimport android.widget.ImageView;nnimport com.google.android.gms.ads.AdRequest;nimport com.google.android.gms.ads.MobileAds;nimport com.google.android.gms.ads.reward.RewardedVideoAd;nimport com.google.android.gms.ads.reward.RewardedVideoAdListener;nnnpublic class MainActivity extends AppCompatActivity {nnn //GOOGLE AD MOBn private RewardedVideoAd RewardedVideoAd;n //GOOGLE AD MOBnn Button Poses,Setting,Calendar;n ImageView Training;nn @Overriden protected void onCreate(Bundle savedInstanceState) {nn super.onCreate(savedInstanceState);n setContentView(R.layout.activity_main);n Poses=(Button)findViewById(R.id.Poses);n Setting=(Button)findViewById(R.id.Setting);n Training=(ImageView)findViewById(R.id.Training);n Calendar=(Button)findViewById(R.id.Calendar);nnn //listener for calendarn Calendar.setOnClickListener(new View.OnClickListener(){n @Overriden public void onClick(View view){n Intent intent= new Intent(MainActivity.this,Calendar.class);n startActivity(intent);n }nnn });nnnn //listener for trainingn Training.setOnClickListener(new View.OnClickListener(){n @Overriden public void onClick(View view){n Intent intent= new Intent(MainActivity.this,DailyTraining.class);n startActivity(intent);n }nnn });nnn //listener for settingn Setting.setOnClickListener(new View.OnClickListener(){n @Overriden public void onClick(View view){n Intent intent= new Intent(MainActivity.this,Setting.class);n startActivity(intent);n }n });nnn //listener for posesn Poses.setOnClickListener(new View.OnClickListener(){n @Overriden public void onClick(View view){n Intent intent= new Intent(MainActivity.this,ListOfPoses.class);n startActivity(intent);n }n });n/*n***********************************************************************************************************n* *********************************************************************************************************n* *********************************************************************************************************n* *********************************************************************************************************n */n //THIS IS GOOGLE AD MOBS FIX THISnn // AdMob app ID: ca-app-pub-4935262637979763~8258229167n MobileAds.initialize(this, "ca-app-pub-4935262637979763~8258229167");nn // Use an activity context to get the rewarded video instance.n RewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);n RewardedVideoAd.setRewardedVideoAdListener((RewardedVideoAdListener) this);nn //LOAD REWARDED VIDEO ADn loadRewardedVideoAd();nnnn }nn //GOOGLE ADS USE THISn //LOAD REWARDED VIDEO ADVERT AD MOBn private void loadRewardedVideoAd() {n RewardedVideoAd.loadAd("ca-app-pub-4935262637979763/2567026581",n new AdRequest.Builder().build());n }//ENDnnnnn}n</code></pre>nn<p>Setting:</p>nn<pre><code>package mo.youga;nnimport android.app.AlarmManager;nimport android.app.PendingIntent;nimport android.content.Context;nimport android.content.Intent;nimport android.os.Build;nimport android.support.annotation.IdRes;nimport android.support.annotation.RequiresApi;nimport android.support.v7.app.AppCompatActivity;nimport android.os.Bundle;nimport android.util.Log;nimport android.view.View;nimport android.widget.Button;nimport android.widget.RadioButton;nimport android.widget.RadioGroup;nimport android.widget.TimePicker;nimport android.widget.Toast;nimport android.widget.ToggleButton;n//IMPORTING FROM OWN PACKAGEnimport java.util.Calendar;nimport java.util.Date;nimport java.util.*;nimport java.io.*;nnimport mo.youga.Database.YougaDB;nnimport static android.icu.lang.UCharacter.GraphemeClusterBreak.T;nnnnpublic class Setting extends AppCompatActivity {nn Button Save;n RadioButton Easy, Intermediate, Difficult;n RadioGroup Group;n YougaDB yougaDB;n ToggleButton switchAlarm;n TimePicker timePicker;nn /*n protected <T extends View> T findViewById(@IdRes int id) {n return (T) getRootView().findViewById(id);n }nn this new class above will get the job done but it seems to cause errorn when i put it after the first protected classnn <T extends View> T findViewById()nn is the new way without causingn any casting errorsn */nn /*n alternatives to using above is using the common features of the View class they are:n .setVisibility(View.VISIBLE);n .onClick();n */nn //on createn @Overriden protected void onCreate(Bundle savedInstanceState) {n super.onCreate(savedInstanceState);n setContentView(R.layout.activity_setting_page);n Save=(Button)findViewById(R.id.Save).setVisibility(View.VISIBLE);n Group=(RadioGroup) findViewById(R.id.Group).setVisibility(View.VISIBLE);n Easy=(RadioButton) findViewById(R.id.Easy).setVisibility(View.VISIBLE);n Intermediate=(RadioButton) findViewById(R.id.Intermediate).setVisibility(View.VISIBLE);n Difficult=(RadioButton) findViewById(R.id.Difficult).setVisibility(View.VISIBLE);n switchAlarm=(ToggleButton) findViewById(R.id.switchAlarm).setVisibility(View.VISIBLE);n timePicker=(TimePicker) findViewById(R.id.timePicker).setVisibility(View.VISIBLE);n yougaDB=new YougaDB(this);nn //getting data from db and setting themn int mode=yougaDB.getSettingMode();n setRadioButton(mode);nn //eventn Save.setOnClickListener(new View.OnClickListener() {n @Overriden public void onClick(View v) {n saveWorkoutMode();n saveAlarm(switchAlarm.isChecked());n Toast.makeText(Setting.this, "Saved",Toast.LENGTH_SHORT).show();n finish();n }nnn });nnn }nn //save alarmn //alarmn private void saveAlarm(boolean checked) {n if(checked){n AlarmManager manager= (AlarmManager)getSystemService(Context.ALARM_SERVICE);n Intent intent=new Intent(Setting.this,AlarmNotificationReceiver.class);n PendingIntent pendingIntent=PendingIntent.getBroadcast(this,0,intent,0);nn //setting timen Calendar calendar= Calendar.getInstance();n Date Today= Calendar.getInstance().getTime();n calendar.set(Today.getDay(), Today.getMonth(), Today.getYear(),timePicker.getCurrentHour(), timePicker.getCurrentMinute());nn manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);nn //output messages for when the alarm will start safety measuren Log.d("", "Alarm Starts In: "+timePicker.getCurrentHour()+":"+timePicker.getCurrentMinute());nn /*n errors fixed via -> EFVn errors caused -> ECnn EC: gethour and getminuten EFV: getcurrenthour and getcurrentminuten */n }nn //cancelling alarmn else{nn AlarmManager manager= (AlarmManager)getSystemService(Context.ALARM_SERVICE);n Intent intent=new Intent(Setting.this,AlarmNotificationReceiver.class);n PendingIntent pendingIntent=PendingIntent.getBroadcast(this,0,intent,0);n manager.cancel(pendingIntent);nn }nn }nn //save workout moden //data will be saved to database on save workout moden private void saveWorkoutMode(){n int selectedID=Group.getCheckedRadioButtonId();n if(selectedID==Easy.getId()){n yougaDB.saveSettingMode(0);n } else if(selectedID==Intermediate.getId()){n yougaDB.saveSettingMode(1);n } else if(selectedID==Difficult.getId()){n yougaDB.saveSettingMode(2);n }n }nn //set radio buttonn private void setRadioButton(int mode){n if(mode==0){n Group.check(R.id.rdiEasy);// why the fuck is R in red i will kill youn } else if(mode==1){n Group.check(R.id.rdiIntermediate);// why the fuck is R in red i will kill youn } else if(mode==2){n Group.check(R.id.rdiDiffult);// why the fuck is R in red i will kill youn }nn }n}n</code></pre>nn<p>ViewPose:</p>nn<pre><code>package mo.youga;nnnimport java.util.*;nimport java.io.*;nnimport android.os.Bundle;nimport android.os.CountDownTimer;nimport android.support.design.widget.FloatingActionButton;nimport android.support.design.widget.Snackbar;nimport android.support.v7.app.AppCompatActivity;nimport android.support.v7.widget.Toolbar;nimport android.view.View;nimport android.widget.Button;nimport android.widget.ImageView;nimport android.widget.TextView;nimport android.widget.Toast;nimport android.content.Context;nnimport com.google.android.gms.ads.AdRequest;nimport com.google.android.gms.ads.MobileAds;nimport com.google.android.gms.ads.reward.RewardedVideoAd;nimport com.google.android.gms.ads.reward.RewardedVideoAdListener;nnimport mo.youga.Database.YougaDB;nimport mo.youga.Utilities.Random;nnpublic class ViewPose extends AppCompatActivity {nn //AD MOBn private RewardedVideoAd RewardedVideoAd;n //AD MOBn //variablesn int image_id;n String name;n TextView timer, title;n ImageView detail_image;n Button Start;nn boolean isRunning=false;nn YougaDB yougaDB;nn //on createn @Overriden protected void onCreate(Bundle savedInstanceState) {n super.onCreate(savedInstanceState);n setContentView(R.layout.activity_view_pose);n //youga dbn yougaDB=new YougaDB(this);nn //toolbarn Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);n setSupportActionBar(toolbar);n //floating action buttonn FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);n fab.setOnClickListener(new View.OnClickListener() {n @Overriden public void onClick(View view) {n Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)n .setAction("Action", null).show();n }n });nnnnn timer=(TextView)findViewById(R.id.timer);n title=(TextView)findViewById(R.id.title);n detail_image=(ImageView)findViewById(R.id.detail_image);n Start=(Button)findViewById(R.id.Start);n //set on click listenern Start.setOnClickListener(new View.OnClickListener() {n //on clickn @Overriden public void onClick(View v) {n if(!isRunning){n Start.setText("Finished");n int TimeLimit=0;n if(yougaDB.getSettingMode()==0){n TimeLimit= Random.TIME_LIMIT_EASY;n }else if(yougaDB.getSettingMode()==1){n TimeLimit= Random.TIME_LIMIT_INTERMEDIATE;n } else if(yougaDB.getSettingMode()==2){n TimeLimit= Random.TIME_LIMIT_DIFFICULT;n }nnn new CountDownTimer(TimeLimit, 1000){n @Overriden public void onTick(long l){n timer.setText("" + 1/1000);n }n // on finishn @Overriden public void onFinish(){n //ADD AD MOBS HERE TO ADD ADVERTS TO MAKE IT BETTERn //add advertsisement here to enhance this projectn Toast.makeText(ViewPose.this, "END", Toast.LENGTH_SHORT).show();n finish();nn }//on finish endnn }.start();n } else{n Toast.makeText(ViewPose.this, "END", Toast.LENGTH_SHORT).show();n finish();n }nn isRunning=!isRunning;nn }n });nnn timer.setText(" ");n if(getIntent() !=null){n image_id=getIntent().getIntExtra("image_id", -1);n name=getIntent().getStringExtra("name");n detail_image.setImageResource(image_id);n title.setText(name);n }n }nnnn}n</code></pre>nn<p>ListOfPoses:</p>nn<pre><code>package mo.youga;nnimport android.support.v7.app.AppCompatActivity;nimport android.os.Bundle;nimport android.support.v7.widget.LinearLayoutManager;nimport android.support.v7.app.AppCompatActivity;nimport android.os.Bundle;nimport android.support.v7.widget.RecyclerView;nimport android.widget.Button;nimport android.widget.ImageView;nimport android.widget.LinearLayout;nimport android.widget.ProgressBar;nimport android.widget.TextView;nnnimport java.util.ArrayList;nimport java.util.*;nimport java.io.*;nnimport mo.youga.Adapter.RecyclerViewAdapter;nimport mo.youga.ModelPackage.Poses;nnpublic class ListOfPoses extends AppCompatActivity {nnn List<Poses> poseList= new ArrayList<>();n RecyclerView.LayoutManager layoutManager;n RecyclerView recyclerView;n RecyclerViewAdapter adapter;nn //on createn @Overriden protected void onCreate(Bundle savedInstanceState) {n super.onCreate(savedInstanceState);n setContentView(R.layout.activity_list_of_poses);nn initData();//call to outer methodnn recyclerView=(RecyclerView)findViewById(R.id.list_p);n adapter=new RecyclerViewAdapter(poseList,getBaseContext());n layoutManager=new LinearLayoutManager(this);n recyclerView.setLayoutManager(layoutManager);n recyclerView.setAdapter(adapter);nn }nn //in it datan private void initData(){nn poseList.add(new Poses(R.drawable.alternativeheadstand, "Alternative Headstand Pose"));n poseList.add(new Poses(R.drawable.backwardstriangle, "Backwards Triangle Pose"));n poseList.add(new Poses(R.drawable.bentlegupwardfacingdog, "Bent Leg Upward Facing Dog Pose"));n poseList.add(new Poses(R.drawable.bowedtree, "Bowed Tree Pose"));n poseList.add(new Poses(R.drawable.compactcompass, "Compact Compass Pose"));n poseList.add(new Poses(R.drawable.cowface, "Cow Face Pose"));n poseList.add(new Poses(R.drawable.crow, "Crow Pose"));n poseList.add(new Poses(R.drawable.extendedhandtobigtoe, "Extended Hand To Big Toe Pose"));n poseList.add(new Poses(R.drawable.fishoutofheroprayer, "Fish Out Of Hero Prayer Pose"));n poseList.add(new Poses(R.drawable.forwardlungeprayer, "Forward Lunge Prayer Pose"));n poseList.add(new Poses(R.drawable.frog, "Frog Pose"));n poseList.add(new Poses(R.drawable.fullboat, "Full Boat Pose"));n poseList.add(new Poses(R.drawable.fullsplitarmsextended, "Full Split Arms Extended Pose"));n poseList.add(new Poses(R.drawable.halfboat, "Half Boat Pose"));n poseList.add(new Poses(R.drawable.handstotoes, "Hand To Feet Lotus Pose"));n poseList.add(new Poses(R.drawable.handtofeetlotus, "Hands To Toes Pose"));n poseList.add(new Poses(R.drawable.kingpigeon, "King Pigeon Pose"));n poseList.add(new Poses(R.drawable.locust1, "Locust 1 Pose"));n poseList.add(new Poses(R.drawable.locust2, "Locust 2 Pose"));n poseList.add(new Poses(R.drawable.lordofdancers1, "Lord Of Dancers 1 Pose"));n poseList.add(new Poses(R.drawable.lordofdancers2, "Lord Of Dancers 2 Pose"));n poseList.add(new Poses(R.drawable.lotus, "Lotus Pose"));n poseList.add(new Poses(R.drawable.revolvedextendedsideangle, "Revolved Extended Side Angle Pose"));n poseList.add(new Poses(R.drawable.revolvedheadtoknee, "Revolved Head To Knee Pose"));n poseList.add(new Poses(R.drawable.royalpigeon, "Royal Pigeon Pose"));n poseList.add(new Poses(R.drawable.sage1, "Sage 1 Pose"));n poseList.add(new Poses(R.drawable.sage2, "Sage 2 Pose"));n poseList.add(new Poses(R.drawable.scorpon, "Scorpion Pose"));n poseList.add(new Poses(R.drawable.seatedtwist, "Seated Twist Pose"));n poseList.add(new Poses(R.drawable.seatedwindrelease, "Seated Wind Release Pose"));n poseList.add(new Poses(R.drawable.sidecrab, "Side Crab Pose"));n poseList.add(new Poses(R.drawable.sidewardsplitlegged, "Sideward Split Legged Pose"));n poseList.add(new Poses(R.drawable.spinaltwist, "Spinal Twist Pose"));n poseList.add(new Poses(R.drawable.splitleggedabdomentwist1, "Spinal legged Abdomen Twist 1 Pose"));n poseList.add(new Poses(R.drawable.splitleggedabdomentwist2, "Spinal legged Abdomen Twist 2 Pose"));n poseList.add(new Poses(R.drawable.splitstancebow, "Split Stance Bow Pose"));n poseList.add(new Poses(R.drawable.supercow, "Super Cow Pose"));n poseList.add(new Poses(R.drawable.tree, "Tree Pose"));n poseList.add(new Poses(R.drawable.upwardfacingtwofootstaff, "Upward Facing Two Foot Staff Pose"));n poseList.add(new Poses(R.drawable.warrior1, "Warrior 1 Pose"));n poseList.add(new Poses(R.drawable.wheel, "Wheel Pose"));n poseList.add(new Poses(R.drawable.wideleggedabdomentwist, "Wide Legged Abdomen Twist Pose"));n }n}n</code></pre>nn<p>DailyTraining:</p>nn<pre><code>package mo.youga;nnimport android.os.CountDownTimer;nimport android.support.v7.app.AppCompatActivity;nimport android.os.Bundle;nimport android.view.View;nimport android.widget.Button;nimport android.widget.ImageView;nimport android.widget.LinearLayout;nimport android.widget.ProgressBar;nimport android.widget.TextView;nnimport java.util.ArrayList;nimport java.util.Calendar;nimport java.util.List;nnimport me.zhanghai.android.materialprogressbar.MaterialProgressBar;nimport mo.youga.Database.YougaDB;nimport mo.youga.ModelPackage.Poses;nimport mo.youga.Utilities.Random;nimport mo.youga.Utilities.Random;nnimport static android.support.v7.widget.AppCompatDrawableManager.get;nnnpublic class DailyTraining extends AppCompatActivity {n //variables or fieldsn Button Start;n ImageView image;n TextView GetReady, Countdown, Timer, Name;n ProgressBar progressBar;n LinearLayout layoutGetReady;n int id=0, timelimit=0;n List<Poses> list=new ArrayList<>();// ERROR:Pose<> FIX: Poses<>n YougaDB yougaDB;nn //on createn @Overriden protected void onCreate(Bundle savedInstanceState) {n super.onCreate(savedInstanceState);n setContentView(R.layout.activity_daily__training);nn initData();n //calling dbn yougaDB=new YougaDB(this);nn //dead coden /*n if(yougaDB.getSettingMode()==0){n timelimit= Common.TIME_LIMIT_EASY;n } else if(yougaDB.getSettingMode()==1){n timelimit= Common.TIME_LIMIT_INTERMEDIATE;n } else if(yougaDB.getSettingMode()==2){n timelimit= Common.TIME_LIMIT_DIFFICULT;n }n */nn Start=(Button)findViewById(R.id.Start);n image=(ImageView)findViewById(R.id.detail_image);n GetReady=(TextView)findViewById(R.id.GetReady);n Countdown=(TextView)findViewById(R.id.Countdown);n Timer=(TextView)findViewById(R.id.timer);n Name=(TextView)findViewById(R.id.title);n //layoutn layoutGetReady=(LinearLayout)findViewById(R.id.layout_get_ready);n //progressn progressBar=(MaterialProgressBar)findViewById(R.id.progressBar);n //setting datan progressBar.setMax(list.size());nn // set on click listenern Start.setOnClickListener(new View.OnClickListener() {n @Overriden public void onClick(View v) {nn if(Start.getText().toString().toLowerCase().equals("Start ")){nn showGetReady();//transferred on to methodn Start.setText("Done");nn } else if(Start.getText().toString().toLowerCase().equals("Done ")){n if(yougaDB.getSettingMode()==0){n poseEasyCountDown.start();n } else if(yougaDB.getSettingMode()==1){n poseIntermediateCountDown.start();n } else if(yougaDB.getSettingMode()==2){n poseDifficultCountDown.start();n }nn breakCountDown.cancel();//allows user to cancel out of count down timernnn if(id<list.size()){// ERROR: .SIZE() FIX:size()n showBreakTime();n id++;//ITERATIONn progressBar.setProgress(id);//show on notification barn Timer.setText(" ");//empty expressionn } else {n showFinished();n }nnn } else{n // will loop through the optionsn if(yougaDB.getSettingMode()==0){n poseEasyCountDown.start();n } else if(yougaDB.getSettingMode()==1){n poseIntermediateCountDown.start();n } else if(yougaDB.getSettingMode()==2){n poseDifficultCountDown.start();n }nn breakCountDown.cancel();// allows the user to take a breaknn if(id<list.size()){//ERROR: .size() FIX:n setPoseInfo(id);n } else{n showFinished();n }n }nnnnn }n }nnn );nn //info on posesn setPoseInfo(id);nnn }nn //show break time-alert the user to cool downn private void showBreakTime(){n //viewing imagen image.setVisibility(View.INVISIBLE);n //startn Start.setVisibility(View.VISIBLE);n //timern Timer.setVisibility(View.INVISIBLE);n //messagen Start.setText("Move On");n //layoutn layoutGetReady.setVisibility(View.VISIBLE);n breakCountDown.start();//allows the user to have their break so they can cool down to prevent injurynnnn GetReady.setText("Break Time! TIME TO COOL DOWN");n }nn //show get ready-alert the user to get readyn private void showGetReady(){n //viewing imagen image.setVisibility(View.INVISIBLE);n //startn Start.setVisibility(View.INVISIBLE);n //timern Timer.setVisibility(View.VISIBLE);n //layoutn layoutGetReady.setVisibility(View.VISIBLE);n GetReady.setText("Are You Ready?");n new CountDownTimer(7000,1000){nn @Overriden public void onTick(long millisUntilFinished) {n Countdown.setText(""+(1-1000)/1000);n }nn @Overriden public void onFinish() {n showPoses();n }n }.start();// will start the countdown message to be outputted to usern }nn //show posesn //has all the levels of all of the yoga posesn private void showPoses(){n if(id<list.size()){//ERROR:.size()n image.setVisibility(View.VISIBLE);n Start.setVisibility(View.VISIBLE);n layoutGetReady.setVisibility(View.INVISIBLE);nn //starts the countdown to be outputted to usern if(yougaDB.getSettingMode()==0){n poseEasyCountDown.start();n } else if(yougaDB.getSettingMode()==1){n poseIntermediateCountDown.start();n } else if(yougaDB.getSettingMode()==2){n poseDifficultCountDown.start();n }nnn image.setImageResource(list.get(id).getImage_id());//ERROR: .getIMAGEIDE() FIX:getImage_id()n Name.setText(list.get(id).getName());//ERROR: .get()nn } else {n showFinished();n }n }nn //countdown timer for each poses-: easy, intermediate, difficultn //easyn CountDownTimer poseEasyCountDown= new CountDownTimer(Random.TIME_LIMIT_EASY, 1000) {n @Overriden public void onTick(long millisUntilFinished) {n Timer.setText(""+(1/1000));nn }nn @Overriden public void onFinish() {n if(id<list.size()-1){//SIZE METHOD ERRORn id++;//iteraten progressBar.setProgress(id);n Timer.setText(" ");n //output info about the poses to the usern setPoseInfo(id);n Start.setText("STARTING");nn } else{n showFinished();n }n }n };nn //intermediaten CountDownTimer poseIntermediateCountDown= new CountDownTimer(Random.TIME_LIMIT_EASY, 1000) {n @Overriden public void onTick(long millisUntilFinished) {n Timer.setText(""+(1/1000));nn }nn @Overriden public void onFinish() {n if(id<list.size()-1){//SIZE METHOD ERRORn id++;//iteraten progressBar.setProgress(id);n Timer.setText(" ");n //output info about the poses to the usern setPoseInfo(id);n Start.setText("STARTING");nn } else{n showFinished();n }n }n };nn //diffcultn CountDownTimer poseDifficultCountDown= new CountDownTimer(Random.TIME_LIMIT_EASY, 1000) {n @Overriden public void onTick(long millisUntilFinished) {n Timer.setText(""+(1/1000));nn }nn @Overriden public void onFinish() {n if(id<list.size()-1){//SIZE METHOD ERRORn id++;//iteraten progressBar.setProgress(id);n Timer.setText(" ");n //output info about the poses to the usern setPoseInfo(id);n Start.setText("STARTING");nn } else{n showFinished();n }n }n };nn //countdown timer for breakn CountDownTimer breakCountDown= new CountDownTimer(10000, 1000) {n @Overriden public void onTick(long millisUntilFinished) {n Countdown.setText(""+(1/1000));nn }nn @Overriden public void onFinish() {n setPoseInfo(id);n showPoses();n }n };nn //show finishedn //finished outputn private void showFinished(){n image.setVisibility(View.INVISIBLE);n Start.setVisibility(View.INVISIBLE);n Timer.setVisibility(View.INVISIBLE);n progressBar.setVisibility(View.INVISIBLE);nn layoutGetReady.setVisibility(View.VISIBLE);n //outputs message to usern GetReady.setText("You Have Finished");n Countdown.setText("You Have Completed A Set Of Youga Poses, NAMASTE");n Countdown.setTextSize(30);n //data from user is saved in databasen yougaDB.saveDay(" "+Calendar.getInstance().getTimeInMillis());nnnn }nn //set poses infon //poses infon private void setPoseInfo(int id){n image.setImageResource(list.get(id).getImage_id());//.GET ERRORn Name.setText(list.get(id).getName());//.GET ERRORn //starting messagen Start.setText("Start Now");n //viewing imagen image.setVisibility(View.VISIBLE);n //startn Start.setVisibility(View.VISIBLE);n //timern Timer.setVisibility(View.VISIBLE);n //layoutn layoutGetReady.setVisibility(View.INVISIBLE);nnn }nn //in it datan //images of all the yoga posesn private void initData(){// ERRORS: ADD() + Pose() + IMAGES FIX: added new images and fixed the namesnn list.add(new Poses(R.drawable.alternativeheadstand, "Alternative Headstand Pose"));n list.add(new Poses(R.drawable.backwardstriangle, "Backwards Triangle Pose"));n list.add(new Poses(R.drawable.bentlegupwardfacingdog, "Bent Leg Upward Facing Dog Pose"));n list.add(new Poses(R.drawable.bowedtree, "Bowed Tree Pose"));n list.add(new Poses(R.drawable.compactcompass, "Compact Compass Pose"));n list.add(new Poses(R.drawable.cowface, "Cow Face Pose"));n list.add(new Poses(R.drawable.crow, "Crow Pose"));n list.add(new Poses(R.drawable.extendedhandtobigtoe, "Extended Hand To Big Toe Pose"));n list.add(new Poses(R.drawable.fishoutofheroprayer, "Fish Out Of Hero Prayer Pose"));n list.add(new Poses(R.drawable.forwardlungeprayer, "Forward Lunge Prayer Pose"));n list.add(new Poses(R.drawable.frog, "Frog Pose"));n list.add(new Poses(R.drawable.fullboat, "Full Boat Pose"));n list.add(new Poses(R.drawable.fullsplitarmsextended, "Full Split Arms Extended Pose"));n list.add(new Poses(R.drawable.halfboat, "Half Boat Pose"));n list.add(new Poses(R.drawable.handstotoes, "Hand To Feet Lotus Pose"));n list.add(new Poses(R.drawable.handtofeetlotus, "Hands To Toes Pose"));n list.add(new Poses(R.drawable.kingpigeon, "King Pigeon Pose"));n list.add(new Poses(R.drawable.locust1, "Locust 1 Pose"));n list.add(new Poses(R.drawable.locust2, "Locust 2 Pose"));n list.add(new Poses(R.drawable.lordofdancers1, "Lord Of Dancers 1 Pose"));n list.add(new Poses(R.drawable.lordofdancers2, "Lord Of Dancers 2 Pose"));n list.add(new Poses(R.drawable.lotus, "Lotus Pose"));n list.add(new Poses(R.drawable.revolvedextendedsideangle, "Revolved Extended Side Angle Pose"));n list.add(new Poses(R.drawable.revolvedheadtoknee, "Revolved Head To Knee Pose"));n list.add(new Poses(R.drawable.royalpigeon, "Royal Pigeon Pose"));n list.add(new Poses(R.drawable.sage1, "Sage 1 Pose"));n list.add(new Poses(R.drawable.sage2, "Sage 2 Pose"));n list.add(new Poses(R.drawable.scorpon, "Scorpion Pose"));n list.add(new Poses(R.drawable.seatedtwist, "Seated Twist Pose"));n list.add(new Poses(R.drawable.seatedwindrelease, "Seated Wind Release Pose"));n list.add(new Poses(R.drawable.sidecrab, "Side Crab Pose"));n list.add(new Poses(R.drawable.sidewardsplitlegged, "Sideward Split Legged Pose"));n list.add(new Poses(R.drawable.spinaltwist, "Spinal Twist Pose"));n list.add(new Poses(R.drawable.splitleggedabdomentwist1, "Spinal legged Abdomen Twist 1 Pose"));n list.add(new Poses(R.drawable.splitleggedabdomentwist2, "Spinal legged Abdomen Twist 2 Pose"));n list.add(new Poses(R.drawable.splitstancebow, "Split Stance Bow Pose"));n list.add(new Poses(R.drawable.supercow, "Super Cow Pose"));n list.add(new Poses(R.drawable.tree, "Tree Pose"));n list.add(new Poses(R.drawable.upwardfacingtwofootstaff, "Upward Facing Two Foot Staff Pose"));n list.add(new Poses(R.drawable.warrior1, "Warrior 1 Pose"));n list.add(new Poses(R.drawable.wheel, "Wheel Pose"));n list.add(new Poses(R.drawable.wideleggedabdomentwist, "Wide Legged Abdomen Twist Pose"));n }n}//END OF CLASSn</code></pre>nn<p>Calendar:</p>nn<pre><code>package mo.youga;nnimport android.support.v7.app.AppCompatActivity;nimport android.os.Bundle;nnimport com.prolificinteractive.materialcalendarview.CalendarDay;nimport com.prolificinteractive.materialcalendarview.DayViewDecorator;nimport com.prolificinteractive.materialcalendarview.DayViewFacade;nimport com.prolificinteractive.materialcalendarview.MaterialCalendarView;nnimport java.util.Date;nimport java.util.HashSet;nimport java.util.List;nnimport mo.youga.Database.YougaDB;n//import mo.youga.Custom;npublic class Calendar extends AppCompatActivity {nn //variablesn MaterialCalendarView materialCalendarView;n HashSet<CalendarDay> list=new HashSet<>();n YougaDB yougaDB;nn // on createn @Overriden protected void onCreate(Bundle savedInstanceState) {n super.onCreate(savedInstanceState);n setContentView(R.layout.activity_calendar);n YougaDB yougaDB=new YougaDB(this);n materialCalendarView=(MaterialCalendarView)findViewById(R.id.calendar);//ERROR: Rn List<String>workoutDays=yougaDB.getWorkoutDays();//get data from db and convert it into hashsetn HashSet<CalendarDay>conversion=new HashSet<>();n for(String value: workoutDays){n conversion.add(CalendarDay.from(new Date(Long.parseLong(value))));n }//forn materialCalendarView.addDecorator(new WorkoutDoneDecorator(conversion));//ERROR: Custom FIX:n }//oncreatenn private class WorkoutDoneDecorator implements DayViewDecorator {nn public WorkoutDoneDecorator(HashSet<CalendarDay> conversion) {nn }nn @Overriden public boolean shouldDecorate(CalendarDay day) {n return false;n }nn @Overriden public void decorate(DayViewFacade view) {nn }n }n}n</code></pre>nn<p>AlarmNotificationReceiver:</p>nn<pre><code>package mo.youga;nnimport android.app.Notification;nimport android.app.NotificationManager;nimport android.content.BroadcastReceiver;nimport android.content.Context;nimport android.content.Intent;nimport android.support.v4.app.NotificationCompat;nnpublic class AlarmNotificationReceiver extends BroadcastReceiver {nn //on receiven @Overriden public void onReceive(Context context, Intent intent) {n NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "CHANNEL_ID");n //NotificationCompat.Builder builder=new NotificationCompat.Builder(context);n builder.setAutoCancel(true)n .setDefaults(Notification.DEFAULT_ALL)n .setWhen(System.currentTimeMillis())n .setSmallIcon(R.mipmap.io_launcher_round)n .setTicker("abcd")//definen .setContentTitle("Time")n .setContent("Training Time")n .setContentInfo("Information");nn // NotificationManager notificationManager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);n //notificationManager.notify(1,builder.build());nn NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);n notificationManager.notify(1, builder.build());nn }n //set whenn public void setWhen(long when) {n when=when;n }n}n</code></pre>nn<p>Random:</p>nn<pre><code>package mo.youga.Utilities;nnpublic class Random {nn public static final int TIME_LIMIT_EASY=10000;n public static final int TIME_LIMIT_INTERMEDIATE=20000;n public static final int TIME_LIMIT_DIFFICULT=30000;nnnnn}n</code></pre>nn<p>Poses:</p>nn<pre><code>package mo.youga.ModelPackage;nnpublic class Poses {nn private int image_id;n private String name;nn public Poses(int image_id, String name){n this.image_id=image_id;n this.name=name;n }nn public int getImage_id(){n return image_id;n }nn public void setImage_id(int image_id) {n this.image_id = image_id;n }nn public String getName(){n return name;n }nn public void setName(String name) {n this.name = name;n }nnnn}n</code></pre>nn<p>ItemClickListener:</p>nn<pre><code>package mo.youga.Interface;nnimport android.view.View;nnpublic interface ItemClickListener {nn void onClick(View view, int position);n}n</code></pre>nn<p>YougaDB:</p>nn<pre><code>package mo.youga.Database;nnimport android.content.Context;nimport android.database.Cursor;nimport android.database.sqlite.SQLiteDatabase;nimport android.database.sqlite.SQLiteQueryBuilder;nnnimport com.readystatesoftware.sqliteasset.SQLiteAssetHelper;nnimport java.util.ArrayList;nimport java.util.List;nnpublic class YougaDB extends SQLiteAssetHelper {nn private static final String DB_NAME="Youga.db";n private static final int DB_VER=1;nn //youga dbn public YougaDB(Context context) {n super(context, DB_NAME, null, DB_VER);n }nn //get setting moden //function to INSERT data into tablen public int getSettingMode(){n SQLiteDatabase db= getReadableDatabase();n SQLiteQueryBuilder qb= new SQLiteQueryBuilder();n String [] sqlSelect={"Mode"};n String sqlTable="Setting";n qb.setTables(sqlTable);n Cursor cursor = qb.query(db,sqlSelect,null,null,null,null,null);n cursor.moveToFirst();n return cursor.getInt(cursor.getColumnIndex("Mode"));n }nn //save setting moden //function to SAVE data into tablen public void saveSettingMode(int value){n SQLiteDatabase db=getReadableDatabase();n String query= "UPDATE Setting SET Mode = "+ value;n db.execSQL(query);n }nn // get workout daysn //reading and writing to new tablen public List<String> getWorkoutDays(){n SQLiteDatabase db= getReadableDatabase();n SQLiteQueryBuilder qb= new SQLiteQueryBuilder();nn String [] sqlSelect={"Day"};n String sqlTable="Workout Days";n qb.setTables(sqlTable);n Cursor cursor = qb.query(db,sqlSelect,null,null,null,null,null);nn //list interface implementationn List<String> result=new ArrayList<String>();n if(cursor.moveToFirst()){n do {n result.add(cursor.getString(cursor.getColumnIndex("Day")));n } while(cursor.moveToNext());{// <--ADDED A ; HERE IF ERROR DELETE ;nn }n }nn return result;nn }nn // save dayn //setting mode for new tablen public void saveDay(String value){n SQLiteDatabase db=getReadableDatabase();n String query= String.format("INSERT INTO WorkoutDays(Day) VALUES('%s'):", value);n db.execSQL(query);n }nn}n</code></pre>nn<p>WorkoutDoneDecorator:</p>nn<pre><code>package mo.youga.Custom;nnimport android.graphics.Color;nimport android.graphics.drawable.ColorDrawable;nnimport com.prolificinteractive.materialcalendarview.CalendarDay;nimport com.prolificinteractive.materialcalendarview.DayViewDecorator;nimport com.prolificinteractive.materialcalendarview.DayViewFacade;nimport java.util.*;nimport java.io.*;nimport java.util.HashSet;nnpublic class WorkoutDoneDecorator implements DayViewDecorator {nn HashSet<CalendarDay>list;n ColorDrawable colorDrawable;nn //constructorn public WorkoutDoneDecorator(HashSet<CalendarDay>list){n this.list=list;n colorDrawable=new ColorDrawable(Color.parseColor("#111111"));n }nn @Overriden public boolean shouldDecorate(CalendarDay day) {n return list.contains(day);n }nn @Overriden public void decorate(DayViewFacade view) {n view.setBackgroundDrawable(colorDrawable);n }n}n</code></pre>nn<p>RecyclerViewAdapter:</p>nn<pre><code>package mo.youga.Adapter;nnimport android.content.Context;nimport android.content.Intent;nimport android.support.v7.widget.RecyclerView;nimport android.view.LayoutInflater;nimport android.view.View;nimport android.view.ViewGroup;nimport android.widget.ImageView;nimport android.widget.TextView;nimport android.support.v7.widget.RecyclerView.ViewHolder;nimport android.widget.Toast;nn//import own classesnimport mo.youga.Interface.ItemClickListener;nimport mo.youga.ModelPackage.Poses;nimport mo.youga.R;//FUCKING BASTARD I WILL KILL YOU FOR CAUSING AN ERRORnimport mo.youga.ViewPose;nnimport java.util.*;nimport java.io.*;nn//recycler view holdernnclass RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{nn public ImageView image;n public TextView text;n private ItemClickListener itemClickListener;nn public RecyclerViewHolder(View itemView){n super(itemView);n image=(ImageView)itemView.findViewById(R.id.ex_img);n text=(TextView)itemView.findViewById(R.id.ex_name);n itemView.setOnClickListener(this);n }nn //set item click listenern public void setItemClickListener(ItemClickListener itemClickListener){n this.itemClickListener=itemClickListener;n }nnn //on clickn @Overriden public void onClick(View view){n itemClickListener.onClick(view,getAdapterPosition());n }nn}nn//recycler view adapternpublic class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolder>{// timestamp- 17:00nn private List<Poses>poseList;n private Context context;nn public RecyclerViewAdapter(List<Poses>poseList,Context context ){n this.poseList=poseList;n this.context=context;n }nn @Overriden public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType){n LayoutInflater inflater=LayoutInflater.from(parent.getContext());n View itemView=inflater.inflate(R.layout.item_pose,parent,false);n return new RecyclerViewHolder(itemView);n }//recycler view holdernn //on bind view holdern @Overriden public void onBindViewHolder(RecyclerViewHolder holder, int position){n holder.image.setImageResource(poseList.get(position).getImage_id());n holder.text.setText(poseList.get(position).getName());nn holder.setItemClickListener(new ItemClickListener() {n @Overriden public void onClick(View view, int position) {n Intent intent=new Intent(context, ViewPose.class);n intent.putExtra("image", poseList.get(position).getImage_id());n intent.putExtra("name", poseList.get(position).getName());n context.startActivity(intent);n }n });n }//on bind view holdernn //get item countn public int getItemCount(){n return poseList.size();n }//get item countnnnn}//recycler view adapter endsn</code></pre>n
""", """
<p>The goal is to make a word generator. The program takes a wordlist (typically, it may be the full dictionary of a language, or a list of names), analyses it, and then invents word that sound alike the one in the list.<br>nThere is multiple parts of the program, which is embedded in a Qt GUI. I used Qt Creator 4.9.2 (based on Qt 5.12.4, GCC 5.3.1, 64 bits).</p>nn<p>It is all mostly in french (variable names and UI texts), sorry about that. I commented in English, I hope it's enough. </p>nn<p>About how the program works :<br>nAnalysing the word means noting an occurence for each succession of caracter present in this word. If a succession of caracters appear in multiple words, multiple occurences are noted and hence it is more probable to generate this succession.<br>nIn the fonction.h, analysis is made by 'analyseWord', but it only handles ASCII characters, so I made another version 'QanalyseWord' using Qchar instead of char (hence any utf-8 character).<br>nDepending on the type of analysis made, word generation is made by 'generateur' or 'Qgenerateur'</p>nn<p>For the program itself, the main.cpp is only what's needed to launch the mainwindow ("FenetrePrincipale")</p>nn<pre class="lang-cpp prettyprint-override"><code>#include <QtWidgets>n#include "fenetreprincipale.h"n#include "fonctions.h"nnint main(int argc, char *argv[])n{n QApplication app(argc, argv);nn srand( static_cast<unsigned int>(time(NULL)));nn /*Traduction of Qt texts to Fr*/n QString locale = QLocale::system().name().section('_', 0, 0);n QTranslator translator;n translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));n app.installTranslator(&translator);n /*end*/nn FenetrePrincipale fenetre;n fenetre.show();nn return app.exec();nn}n</code></pre>nn<p>FenetrePrincipale handles all the interaction of the program. It has two tabs (one for analysis, one for generating words).nIts .ui file is :</p>nn<pre><code><?xml version="1.0" encoding="UTF-8"?>n<ui version="4.0">n <class>FenetrePrincipale</class>n <widget class="QMainWindow" name="FenetrePrincipale">n <property name="geometry">n <rect>n <x>0</x>n <y>0</y>n <width>702</width>n <height>539</height>n </rect>n </property>n <property name="font">n <font>n <pointsize>10</pointsize>n </font>n </property>n <property name="windowTitle">n <string>GeMots</string>n </property>n <widget class="QWidget" name="centralwidget">n <layout class="QGridLayout" name="gridLayout">n <item row="0" column="1">n <widget class="QTabWidget" name="tabWidget">n <property name="currentIndex">n <number>0</number>n </property>n <widget class="QWidget" name="onglet_analyse">n <attribute name="title">n <string>Analyse d'une liste de mots</string>n </attribute>n <layout class="QGridLayout" name="gridLayout_4">n <item row="6" column="0">n <widget class="QProgressBar" name="progr_Analyse">n <property name="sizePolicy">n <sizepolicy hsizetype="Expanding" vsizetype="Minimum">n <horstretch>0</horstretch>n <verstretch>0</verstretch>n </sizepolicy>n </property>n <property name="minimumSize">n <size>n <width>0</width>n <height>15</height>n </size>n </property>n <property name="value">n <number>0</number>n </property>n </widget>n </item>n <item row="3" column="0">n <spacer name="verticalSpacer_2">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>20</width>n <height>40</height>n </size>n </property>n </spacer>n </item>n <item row="4" column="0">n <widget class="QPushButton" name="bouton_analyser">n <property name="font">n <font>n <pointsize>12</pointsize>n </font>n </property>n <property name="text">n <string>Lancer l'analyse</string>n </property>n </widget>n </item>n <item row="2" column="0">n <widget class="QFrame" name="frame_mode">n <property name="frameShape">n <enum>QFrame::Panel</enum>n </property>n <property name="frameShadow">n <enum>QFrame::Sunken</enum>n </property>n <layout class="QGridLayout" name="gridLayout_2">n <item row="3" column="1" colspan="2">n <widget class="QRadioButton" name="radio_speciaux">n <property name="toolTip">n <string>C'est beau l'utf-8, mais c'est chiant à utiliser !</string>n </property>n <property name="text">n <string>Gère tout les caractères spéciaux</string>n </property>n <property name="checked">n <bool>true</bool>n </property>n </widget>n </item>n <item row="0" column="4" rowspan="4">n <widget class="Line" name="line_details">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n </widget>n </item>n <item row="4" column="0">n <widget class="QLabel" name="label_lcoh">n <property name="text">n <string>Longueur de cohérence :</string>n </property>n <property name="alignment">n <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>n </property>n </widget>n </item>n <item row="4" column="1">n <widget class="QSpinBox" name="spin_lcoh">n <property name="accelerated">n <bool>true</bool>n </property>n <property name="suffix">n <string> lettres</string>n </property>n <property name="minimum">n <number>2</number>n </property>n <property name="value">n <number>3</number>n </property>n </widget>n </item>n <item row="0" column="3">n <widget class="QLabel" name="Qualite">n <property name="font">n <font>n <weight>75</weight>n <bold>true</bold>n </font>n </property>n <property name="text">n <string>Qualité</string>n </property>n <property name="alignment">n <set>Qt::AlignCenter</set>n </property>n </widget>n </item>n <item row="3" column="5">n <widget class="QLabel" name="Bof">n <property name="toolTip">n <string>Pour ce que le programme fait (lire des suites de lettres. Noter le nombre d'occurence),ncette méthode est honteusement longue</string>n </property>n <property name="styleSheet">n <string notr="true">color: rgb(223, 177, 19);</string>n </property>n <property name="text">n <string>Bof</string>n </property>n <property name="alignment">n <set>Qt::AlignCenter</set>n </property>n </widget>n </item>n <item row="1" column="5">n <widget class="QLabel" name="Parfait_2">n <property name="toolTip">n <string>C'est presque instantanné. Normal, y a vraiment pas besoin d'un supercalculateur pour faire ça</string>n </property>n <property name="styleSheet">n <string notr="true">color: rgb(44, 161, 40);</string>n </property>n <property name="text">n <string>Parfait</string>n </property>n <property name="alignment">n <set>Qt::AlignCenter</set>n </property>n </widget>n </item>n <item row="2" column="3">n <widget class="QLabel" name="Bof_2">n <property name="toolTip">n <string>On génère pas des mots accentués. Et en plus, ça gère pas les tirets</string>n </property>n <property name="styleSheet">n <string notr="true">color: rgb(223, 177, 19);</string>n </property>n <property name="text">n <string>Bof</string>n </property>n <property name="alignment">n <set>Qt::AlignCenter</set>n </property>n </widget>n </item>n <item row="1" column="3">n <widget class="QLabel" name="Minable">n <property name="toolTip">n <string>J'voulais pas faire un truc pour les anglais, moi !</string>n </property>n <property name="styleSheet">n <string notr="true">color: rgb(255, 0, 0);</string>n </property>n <property name="text">n <string>Minable</string>n </property>n <property name="alignment">n <set>Qt::AlignCenter</set>n </property>n </widget>n </item>n <item row="0" column="5">n <widget class="QLabel" name="Rapidite">n <property name="font">n <font>n <weight>75</weight>n <bold>true</bold>n </font>n </property>n <property name="text">n <string>Rapidité</string>n </property>n <property name="alignment">n <set>Qt::AlignCenter</set>n </property>n </widget>n </item>n <item row="3" column="3">n <widget class="QLabel" name="Parfait">n <property name="toolTip">n <string>Testez avec le Japonnais ! Promis, ça marche !</string>n </property>n <property name="styleSheet">n <string notr="true">color: rgb(44, 161, 40);</string>n </property>n <property name="text">n <string>Parfait</string>n </property>n <property name="alignment">n <set>Qt::AlignCenter</set>n </property>n </widget>n </item>n <item row="2" column="5">n <widget class="QLabel" name="Minable_2">n <property name="toolTip">n <string>En même temps, c'est codé avec les pieds</string>n </property>n <property name="styleSheet">n <string notr="true">color: rgb(255, 0, 0);</string>n </property>n <property name="text">n <string>Minable</string>n </property>n <property name="alignment">n <set>Qt::AlignCenter</set>n </property>n </widget>n </item>n <item row="1" column="1" colspan="2">n <widget class="QRadioButton" name="radio_ignore">n <property name="toolTip">n <string>Les lettres accentuées sont supprimée par l'analyse : on regarde le mot &quot;ttt&quot; au lieu de &quot;étêtât&quot;nIl vaut donc mieux que la liste de mots originale soit sans accents</string>n </property>n <property name="text">n <string>Ignore les accents</string>n </property>n </widget>n </item>n <item row="2" column="1" colspan="2">n <widget class="QRadioButton" name="radio_minable">n <property name="toolTip">n <string>Ces caractères spéciaux sont remplacé par leur valeur non-accentué :nÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûüÿÑñÇçnMais ce traitement est long et nul ! Oui, mais je me suis fait chier à le coder, je vais pas le supprimer...</string>n </property>n <property name="text">n <string>Gère très mal les accents</string>n </property>n </widget>n </item>n <item row="4" column="5">n <widget class="QPushButton" name="bouton_details">n <property name="font">n <font>n <pointsize>8</pointsize>n </font>n </property>n <property name="text">n <string>(+ détails)</string>n </property>n <property name="flat">n <bool>true</bool>n </property>n </widget>n </item>n <item row="0" column="0">n <widget class="QLabel" name="label_mode">n <property name="text">n <string>Mode de traitement :</string>n </property>n </widget>n </item>n <item row="4" column="2" colspan="3">n <spacer name="horizontalSpacer">n <property name="orientation">n <enum>Qt::Horizontal</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>40</width>n <height>20</height>n </size>n </property>n </spacer>n </item>n </layout>n </widget>n </item>n <item row="5" column="0">n <spacer name="verticalSpacer_3">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>20</width>n <height>40</height>n </size>n </property>n </spacer>n </item>n <item row="1" column="0">n <spacer name="verticalSpacer">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>20</width>n <height>40</height>n </size>n </property>n </spacer>n </item>n <item row="9" column="0">n <spacer name="verticalSpacer_5">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>20</width>n <height>40</height>n </size>n </property>n </spacer>n </item>n <item row="0" column="0">n <widget class="QFrame" name="frame_choixListe">n <property name="frameShape">n <enum>QFrame::Panel</enum>n </property>n <property name="frameShadow">n <enum>QFrame::Sunken</enum>n </property>n <layout class="QGridLayout" name="gridLayout_3">n <item row="1" column="0" colspan="2">n <widget class="QRadioButton" name="radio_langDef">n <property name="text">n <string>Utiliser la langue par défaut (////Nom liste défaut////)</string>n </property>n <property name="checked">n <bool>true</bool>n </property>n </widget>n </item>n <item row="2" column="0">n <widget class="QRadioButton" name="radio_langPerso">n <property name="text">n <string>Choisir une liste de mot</string>n </property>n </widget>n </item>n <item row="0" column="0" colspan="2">n <widget class="QLabel" name="label_choixLang">n <property name="text">n <string>Choix de la liste de mots à analyser :</string>n </property>n </widget>n </item>n <item row="2" column="1">n <widget class="QPushButton" name="bouton_selecFichier">n <property name="text">n <string>(Aucun)</string>n </property>n </widget>n </item>n </layout>n </widget>n </item>n </layout>n </widget>n <widget class="QWidget" name="onglet_generation">n <property name="enabled">n <bool>false</bool>n </property>n <attribute name="title">n <string>Génération de mots</string>n </attribute>n <layout class="QGridLayout" name="gridLayout_5">n <item row="4" column="1">n <spacer name="verticalSpacer_6">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>20</width>n <height>40</height>n </size>n </property>n </spacer>n </item>n <item row="2" column="0">n <widget class="QLabel" name="label_tailleMots">n <property name="text">n <string>Taille max des mots</string>n </property>n </widget>n </item>n <item row="9" column="2">n <spacer name="horizontalSpacer_3">n <property name="orientation">n <enum>Qt::Horizontal</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>40</width>n <height>20</height>n </size>n </property>n </spacer>n </item>n <item row="10" column="2">n <widget class="QPushButton" name="bouton_trier">n <property name="text">n <string>Trier par taille</string>n </property>n </widget>n </item>n <item row="11" column="2">n <widget class="QPushButton" name="bouton_nettoyer">n <property name="text">n <string>Nettoyer</string>n </property>n </widget>n </item>n <item row="5" column="0" colspan="2">n <widget class="QCheckBox" name="check_forcerTaille">n <property name="layoutDirection">n <enum>Qt::RightToLeft</enum>n </property>n <property name="text">n <string>Forcer la taille des mots</string>n </property>n </widget>n </item>n <item row="2" column="1">n <widget class="QSpinBox" name="spin_tailleMax">n <property name="suffix">n <string> lettres</string>n </property>n <property name="minimum">n <number>2</number>n </property>n <property name="singleStep">n <number>2</number>n </property>n <property name="value">n <number>20</number>n </property>n </widget>n </item>n <item row="0" column="3" rowspan="13">n <widget class="QTextEdit" name="text_mots"/>n </item>n <item row="1" column="1">n <widget class="QSpinBox" name="spin_nbMots">n <property name="minimum">n <number>1</number>n </property>n <property name="value">n <number>1</number>n </property>n </widget>n </item>n <item row="6" column="0" colspan="2">n <widget class="QCheckBox" name="check_troll">n <property name="layoutDirection">n <enum>Qt::RightToLeft</enum>n </property>n <property name="text">n <string>Génération de mots parfaits</string>n </property>n </widget>n </item>n <item row="1" column="0">n <widget class="QLabel" name="label_nbMots">n <property name="text">n <string>Nombre de mots</string>n </property>n </widget>n </item>n <item row="10" column="0" rowspan="2" colspan="2">n <widget class="QFrame" name="fram_resume">n <property name="frameShape">n <enum>QFrame::Box</enum>n </property>n <property name="frameShadow">n <enum>QFrame::Sunken</enum>n </property>n <layout class="QVBoxLayout" name="verticalLayout">n <item>n <widget class="QLabel" name="label_resume_analyse">n <property name="text">n <string>Type d'analyse : //type//</string>n </property>n </widget>n </item>n <item>n <widget class="QLabel" name="label_resume_lcoh">n <property name="text">n <string>Longueur de cohérence : //lcoh//</string>n </property>n </widget>n </item>n </layout>n </widget>n </item>n <item row="3" column="0" colspan="3">n <widget class="QPushButton" name="bouton_generer">n <property name="font">n <font>n <pointsize>12</pointsize>n </font>n </property>n <property name="text">n <string>Inventer des mots</string>n </property>n </widget>n </item>n <item row="8" column="1">n <spacer name="verticalSpacer_7">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>20</width>n <height>40</height>n </size>n </property>n </spacer>n </item>n <item row="7" column="1">n <spacer name="verticalSpacer_8">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>20</width>n <height>40</height>n </size>n </property>n </spacer>n </item>n <item row="9" column="0">n <widget class="QLabel" name="label">n <property name="text">n <string>Analyse utilisée :</string>n </property>n <property name="alignment">n <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>n </property>n </widget>n </item>n <item row="9" column="1">n <spacer name="verticalSpacer_4">n <property name="orientation">n <enum>Qt::Vertical</enum>n </property>n <property name="sizeHint" stdset="0">n <size>n <width>20</width>n <height>40</height>n </size>n </property>n </spacer>n </item>n </layout>n </widget>n </widget>n </item>n </layout>n </widget>n <widget class="QMenuBar" name="menubar">n <property name="geometry">n <rect>n <x>0</x>n <y>0</y>n <width>702</width>n <height>23</height>n </rect>n </property>n <widget class="QMenu" name="menuMenu">n <property name="title">n <string>Menu</string>n </property>n <widget class="QMenu" name="menuQuitter">n <property name="title">n <string>Quitter</string>n </property>n <widget class="QMenu" name="menuQuitter_2">n <property name="title">n <string>Quitter</string>n </property>n <addaction name="actionNe_pas_quitter"/>n <addaction name="actionNe_pas_quitter_2"/>n <addaction name="actionNe_pas_quitter_3"/>n <addaction name="actionQuitter_3"/>n <addaction name="actionNe_pas_quitter_4"/>n </widget>n <addaction name="menuQuitter_2"/>n </widget>n <addaction name="separator"/>n <addaction name="actionUtiliser_les_valeur_actuelles_par_defaut"/>n <addaction name="separator"/>n <addaction name="menuQuitter"/>n </widget>n <widget class="QMenu" name="menuA_propos">n <property name="title">n <string>A propos</string>n </property>n <addaction name="actionAide"/>n <addaction name="action_propos_de_ce_programme"/>n </widget>n <addaction name="menuMenu"/>n <addaction name="menuA_propos"/>n </widget>n <widget class="QStatusBar" name="statusbar"/>n <action name="actionQuitter_3">n <property name="text">n <string>Ha oui, quitter</string>n </property>n </action>n <action name="actionNe_pas_quitter">n <property name="text">n <string>Ne pas quitter</string>n </property>n </action>n <action name="actionNe_pas_quitter_2">n <property name="text">n <string>Ne pas quitter</string>n </property>n </action>n <action name="actionNe_pas_quitter_3">n <property name="text">n <string>Ne pas quitter</string>n </property>n </action>n <action name="actionNe_pas_quitter_4">n <property name="text">n <string>Ne pas quitter</string>n </property>n </action>n <action name="actionUtiliser_les_valeur_actuelles_par_defaut">n <property name="text">n <string>Changer les valeurs par défaut</string>n </property>n </action>n <action name="actionCharger_automatiquement_la_liste_de_mot_par_d_faut">n <property name="checkable">n <bool>true</bool>n </property>n <property name="text">n <string>Charger la liste par défaut au lancement</string>n </property>n </action>n <action name="actionAnalyser_la_liste_par_d_faut_au_lancement">n <property name="checkable">n <bool>true</bool>n </property>n <property name="text">n <string>Analyser la liste par défaut au lancement</string>n </property>n </action>n <action name="actionAide">n <property name="text">n <string>Aide</string>n </property>n </action>n <action name="action_propos_de_ce_programme">n <property name="text">n <string>À propos de ce programme</string>n </property>n </action>n </widget>n <resources/>n <connections>n <connection>n <sender>radio_speciaux</sender>n <signal>toggled(bool)</signal>n <receiver>spin_lcoh</receiver>n <slot>setEnabled(bool)</slot>n <hints>n <hint type="sourcelabel">n <x>318</x>n <y>320</y>n </hint>n <hint type="destinationlabel">n <x>255</x>n <y>351</y>n </hint>n </hints>n </connection>n </connections>n</ui>n</code></pre>nn<p>then, the .h file :</p>nn<pre class="lang-cpp prettyprint-override"><code>#ifndef FENETREPRINCIPALE_Hn#define FENETREPRINCIPALE_Hnn#include <QMainWindow>n#include <QProgressBar>n#include "fonctions.h"n#include "fenaide.h"n#include "infos.h"nnnamespace Ui {nclass FenetrePrincipale; //=Main Windown}nnclass FenetrePrincipale : public QMainWindown{n Q_OBJECTnnpublic:n explicit FenetrePrincipale(QWidget *parent = 0);n ~FenetrePrincipale();nn enum type_Trait {aucun, ascii, asciiplus, utf_8};n type_Trait selectedTrait();n type_Trait stringToType(QString stringType);nnpublic slots:n //Analyses a wordlistn void on_bouton_analyser_clicked();n //Generates a word based on previously analysed wordlistn void on_bouton_generer_clicked();nn //Choose path to the wordlistn void on_bouton_selecFichier_clicked();n //Adds detail on the 3 possible analysesn void on_bouton_details_clicked();nn //Removes all generated wordsn void on_bouton_nettoyer_clicked();n //Sort generated words by lenghtn void on_bouton_trier_clicked();nn //Menu icon 'Aide'n void on_actionAide_triggered();n //Menu icon 'About'n void on_action_propos_de_ce_programme_triggered();n //Change the default values of the Analyse tab to the current values.n void on_actionUtiliser_les_valeur_actuelles_par_defaut_triggered();nn // Just a test function : unckecks the box 0.4 second after it has been clickedn void on_check_troll_clicked();n void unchecking();nn //Message when quitting through menun void quit_troll();nnprivate slots:n //Indicates if the current parameters of the 'Analyse tab' have been modified since previous analisysn void check_analyse_changed();n //Checks if the current coherence lengh have been modified since previous analisysn void on_spin_lcoh_valueChanged(int value);n //Checks if the current analysis method have been modified since previous analisysn void traitement_modifie();n //Checks if the current wordlist have been modified since previous analisysn void liste_modifie();nnprivate:n Ui::FenetrePrincipale *ui;nn// QString nomListeMotsDefaut;n QString nomListeMotsDefaut="WordLists/Mots_FR_full.txt";n double probatab[27][27][27] = {{{0}}}; //result of the analysis of the wordlist (for 'ascii' and 'ascii+')n std::map<std::vector<QChar>, std::pair<int,double>> charmap; //result of the analysis (for 'utf-8')nn //Parameter of the previous analysis:n QString nomListeMots; //name of the wordlistn type_Trait analyse = aucun; //indicates what analysis has previously been done. Acun = nothingn uint lcoh; //coherence lengh of previous analysenn //Indicates if a change has been made on the 'Analysis' tabn bool listeMots_changed=false;n bool traitement_changed=false;n bool lcoh_changed=false;n QString nomListeAnalysePrecedente;nn FenAide *m_FenAide;n Infos *m_Infos;n};nn#endif // FENETREPRINCIPALE_Hn</code></pre>nn<p>and the .cpp file </p>nn<pre class="lang-cpp prettyprint-override"><code>#include <QFileDialog>n#include <QProgressBar>n#include <QTimer>n#include <QXmlStreamReader>n#include <QXmlStreamWriter>n#include <QMessageBox>n#include <QShortcut>n#include <thread>n#include "fenetreprincipale.h"n#include "ui_fenetreprincipale.h"nnFenetrePrincipale::FenetrePrincipale(QWidget *parent) :n QMainWindow(parent),n ui(new Ui::FenetrePrincipale)n{n ui->setupUi(this);nn //Indication des tooltip longsn QString ListeMotsInstruction("La liste de mot doit être au format .txt, avec 1 seul mot par ligne\n"n "Si plusieurs mots par lignes, seul le premier est pris en compte");n ui->radio_langPerso->setToolTip(ListeMotsInstruction);n ui->bouton_selecFichier->setToolTip(ui->radio_langPerso->toolTip());nn //Adaptation de la progressbarn ui->progr_Analyse->setAlignment(Qt::AlignCenter);nn //Éléments de la statusbarn ui->statusbar->setFixedHeight(20);n ui->statusbar->showMessage("En attente de lancement...");nn //Lecture du fichier des valeurs par défaut:n QFile file("WordLists/Parametres.xml");n if(file.open(QIODevice::ReadOnly)) {n QXmlStreamReader xmlReader(&file);n if(xmlReader.readNextStartElement()) {n if (xmlReader.name() == "valeursDef") {n while(xmlReader.readNextStartElement()) {n if (xmlReader.name() == "nomListe")n nomListeMotsDefaut = xmlReader.readElementText();n else if (xmlReader.name() == "modeTraitement") {n type_Trait wantedAnalyse = stringToType(xmlReader.readElementText());n if(wantedAnalyse==ascii)n ui->radio_ignore->setChecked(true);n else if(wantedAnalyse==asciiplus)n ui->radio_minable->setChecked(true);n else if(wantedAnalyse==utf_8)n ui->radio_speciaux->setChecked(true);n }n else if (xmlReader.name() == "lcoh")n ui->spin_lcoh->setValue(xmlReader.readElementText().toInt());n else if (xmlReader.name() == "nbMots")n ui->spin_nbMots->setValue(xmlReader.readElementText().toInt());n else if (xmlReader.name() == "tailleMax")n ui->spin_tailleMax->setValue(xmlReader.readElementText().toInt());n elsen xmlReader.skipCurrentElement();n }n }n xmlReader.skipCurrentElement();n }n }n else{n ui->statusbar->showMessage("Problème lors de la lecture des valeurs par défaut");n }nn //Indication de la liste par défautn QFileInfo fi(nomListeMotsDefaut);n QString textLangDef = "Utiliser la langue par défaut ("+fi.fileName()+")";n ui->radio_langDef->setText(textLangDef);nn //Efface tous les éléments affiché par le bouton "détail"n ui->Bof->setVisible(false);n ui->Bof_2->setVisible(false);n ui->Minable->setVisible(false);n ui->Minable_2->setVisible(false);n ui->Parfait->setVisible(false);n ui->Parfait_2->setVisible(false);n ui->Qualite->setVisible(false);n ui->Rapidite->setVisible(false);n ui->line_details->setVisible(false);nn //Selectionne l'onglet de départn ui->tabWidget->setCurrentIndex(0);nn //Connexion signal/slot pour detection changementn QObject::connect(ui->radio_ignore, SIGNAL(clicked()), this, SLOT(traitement_modifie()));n QObject::connect(ui->radio_minable, SIGNAL(clicked()), this, SLOT(traitement_modifie()));n QObject::connect(ui->radio_speciaux, SIGNAL(clicked()), this, SLOT(traitement_modifie()));nn QObject::connect(ui->radio_langDef, SIGNAL(clicked()), this, SLOT(liste_modifie()));n QObject::connect(ui->radio_langPerso, SIGNAL(clicked()), this, SLOT(liste_modifie()));n QObject::connect(ui->bouton_selecFichier, SIGNAL(clicked()), this, SLOT(liste_modifie()));nn //Raccourci claviern //new QShortcut(QKeySequence(Qt::Key_Return || Qt::Key_Enter), this, SLOT(on_bouton_generer_clicked()));n //Quitter via le menun QObject::connect(ui->actionQuitter_3, SIGNAL(triggered()), this, SLOT(quit_troll()));n}nnFenetrePrincipale::~FenetrePrincipale()n{n delete ui;n}nnFenetrePrincipale::type_Trait FenetrePrincipale::selectedTrait() {n if(ui->radio_ignore->isChecked())n return ascii;n else if(ui->radio_minable->isChecked())n return asciiplus;n else if(ui->radio_speciaux->isChecked())n return utf_8;n elsen return aucun;n}nnFenetrePrincipale::type_Trait FenetrePrincipale::stringToType(QString stringType) {n if (stringType == "ascii")n return FenetrePrincipale::ascii;n else if (stringType == "asciiplus")n return FenetrePrincipale::asciiplus;n else if (stringType == "utf_8")n return FenetrePrincipale::utf_8;n elsen return FenetrePrincipale::aucun;n}nnn/*TODO : Utiliser les probabilité d'occurence des motsn * Certaines liste (comme la liste courte) indiquent la proba d'occurence de chaque motn * On pourrait utiliser cela pour reduire l'importance des enchaînements de lettre desn * mots rare (et inversement augementer pour les mots courrants)n * */nvoid FenetrePrincipale::on_bouton_analyser_clicked() {n ui->centralwidget->setCursor(Qt::WaitCursor);n ui->onglet_analyse->setEnabled(false);n ui->progr_Analyse->setValue(0); //inutile.n ui->statusbar->setToolTip("");n int avRecup(5), avAnal(90), avProbatab(5); //doit sommer a 100. Avancement (%) de chaque étapenn charmap.clear();nn//Partie 1 : Récupération de la liste de motsn ui->statusbar->showMessage("Récupération de la liste de mots...");n //Choix liste mot (selon valeur radio)n if (ui->radio_langDef->isChecked()) {n nomListeMots = nomListeMotsDefaut;n }n else if (ui->radio_langPerso->isChecked()) {n QFileInfo fi(nomListeMots);n if (fi.fileName() != ui->bouton_selecFichier->text()) {n ui->statusbar->showMessage("Problème sur le nom de la liste de mot. Veuillez reselectionner un liste de mot");n ui->onglet_analyse->setEnabled(true);n ui->centralwidget->unsetCursor();n return;n }n } //vérification qu'on ne va pas refaire l'analyse par défautn else { //Trololol inutilen ui->progr_Analyse->setValue(42);n ui->statusbar->showMessage("How did you do that ? En plus maintenant, t'as un pointeur de merde :p");n return; //Si aucun bouton coché : arrêter toutn }n //Importation liste motsn std::vector<std::string> mots;n std::vector<float> proba;n std::ifstream Liste_mots(nomListeMots.toStdString(), std::ios::in);n if(Liste_mots) {n extractWords(Liste_mots, mots, proba);n ui->progr_Analyse->setValue(avRecup);n }n else {n ui->statusbar->showMessage("Impossible de lire la liste de mots (voir ici pour plus de détails)");n ui->statusbar->setToolTip("La liste de mot suivante :\n"+nomListeMots+n "\nn'a pas pu être lue. Vérifiez qu'elle existe bien et est une liste de mots au format .txt, 1 mot par ligne");n ui->onglet_analyse->setEnabled(true);n ui->centralwidget->unsetCursor();n return;n }nn ui->tabWidget->setTabIcon(0,QIcon()); //L'icone 'warning' nest retirée que si la première étape marche (pas de return dans les étape 2 et 3nn//Partie 2 et 3 : Analyse liste mots / construction des proban ui->statusbar->showMessage("Analyse de la liste de mots...");n int nb=0; //nombre de lettres traitéesn//Partie 2 version A :n if(ui->radio_speciaux->isChecked()) { //Traitement modernen lcoh = ui->spin_lcoh->value();n for(uint i=0; i<mots.size(); i++) {n QString qmot=QString::fromStdString(mots[i]);n QanalyzeWord(qmot,charmap, lcoh, nb);n if (i%500==0) { //Possibilité : 10000 (haché), 100000 (3 étapes)n ui->progr_Analyse->setValue(avRecup+i/(float)mots.size()*avAnal);n QCoreApplication::processEvents(); //permet l'actualisation du gui. Ralenti les calcul...n }n }nn//Partie 3 vA : Création des proba de chaque enchaînement de lettren ui->statusbar->showMessage("Liste de mots analysée. Analyse de l'analyse en cours...");n std::map<std::vector<QChar>, std::pair<int,double>>::iterator it = charmap.begin() , cePrDebut , cePrFin;n //cePrDebut et cePrFin sont des itérateur indiquant le début et la fin de l'enchaînement de lettre examiné actuellementnn while(it!=charmap.end()) {n //pr = sous vecteur de it->first de [0] #FFBF00à [lcoh-2] : contient lcoh-1 élémentsn //c'est l'enchainement de lettres précédente --> utilisé pour déterminer la proba de l'actuellen std::vector<QChar> pr(&it->first[0], &it->first[lcoh-1]);n cePrDebut = it;n int nbtlsuiv = 0; //nb tot de lettre suivant l'enchainement 'pr[0]pr[1]...'nn //1er parcours : compter occurence de chaque prn // /!\ à l'odre des condition du while : il ne faut pas appeler it si it=end() --> vérification end en premiern while( (it!=charmap.end()) && (pr==std::vector<QChar>(&it->first[0], &it->first[lcoh-1])) ) {n //tant que l'enchainement des lettres précédentes (défini dans pr) ne change pas, on additionne le nombre d'occurencen nbtlsuiv += it->second.first; //it->second = la pair / .first -> le 'int'=nb d'occurencen it++; //passage au membre suivantn }n cePrFin = it;nn //2e parcours : diviser enchainement/occurence total du pr + additionner (pour proba cumul)n //on repasse sur la partie déjà vue : de cePrDebut à cePrFinn for(std::map<std::vector<QChar>, std::pair<int,double>>::iterator repasse = cePrDebut; repasse!=cePrFin && repasse!=charmap.end(); ++repasse) {n repasse->second.second = (double)repasse->second.first / nbtlsuiv;n if (repasse != cePrDebut && repasse!=charmap.begin() )n repasse->second.second += prev(repasse)->second.second; //prev() = élément précédentn }n }n//Traitement terminé. Indication lié au traitement utf_8n analyse = utf_8;n ui->check_forcerTaille->setEnabled(false);n ui->check_forcerTaille->setToolTip("Un bug très (très) idiot empêche de forcer la taille des mots\n"n "avec la méthode gérant tous les type de caractères\n"n "Oui, désolé, j'ai eu la flemme de corriger ça");n ui->label_resume_analyse->setText("Type d'analyse : tous caractères spéciaux");n ui->label_resume_lcoh->setText("Longueur de cohérence : "+QString::number(lcoh));n }n//Patie 2 version B :n else { //Traitement à l'ancienne (radio Ignore et radio gère très maln int lettertab[27][27][27] = {{{0}}}; //--> lettertab[2][1][3] = nombre d'occurence de "cab" ("3","1","2")n int nb=0; //nombre total de lettres traitésn bool clearAccent = ui->radio_minable->isChecked(); //ascii (false) ou asciiplus (true)n for(unsigned int i=0; i<mots.size(); i++) {n nb += analyzeWord(mots[i], lettertab, clearAccent);n if (i%500==0) { //Possibilité : 10000 (haché), 100000 (3 étapes)n ui->progr_Analyse->setValue(avRecup+i/(float)mots.size()*avAnal);n QCoreApplication::processEvents(); //permet l'actualisation du gui. Ralenti les calculs...n }n }nn//Partie 3 vB: Création des proba de chaque enchaînement de lettren ui->statusbar->showMessage("Liste de mots analysée. Analyse de l'analyse en cours...");n for (uint k=0; k<27; k++) {n for (uint j=0;j<27;j++) {n int nbtlsuiv = 0; //nb tot de lettre suivant l'enchainement 'k-j'n for (uint i=0;i<27;i++) {n nbtlsuiv += lettertab[i][j][k];n }n for (uint i=0;i<27;i++) {n probatab[i][j][k] = (double)lettertab[i][j][k] / nbtlsuiv;n if(i!=0)n probatab[i][j][k] += probatab[i-1][j][k]; //Transformation en proba cumulativen }n }n }n//Traitement terminé. Indication lié au traitement asciin if (clearAccent) {n ui->label_resume_analyse->setText("Type d'analyse : accents désaccentés");n analyse = asciiplus; }n else {n ui->label_resume_analyse->setText("Type d'analyse : sans accents");n analyse = ascii; }n //Autorise le "forcer_taille"n ui->check_forcerTaille->setEnabled(true);n ui->check_forcerTaille->setToolTip("");nn lcoh=0; //pas de lcoh ici. lcoh=0 <=> traitement asciin ui->label_resume_lcoh->setVisible(false); //cache la valeur lcohn }nn//Traitement terminé. Indications généralesn ui->progr_Analyse->setValue(avRecup+avAnal+avProbatab-1);n ui->progr_Analyse->setToolTip("Non, la barre ne va pas à 100%. C'est frustrant, hein ?");nn ui->onglet_generation->setEnabled(true);n ui->onglet_analyse->setEnabled(true);n ui->centralwidget->unsetCursor();nnn //Supprime les warning de changementn traitement_modifie();n on_spin_lcoh_valueChanged(lcoh);n QFile file(nomListeMots); QFileInfo fileinfo(file);n nomListeAnalysePrecedente=fileinfo.fileName(); //récupération du nom de la liste de motsn liste_modifie();nn ui->statusbar->showMessage("Analyse terminée ! Prêt a inventer des mots !");n ui->tabWidget->setCurrentIndex(1);n}nnvoid FenetrePrincipale::on_bouton_generer_clicked() {n ui->check_troll->setChecked(false);n if ((analyse==aucun)) {n ui->statusbar->showMessage("Vous devez analyser une liste de mots avant de générer des mots");n return; }nn uint taille_max = ui->spin_tailleMax->value();n if(taille_max==0)n taille_max=100;nn std::string mot;n for (int i=0; i<ui->spin_nbMots->value(); i++) {n if(analyse==utf_8)n mot = Qgenerateur(charmap,lcoh, ui->check_forcerTaille->isChecked(), taille_max);n if(analyse==ascii || analyse==asciiplus)n mot = generateur(probatab, ui->check_forcerTaille->isChecked(), taille_max);n ui->text_mots->append(QString::fromStdString(mot));n }n}nnvoid FenetrePrincipale::on_bouton_selecFichier_clicked() {n nomListeMots = QFileDialog::getOpenFileName(this, "Selectionner une liste de mot .txt", "WordLists", "Fichier texte (*.txt)");n QFile file(nomListeMots);n QFileInfo fileinfo(file);n liste_modifie();n ui->bouton_selecFichier->setText(fileinfo.fileName());n if(ui->bouton_selecFichier->text()!="")n ui->radio_langPerso->setChecked(true);n elsen ui->bouton_selecFichier->setText("(Aucun)");n}nnvoid FenetrePrincipale::on_bouton_details_clicked() {n ui->Bof->setVisible(!ui->Bof->isVisible());n ui->Bof_2->setVisible(!ui->Bof_2->isVisible());n ui->Minable->setVisible(!ui->Minable->isVisible());n ui->Minable_2->setVisible(!ui->Minable_2->isVisible());n ui->Parfait->setVisible(!ui->Parfait->isVisible());n ui->Parfait_2->setVisible(!ui->Parfait_2->isVisible());n ui->Qualite->setVisible(!ui->Qualite->isVisible());n ui->Rapidite->setVisible(!ui->Rapidite->isVisible());n ui->line_details->setVisible(!ui->line_details->isVisible());n}nnvoid FenetrePrincipale::on_bouton_nettoyer_clicked() {n ui->text_mots->clear();n}nnvoid FenetrePrincipale::on_bouton_trier_clicked() {n QString text = ui->text_mots->toPlainText();n triParTaille(text);n ui->text_mots->setText(text);n}nnvoid FenetrePrincipale::on_actionAide_triggered() {n m_FenAide = new FenAide();n m_FenAide->show();n}nnvoid FenetrePrincipale::on_action_propos_de_ce_programme_triggered() {n m_Infos = new Infos();n m_Infos->show();n}nnvoid FenetrePrincipale::on_actionUtiliser_les_valeur_actuelles_par_defaut_triggered() {n QMessageBox::StandardButton reply;n reply = QMessageBox::question(this, "Changer valeurs par defaut",n "Voulez vous changer les valeurs par défaut du programme ?\n"n "\nLes valeurs par défaut (càd celle au lancement du programme) seront remplacées par les valeurs actuelles\n"n "Sont concernés :\n"n " - La liste de mot\n"n " - La longueur de cohérence\n"n " - Le nombre de mot à générer\n"n " - La taille maximale des mots\n",n QMessageBox::Yes|QMessageBox::No);n //TODO : mieux que ça ! Heuresement qu'il n'y a que 5 paramètres...n if (reply == QMessageBox::Yes) {n //préparation pour écriture du chemin de la liste de motn QFile file("WordLists/Parametres.xml");n if(file.open(QIODevice::WriteOnly)) {n QXmlStreamWriter xmlWriter(&file);n xmlWriter.writeStartElement("?xml version=\"1.0\" encoding=\"utf-8\"?");n xmlWriter.writeCharacters("\n");n xmlWriter.writeStartElement("valeursDef");n xmlWriter.writeCharacters("\n\t");n xmlWriter.writeStartElement("nomListe");n if(ui->radio_langPerso->isChecked())n xmlWriter.writeCharacters(nomListeMots);n elsen xmlWriter.writeCharacters(nomListeMotsDefaut);n xmlWriter.writeEndElement();n xmlWriter.writeCharacters("\n");n xmlWriter.writeComment("Le chemin peut être donné en absolu ou en relatif");n xmlWriter.writeCharacters("\n\t");n xmlWriter.writeStartElement("modeTraitement");n if(ui->radio_ignore->isChecked())n xmlWriter.writeCharacters("ascii");n else if(ui->radio_minable->isChecked())n xmlWriter.writeCharacters("asciiplus");n else if(ui->radio_speciaux->isChecked())n xmlWriter.writeCharacters("utf_8");n elsen xmlWriter.writeCharacters("aucun");n xmlWriter.writeEndElement();n xmlWriter.writeCharacters("\n");n xmlWriter.writeComment("Les valeurs possible du mode de traitement sont : aucun, ascii, asciiplus et utf_8");n xmlWriter.writeCharacters("\n\t");n xmlWriter.writeStartElement("lcoh");n xmlWriter.writeCharacters(QString::number(ui->spin_lcoh->value()));n xmlWriter.writeEndElement();n xmlWriter.writeCharacters("\n\t");n xmlWriter.writeStartElement("nbMots");n xmlWriter.writeCharacters(QString::number(ui->spin_nbMots->value()));n xmlWriter.writeEndElement();n xmlWriter.writeCharacters("\n\t");n xmlWriter.writeStartElement("tailleMax");n xmlWriter.writeCharacters(QString::number(ui->spin_tailleMax->value()));n xmlWriter.writeEndElement();n xmlWriter.writeCharacters("\n");n xmlWriter.writeEndElement();n xmlWriter.writeCharacters("\n");n }n else{n ui->statusbar->showMessage("Problème lors de l'écriture des valeurs par défaut");n }n }n}nnvoid FenetrePrincipale::on_check_troll_clicked() {n QTimer::singleShot(80, this, SLOT(unchecking()));n}nnvoid FenetrePrincipale::unchecking() {n std::this_thread::sleep_for(std::chrono::milliseconds(400));n ui->check_troll->setChecked(false);n}nnvoid FenetrePrincipale::quit_troll() {n QMessageBox::information(this, "Vraiment ?",n "Sinon, y avait plus simple pour quitter hein...\n"n "Pourquoi y a toujours un bouton du menu pour quitter ?\n"n "Qui l'utilse ?...");n this->close();n}nnvoid FenetrePrincipale::check_analyse_changed() {n bool changed = listeMots_changed || traitement_changed || lcoh_changed;n if (changed && analyse!=aucun) {n QIcon p(":/icones/icons/warning.png");n ui->tabWidget->setTabIcon(0,p);n ui->statusbar->showMessage("Attention, vous devez refaire l'analyse pour que les changements soient pris en compte");n }n else {n ui->tabWidget->setTabIcon(0,QIcon());n ui->statusbar->showMessage("");n }n}nnvoid FenetrePrincipale::on_spin_lcoh_valueChanged(int value) {n if( (analyse==type_Trait::utf_8) & ((uint)value!=lcoh) ) {n ui->spin_lcoh->setStyleSheet("background-color: #FFBF00");n lcoh_changed = true; }n else {n ui->spin_lcoh->setStyleSheet("");n lcoh_changed = false; }n check_analyse_changed();n}nnvoid FenetrePrincipale::traitement_modifie() {n if(analyse!=aucun) {n if(selectedTrait()!=analyse) {n traitement_changed=true;n if(ui->radio_ignore->isChecked()) {n ui->radio_ignore->setStyleSheet("background-color: #FFBF00");n ui->radio_minable->setStyleSheet("");n ui->radio_speciaux->setStyleSheet(""); }n else if(ui->radio_minable->isChecked()) {n ui->radio_ignore->setStyleSheet("");n ui->radio_minable->setStyleSheet("background-color: #FFBF00");n ui->radio_speciaux->setStyleSheet(""); }n else if(ui->radio_speciaux->isChecked()) {n ui->radio_ignore->setStyleSheet("");n ui->radio_minable->setStyleSheet("");n ui->radio_speciaux->setStyleSheet("background-color: #FFBF00"); }n }n else {n traitement_changed=false;n ui->radio_ignore->setStyleSheet("");n ui->radio_minable->setStyleSheet("");n ui->radio_speciaux->setStyleSheet("");n }n }n check_analyse_changed();n}nnnvoid FenetrePrincipale::liste_modifie() {n if(analyse!=aucun) {n bool usedLangDef = (nomListeMots==nomListeMotsDefaut);nn if(ui->radio_langPerso->isChecked() && usedLangDef) {n ui->radio_langDef->setStyleSheet("");n ui->radio_langPerso->setStyleSheet("background-color: #FFBF00");n listeMots_changed=true; }n else if (ui->radio_langDef->isChecked() && usedLangDef) {n ui->radio_langDef->setStyleSheet("");n ui->radio_langPerso->setStyleSheet("");n listeMots_changed=false; }n else if(ui->radio_langDef->isChecked() && !usedLangDef) {n ui->radio_langDef->setStyleSheet("background-color: #FFBF00");n ui->radio_langPerso->setStyleSheet("");n listeMots_changed=true; }n else if(ui->bouton_selecFichier->text()!=nomListeAnalysePrecedente&& !usedLangDef) {n ui->radio_langDef->setStyleSheet("");n ui->radio_langPerso->setStyleSheet("background-color: #FFBF00");n listeMots_changed=true; }n else if(ui->radio_langPerso->isChecked() && !usedLangDef ) {n ui->radio_langDef->setStyleSheet("");n ui->radio_langPerso->setStyleSheet("");n listeMots_changed=false; }n else {n ui->radio_langDef->setStyleSheet("");n ui->radio_langPerso->setStyleSheet("");n listeMots_changed=false; }n }n check_analyse_changed();n}n</code></pre>nn<p>The word analysis/generation in itself is contained in the fonction.h/.cpp files :nfonction.h</p>nn<pre class="lang-cpp prettyprint-override"><code>#ifndef FONCTIONSn#define FONCTIONSnn#include <map>n#include <vector>n#include <fstream>n#include <QString>nn//Get the words listed in the wordlist (text file)nvoid extractWords(std::ifstream &liste, std::vector<std::string> &mots, std::vector<float> &proba);nn//Remove accentuated letters (for 'analyze word')nstd::string retireAccent(std::string &message);nnn//Fonctions beginning by 'Q' use words made of Qchar instead of char and hence are able to handle any characternn//analyse one word and completes lettertab (of "fenetreprincipale"). ClearAccent=true handles accentuated letter by replacing them by their unaccentuated versionnint analyzeWord(std::string &lemot, int lettertab[27][27][27], bool ClearAccent=false);n//analyse on word and completes the charmap (of "fenetreprincipale")nvoid QanalyzeWord(const QString &lemot, std::map<std::vector<QChar>, std::pair<int,double>> &charmap, uint lcoh, int &nb);nnn//Generates a word based on the table 'probatab'nstd::string generateur(double probatab[27][27][27], bool forcedSize=false, uint maxsize=100);n//Generates a word based on the character map (charmap)nstd::string Qgenerateur(std::map<std::vector<QChar>, std::pair<int,double>> &charmap, uint lcoh=3, bool forcedSize=false, uint maxsize=100);nnn//triParTaille : sort word displayed by size. Calls quicksort and echangernvoid triParTaille(QString &liste_mots);n void Qechanger(QStringList &liste, int a, int b);n void Qquicksort(QStringList &liste, int debutR, int fin);nn#endif // FONCTIONSn</code></pre>nn<p>fonction.cpp</p>nn<pre class="lang-cpp prettyprint-override"><code>#include <vector>n#include <sstream>n#include <iostream>n#include "fonctions.h"n#include "fenetreprincipale.h"nn//Fonction commencant par Q = fonction pour le traitement gérant tout les type den//caratère et la longueur de cohérence (Q pour le Q de QString, le moyen le plusn//simple de gérer l'utf-8 (j'aime pas les wchar_t. C'est nul et pas pratique)nnusing namespace std;nnvoid extractWords(ifstream &liste, vector<string> &mots, vector<float> &proba) {n int nb_lignes = 0; //number of lines on the wordlistn string line; //last read linen for (; getline(liste,line); nb_lignes++) {}; //Get number of linesnn liste.clear();n liste.seekg(0, ios::beg); //going back to beginning of the filenn getline(liste, line);n nb_lignes--; //Ignore first linen //TODO : manage comments on the file, e.g. lines beginning by //nn mots.resize(nb_lignes);n proba.resize(nb_lignes);n for (int i=0; i<nb_lignes; i++) {n getline(liste, line);nn string sproba;n stringstream ss;n ss << line;n ss >> mots[i] >> sproba; // get 1st word = actual word and 2nd word = occurence probabilityn if(sproba!="")n proba[i]=stof(sproba); //conversion to floatn else //if no word probability is indicated, set it at 0n proba[i]=0;n }n liste.close();n return;n}nnstring retireAccent(string &message)n{n string accent("ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûüÿÑñÇç");n string sansAccent("AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNnCc");n int i=0,j=0,k=0,taille;n taille=message.size();n for (i=0;i<=taille;i++) {n for(j=0;j<=104;j=j+2) {n if((message[i]==accent[j])&&(message[i+1]==accent[j+1])) {n message[i]=sansAccent[j/2];n for(k=i+1;k<taille;k++) {n message[k]=message[k+1];n }n message=message.substr(0,taille-1);n taille=message.size();n }n }n }n return message;n}nnint analyzeWord(string &lemot, int lettertab[27][27][27], bool ClearAccent) {n int pr1=0; //previous letter, default is nothing (0)n int pr2=0; //second-to-last letter, default is nothing (0)n int curr; //lettre actuellen int nb=0; //nombre total de lettre traitéesn for(unsigned int i=0; i<lemot.size(); i++) {n if(ClearAccent==true)n lemot=retireAccent(lemot);n curr=lemot.at(i)-96; // returns ascii code for the lettern if(curr>0 && curr <27) { //ignoring accentuated lettern lettertab[curr][pr1][pr2]++;n pr2=pr1;n pr1=curr; //current letter is now previous lettern nb++;n }n }n lettertab[0][pr1][pr2]++; //indicates the word finishes by "...."pr2""pr1"n return nb;n}nnvoid QanalyzeWord(const QString &lemot, map<vector<QChar>, pair<int,double>> &charmap, uint lcoh, int &nb) {n vector<QChar> suiteLettres(lcoh,'\0'); //vecteur de longueur lcoh, initialisé à \0nn for(int i=0; i<lemot.size(); i++) {n suiteLettres[lcoh-1]=lemot.at(i); //lcoh = suiteLettres.size()n charmap[suiteLettres].first++;n nb++;n for(uint j=0; j<lcoh-1; j++) {n suiteLettres[j]=suiteLettres[j+1];n }n }n //Indication de dernier charactère=viden suiteLettres[lcoh-1]='\0';n charmap[suiteLettres].first++;n return;n}nnstring generateur (double probatab[27][27][27], bool forcedSize, uint maxsize) {n string monmot ="";n int pr1=0; //lettre précédenten int pr2=0; //avant-dernière lettren int pot; //lettre potentiellen do {n pot=0;n double r = (double)rand() / RAND_MAX;n while (r > probatab[pot][pr1][pr2] && pot<26) {n pot++;n }n if (pot!=0){ //si pot=0 (eg. fin du mot) MAIS forcedSize, alors on ignore ce caractèren monmot += (char)(pot+96);n pr2=pr1;n pr1=pot;n }n } while ((pot!=0 || forcedSize) && monmot.size()<=maxsize); //!\ size=taille en octet=nb carac en ascii seulementnn return monmot;n}nnstring Qgenerateur(std::map<std::vector<QChar>, pair<int,double>> &charmap, uint lcoh, bool forcedSize, uint maxsize) {n QString monmot="";n vector<QChar> cePr(lcoh-1,'\0');nn vector<QChar> cePrMin, cePrMax; //debut et fin des élément de la map ayant ce Prn cePrMin.reserve(lcoh); cePrMax.reserve(lcoh);n map<vector<QChar>, pair<int,double>>::iterator it, itLow, itHigh;n //itLow : itérateur vers le premier éléments de la map ayant ce Prn //itHigh: itérateur vers l'élément suivant le dernier éléments de la map ayant ce Prnn do {n cePrMin=cePr; cePrMin.push_back(QChar::Null);n cePrMax=cePr; cePrMax.push_back(QChar::LastValidCodePoint);nn itLow = charmap.lower_bound(cePrMin);n itHigh = charmap.upper_bound(cePrMax);n it = itLow;nn double r = double(rand())/ RAND_MAX; // 0 < r < 1n while (r > it->second.second && it != itHigh) { //places iterator to the 1st caracter having a probability less than rn it++;n }n monmot += QString(it->first.back()); //append this caracter to the wordnn for(uint i=0; i<cePr.size()-1; i++) { n cePr[i] = cePr[i+1];n }n cePr[cePr.size()-1] = it->first.back();n } while ( (it->first.back()!='\0') && uint(monmot.size()) <= maxsize);n //TODO : implémenter le forced sizen return monmot.toStdString();n}nnvoid triParTaille(QString &liste_mots) {n QStringList splitted(liste_mots.split('\n'));n Qquicksort(splitted, 0, splitted.size()-1);n liste_mots = splitted.join("\n");n}nnvoid Qechanger(QStringList &liste, int a, int b) {n //Fonction utilisée par le tri quicksortn QString temp = liste.at(a);n liste.replace(a, liste.at(b));n liste.replace(b,temp);n}nnvoid Qquicksort(QStringList &liste, int debut, int fin) {n int gauche=debut-1;n int droite=fin+1;n const int pivot = liste.at(debut).size();nn if(debut>=fin)n return;nn while(1) {n do {droite--; } while(liste.at(droite).size() > pivot);n do gauche++; while(liste.at(gauche).size() < pivot);nn if(gauche < droite)n Qechanger(liste, gauche, droite);n else break;n }nn Qquicksort(liste, debut, droite);n Qquicksort(liste, droite+1, fin);n}n</code></pre>nn<p>Now only remain an 'help' window and a 'about' window. I don't show the .ui here due to number of caraters limitation :nfenaide.h</p>nn<pre class="lang-cpp prettyprint-override"><code>#ifndef FENAIDE_Hn#define FENAIDE_Hnn#include <QDialog>nnnamespace Ui {nclass FenAide; //=Help windown}nnclass FenAide : public QDialogn{n Q_OBJECTnnpublic:n explicit FenAide(QWidget *parent = 0);n ~FenAide();nnpublic slots:n void on_bouton_moreInfo_clicked();nnprivate:n Ui::FenAide *ui;n};nn#endif // FENAIDE_Hn</code></pre>nn<p>fenaide.cpp</p>nn<pre class="lang-cpp prettyprint-override"><code>#include "fenaide.h"n#include "ui_fenaide.h"nnFenAide::FenAide(QWidget *parent) :n QDialog(parent),n ui(new Ui::FenAide)n{n ui->setupUi(this);nn ui->text_details->setVisible(false);n this->adjustSize();nn#ifdef __linux__n this->setFixedSize(this->width(),this->height());n#elif _WIN32n //Taille de fenetre fixe. Windows seulementn setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);n#elsenn#endifn}nnFenAide::~FenAide()n{n delete ui;n}nnvoid FenAide::on_bouton_moreInfo_clicked() {n ui->text_details->setVisible(!ui->text_details->isVisible());n this->adjustSize();n}n</code></pre>nn<p>infos.h</p>nn<pre class="lang-cpp prettyprint-override"><code>#ifndef INFOS_Hn#define INFOS_Hnn#include <QDialog>nnnamespace Ui {nclass Infos;n}nnclass Infos : public QDialogn{n Q_OBJECTnnpublic:n explicit Infos(QWidget *parent = 0);n ~Infos();nnprivate:n Ui::Infos *ui;n};nn#endif // INFOS_Hn</code></pre>nn<p>infos.cpp</p>nn<pre class="lang-cpp prettyprint-override"><code>#include "infos.h"n#include "ui_infos.h"nnInfos::Infos(QWidget *parent) :n QDialog(parent),n ui(new Ui::Infos)n{n ui->setupUi(this);nn// Make window fixed sizen#ifdef __linux__n this->setFixedSize(this->width(),this->height());n#elif _WIN32n setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);n#elsenn#endifn}nnInfos::~Infos()n{n delete ui;n}n</code></pre>nn<p>The .pro file if ever it is usefull</p>nn<pre class="lang-cpp prettyprint-override"><code>TEMPLATE = appnCONFIG += qtnCONFIG += c++11nnQT += widgetsnnSOURCES += main.cpp \n fonctions.cpp \n fenaide.cpp \n fenetreprincipale.cpp \n infos.cppnnHEADERS += \n fonctions.h \n fenaide.h \n fenetreprincipale.h \n infos.hnnDISTFILES +=nnFORMS += \n fenaide.ui \n fenetreprincipale.ui \n infos.uin</code></pre>nn<p>And finaly, the wordlist. It can be any .txt file like :</p>nn<pre><code>//First line is ignorednThisnisnanwordlistnplatypusn</code></pre>n
""",
"""
<p>I keep getting a 403 error when i run this code has anyone got an idea how I can fix this I tried some of the other fixes posted to this site but they didn't seem to work any help would be appreciated
'''
using System;
using System.Net;</p>
<p>namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
using (WebClient client = new WebClient())
{
Console.WriteLine(client.DownloadString("http://www.bom.gov.au/vic/forecasts/ballarat.shtml"));
}
}
}
}
'''</p>
""", """
<p>Please help! As this message <strong>This link is expired</strong> always appears on my screen after applying for the proposal submitting, I am unable to continue work on <strong>Upwork.com</strong> Please solve this ASAP.</p>
""", """
<p>Are you frustrated in life. What type of wealth do you want? Today the lucifer has order us to bring member to his kingdom. Are you tired of poverty and now you want fame,power and riches.Our magical powers are beyond your imagination. we could do magic on your behalf regarding , your financial situation, future events, or whatever is important to you. we have the power and we use the power. we are illuminati, and we could change the course of destiny. Get to us and we shall help you. Tell us what it is you want and we shall go about our work. Is it someone or something you desire to have? Do you want wealth(Want to grow your bank account?, Need funds to enjoy the good life? Tired of working hard and getting know where?) or happiness? the most power society welcomes you to illuminati.. contact illuminati initiation home Send us your most important desire and we shall work our powers in your favor. When filling out the online order form, be sure to tell illuminati what you want! contact us via email: illuminategodfather@gmail.com</p>
""", """
Being a WordPress developer, or webmaster this situation of complexity occurs when your website is down. An unexpected downgrade in your website not only results in loss of incoming traffic but also creates a negative impact on search engine rank and online reputation of your website.
What is the error?
Error establishing a database connection signifies due to some known or unknown reason the code written on PHP s not able to connect to your database for retrieving information.
Why Occurs The Error?
Error in database connectivity might be due to different reasons like Inaccurate login credentials and Corrupt database
How Fix error?
Repair database
Change sign-in credentials
Fix corrupt files
Contact customer care representatives
Get more info: https://wordpresserror500.com/error-establishing-database-connection-in-wordpress/
""", """
<p>I'd like to know how to update URL addresses in Firefox using Web Extensions.</p>
<p>I'm trying to port a simple extension I've created with Chrome APIs to Firefox, but I don't really understand the tab URL mechanisms in Firefox.</p>
<p>This extension was made to switch between YouTube desktop/TV version with a click.</p>
<p>It works well on Chrome, but I don't know why it's not working on Firefox.</p>
<pre><code>// Called when the user clicks on the browser action.
(function(chromeApi) {
getCurrentPageVersion = function (tabUrl) {
var ytValidRegex = /^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)/g;
var ytValidStdPageRegex = /^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)?(\/watch\?v=).+$/g;
var ytValidTvPageRegex = /^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)?(\/tv#\/watch(\/video)?\/(idle|control)\?v=).+$/g;
if (!ytValidRegex.test(tabUrl)) {
return undefined;
} else if (ytValidStdPageRegex.test(tabUrl)) {
return "std";
} else if (ytValidTvPageRegex.test(tabUrl)) {
return "tv";
}
return undefined;
};
getConvertedActionUrl = function (tabUrl) {
var result = '';
var shortStdYtUrlRegex = /\/watch\?v=.+/g;
var shortTvYtUrlRegex = /\/tv#\/watch\/video\/(idle|control)\?v=.+/g;
var shortStdYtUrlReplaceRegex = /\/watch\?v=/g;
var shortTvYtUrlReplaceRegex = /\/tv#\/watch\/video\/(idle|control)\?v=/g;
if (shortStdYtUrlRegex.test(tabUrl)) {
result = tabUrl.replace(shortStdYtUrlReplaceRegex, '/tv#/watch/idle?v=');
}
else {
result = tabUrl.replace(shortTvYtUrlReplaceRegex, '/watch?v=');
}
// YouTube standard website video url
//https://www.youtube.com/watch?v=9tRDQK2MtRs
// YouTube TV url
//https://www.youtube.com/tv#/watch/video/idle?v=9tRDQK2MtRs
return result;
}
onInit = function () {
};
chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;
if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}
});
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
if(!changeInfo.url) return; // URL did not change
// Might be better to analyze the URL to exclude things like anchor changes
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;
/* ... */
chrome.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});
chrome.tabs.onCreated.addListener(function(tab){
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;
/* ... */
chrome.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});
})(chrome);
</code></pre>
<p>If you pay attention, the core functionality happens on the <code>chromeApi.browserAction.onClicked</code> event, whenever you click the add-on/extension button.</p>
<p>The extension updates correctly between each YouTube version in Chrome, but in Firefox, this one redirects to YouTube TV once and never goes back to the desktop version no matter how many times you click on it.</p>
<p>But there's something weird in Firefox: browser history is updated correctly whenever the <code>tab.update</code> method is called, but it redirects to the TV version by if itself again.</p>
<p><strong>IMPORTANT</strong>: Both Firefox/Chrome extensions are using the <code>currentTab</code> permission, so it's not an extension issue by itself.</p>
<p><a href="https://github.com/fori920/youtube-tv-switcher" rel="nofollow noreferrer">Extension on GitHub</a></p>
"""
def benchmark(regex_str):
pre_time = time.time()
re = regex.compile(regex_str)
post_time = time.time()
print("Compilation: {}s".format(post_time - pre_time))
pre_time = time.time()
for post in test_posts:
re.search(post)
post_time = time.time()
total_time = post_time - pre_time
print("Time to test {} posts: {}s".format(len(test_posts), total_time))
print("Average time per post: {}s".format(total_time / len(test_posts)))
long_post = "\n".join(test_posts)
pre_time = time.time()
re.search(long_post)
post_time = time.time()
print("Time to test {} posts concatenated: {}s".format(len(test_posts), post_time - pre_time))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment