Help
RSS
API
Feed
Maltego
Contact
Domain > thestorymaster.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2015-12-12
184.168.192.5
(
ClassC
)
2026-03-02
107.180.5.56
(
ClassC
)
Port 80
HTTP/1.1 200 OKContent-Type: text/htmlLast-Modified: Sat, 22 Nov 2025 21:17:04 GMTETag: 0887159f55bdc1:0Server: Microsoft-IIS/10.0X-Powered-By: ASP.NETX-Powered-By-Plesk: PleskWinDate: Mon, 02 Mar 2026 15:54:35 GMTContent-Length: 50426 !DOCTYPE html>html langen>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>Literary Device Analyzer & Learning Tool/title> style> :root { --primary: #6366f1; --primary-dark: #4f46e5; --secondary: #ec4899; --bg-gradient: linear-gradient(135deg, #e0e7ff 0%, #f3e8ff 100%); --card-bg: #ffffff; --text-main: #1f2937; --text-muted: #6b7280; --border: #e5e7eb; --success: #10b981; --warning: #f59e0b; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Segoe UI, system-ui, -apple-system, sans-serif; background: var(--bg-gradient); color: var(--text-main); min-height: 100vh; line-height: 1.6; padding: 20px; } .container { max-width: 1000px; margin: 0 auto; background: var(--card-bg); border-radius: 20px; box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); overflow: hidden; } /* Header */ .header { background: linear-gradient(to right, var(--primary), var(--secondary)); padding: 30px; color: white; display: flex; justify-content: space-between; align-items: center; } .header h1 { font-size: 1.8rem; font-weight: 700; letter-spacing: -0.025em; } .header-controls { display: flex; gap: 15px; } .icon-btn { background: rgba(255, 255, 255, 0.2); color: white; border: none; width: 40px; height: 40px; border-radius: 12px; font-size: 1.2rem; font-weight: bold; cursor: pointer; transition: all 0.2s; backdrop-filter: blur(5px); display: flex; align-items: center; justify-content: center; } .icon-btn:hover { background: rgba(255, 255, 255, 0.3); transform: translateY(-2px); } /* Input Area */ .input-section { padding: 30px; border-bottom: 1px solid var(--border); } textarea { width: 100%; height: 150px; padding: 20px; border: 2px solid var(--border); border-radius: 12px; font-size: 1.1rem; font-family: inherit; resize: vertical; transition: border-color 0.3s, box-shadow 0.3s; background-color: #f9fafb; } textarea:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.1); background-color: #fff; } .analyze-btn { background: var(--primary); color: white; border: none; padding: 14px 40px; border-radius: 12px; font-size: 1.1rem; font-weight: 600; cursor: pointer; transition: all 0.3s; display: block; margin: 20px auto 0; box-shadow: 0 4px 6px -1px rgba(99, 102, 241, 0.4); } .analyze-btn:hover { background: var(--primary-dark); transform: translateY(-2px); box-shadow: 0 10px 15px -3px rgba(99, 102, 241, 0.4); } /* Results Area */ .results { padding: 30px; background-color: #f8fafc; min-height: 200px; } .sentence-card { background: white; border-radius: 12px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); margin-bottom: 20px; border-left: 5px solid var(--primary); overflow: hidden; transition: transform 0.2s; } .sentence-card:hover { transform: translateX(5px); } .sentence-header { padding: 20px; } .sentence-meta { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: 8px; font-weight: 600; display: flex; justify-content: space-between; } .sentence-content { font-size: 1.15rem; color: var(--text-main); margin-bottom: 15px; line-height: 1.7; } .tag-container { display: flex; flex-wrap: wrap; gap: 8px; } /* Category colors for tags */ .tag-sound { --tag-hue: 240; } /* Blue */ .tag-structure { --tag-hue: 150; } /* Green */ .tag-repetition { --tag-hue: 280; } /* Purple */ .tag-figurative { --tag-hue: 330; } /* Pink */ .tag-rhetoric { --tag-hue: 30; } /* Orange */ .tag-word { --tag-hue: 190; } /* Cyan */ .device-tag { --tag-hue: 220; /* Default */ background: hsl(var(--tag-hue), 80%, 92%); color: hsl(var(--tag-hue), 70%, 30%); border: 1px solid hsl(var(--tag-hue), 70%, 80%); padding: 4px 12px; border-radius: 20px; font-size: 0.85rem; font-weight: 600; cursor: pointer; transition: all 0.2s; user-select: none; } .device-tag:hover { transform: translateY(-2px); background: hsl(var(--tag-hue), 70%, 85%); } .device-tag.active { background: hsl(var(--tag-hue), 60%, 50%); color: white; border-color: hsl(var(--tag-hue), 60%, 40%); } .no-device-tag { background: #f3f4f6; color: #9ca3af; cursor: default; border: 1px solid #e5e7eb; } .no-device-tag:hover { transform: none; background: #f3f4f6; color: #9ca3af; } /* Detailed Analysis Section */ .analysis-detail { background: #f8fafc; border-top: 1px solid #e2e8f0; padding: 0; max-height: 0; overflow: hidden; transition: max-height 0.4s ease-out; } .analysis-detail.open { max-height: 1000px; transition: max-height 0.6s ease-in; border-bottom: 1px solid #e2e8f0; } .analysis-content { padding: 20px; } .analysis-title { color: #334155; font-weight: 700; margin-bottom: 12px; display: flex; align-items: center; gap: 8px; font-size: 1rem; } .analysis-box { background: white; padding: 15px; border-radius: 8px; border: 1px solid #cbd5e1; margin-bottom: 10px; } .analysis-box h4 { font-size: 0.8rem; color: #64748b; text-transform: uppercase; margin-bottom: 6px; letter-spacing: 0.05em; } .highlight-match { background: #fef08a; padding: 2px 4px; border-radius: 4px; font-weight: bold; color: #854d0e; } .educational-note { margin-top: 10px; font-style: italic; color: #475569; font-size: 0.9rem; border-left: 3px solid #cbd5e1; padding-left: 10px; line-height: 1.5; } /* Empty State */ .empty-state { text-align: center; color: var(--text-muted); padding: 60px 20px; } .empty-icon { font-size: 3rem; margin-bottom: 15px; opacity: 0.5; display: block; } /* Modal */ .modal { display: none; position: fixed; z-index: 1000; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(15, 23, 42, 0.8); backdrop-filter: blur(4px); animation: fadeIn 0.3s; } .modal-content { background-color: #fff; margin: 2vh auto; width: 95%; max-width: 1100px; height: 96vh; border-radius: 16px; display: flex; flex-direction: column; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); animation: slideUp 0.3s; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { transform: translateY(50px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .modal-header { padding: 20px 30px; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; align-items: center; background: #f8fafc; border-radius: 16px 16px 0 0; } .modal-close { font-size: 2rem; background: none; border: none; color: var(--text-muted); cursor: pointer; line-height: 1; } .modal-body { padding: 30px; overflow-y: auto; flex: 1; } .guide-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 25px; } .guide-category { margin-bottom: 10px; } .guide-category h4 { color: var(--primary); border-bottom: 2px solid #e2e8f0; padding-bottom: 8px; margin-bottom: 15px; font-size: 1.1rem; } .term-item { margin-bottom: 15px; background: #f8fafc; padding: 12px; border-radius: 8px; } .term-item dt { font-weight: 700; color: var(--text-main); margin-bottom: 4px; } .term-item dd { font-size: 0.9rem; color: var(--text-muted); line-height: 1.4; } /style>/head>body>div classcontainer> div classheader> h1>✨ Literary Analyzer Pro/h1> div classheader-controls> button classicon-btn onclicktoggleModal(helpModal) titleGuide & Glossary>?/button> /div> /div> div classinput-section> textarea idtextInput placeholderEnter text to analyze...Examples:- The wind whispered secrets. (Personification)- He was a lion in the fight. (Metaphor)- Ive told you a million times. (Hyperbole)- Ask not what your country can do for you. (Antimetabole)- The burning fire was hot. (Pleonasm)>/textarea> button classanalyze-btn onclickanalyzeText()>Analyze Deeply/button> /div> div classresults idresults> div classempty-state> span classempty-icon>📚/span> p>Enter text above to detect 50+ literary devices./p> /div> /div>/div>!-- Modal -->div idhelpModal classmodal> div classmodal-content> div classmodal-header> h2>Literary Device Encyclopedia/h2> button classmodal-close onclicktoggleModal(helpModal)>×/button> /div> div classmodal-body> div stylemargin-bottom: 30px; padding: 20px; background: #eff6ff; border-radius: 12px; border: 1px solid #dbeafe;> h3 stylecolor: #1e40af; margin-bottom: 10px;>Why Learn Literary Devices?/h3> p stylemargin-bottom: 10px;>strong>For Creativity:/strong> Literary devices are the special effects of writing. Just as a filmmaker uses lighting and camera angles, a writer uses em>Anaphora/em> for rhythm or em>Metaphor/em> for depth. Mastering these tools allows you to manipulate emotion, pacing, and imagery intentionally rather than accidentally./p> p>strong>For Learning:/strong> Analyzing devices exercises pattern recognition and critical thinking. It allows you to deconstruct persuasive speeches, marketing copy, and classic literature to understand em>how/em> they influence you./p> /div> div classguide-grid> !-- Sound Devices --> div classguide-category> h4>🔊 Sound & Musicality/h4> div classterm-item>dt>Alliteration/dt>dd>Repetition of initial consonant sounds./dd>/div> div classterm-item>dt>Assonance/dt>dd>Repetition of vowel sounds./dd>/div> div classterm-item>dt>Consonance/dt>dd>Repetition of consonant sounds anywhere in words./dd>/div> div classterm-item>dt>Sibilance/dt>dd>Repetition of s, sh, or z sounds creating a hissing effect./dd>/div> div classterm-item>dt>Euphony/dt>dd>Use of soft, pleasant sounds (l, m, n, r, f)./dd>/div> div classterm-item>dt>Cacophony/dt>dd>Use of harsh, jarring sounds (k, g, b, t, p)./dd>/div> div classterm-item>dt>Onomatopoeia/dt>dd>Words that imitate natural sounds./dd>/div> /div> !-- Repetition --> div classguide-category> h4>🔁 Repetition & Rhythm/h4> div classterm-item>dt>Anaphora/dt>dd>Repetition at the beginning of clauses./dd>/div> div classterm-item>dt>Epistrophe/dt>dd>Repetition at the end of clauses./dd>/div> div classterm-item>dt>Symploce/dt>dd>Combining Anaphora and Epistrophe./dd>/div> div classterm-item>dt>Anadiplosis/dt>dd>Ending a clause with a word and starting the next with the same word./dd>/div> div classterm-item>dt>Epizeuxis/dt>dd>Immediate repetition of a word for emphasis./dd>/div> div classterm-item>dt>Diacope/dt>dd>Repetition separated by a few intervening words./dd>/div> div classterm-item>dt>Conduplicatio/dt>dd>Repetition of a key word from the previous sentence./dd>/div> div classterm-item>dt>Polyptoton/dt>dd>Repetition of words derived from the same root (e.g. run, runner)./dd>/div> /div> !-- Structure --> div classguide-category> h4>🏗️ Structure & Syntax/h4> div classterm-item>dt>Asyndeton/dt>dd>Omission of conjunctions (X, Y, Z)./dd>/div> div classterm-item>dt>Polysyndeton/dt>dd>Overuse of conjunctions (X and Y and Z)./dd>/div> div classterm-item>dt>Tricolon/dt>dd>A series of three parallel words or phrases./dd>/div> div classterm-item>dt>Isocolon/dt>dd>Sentences or clauses of equal length and structure./dd>/div> div classterm-item>dt>Parallelism/dt>dd>Similarity of structure in a pair or series of related words./dd>/div> div classterm-item>dt>Antimetabole/dt>dd>Repetition of words in reverse grammatical order (A-B, B-A)./dd>/div> div classterm-item>dt>Parenthesis/dt>dd>Insertion of a clause that interrupts the flow./dd>/div> div classterm-item>dt>Enumeratio/dt>dd>Listing details or counting parts./dd>/div> /div> !-- Figurative --> div classguide-category> h4>🎨 Imagery & Figure/h4> div classterm-item>dt>Metaphor/dt>dd>Direct comparison of two unlike things./dd>/div> div classterm-item>dt>Simile/dt>dd>Comparison using like or as./dd>/div> div classterm-item>dt>Personification/dt>dd>Giving human qualities to non-human things./dd>/div> div classterm-item>dt>Zoomorphism/dt>dd>Giving animal attributes to humans./dd>/div> div classterm-item>dt>Pathetic Fallacy/dt>dd>Nature reflecting human emotion./dd>/div> div classterm-item>dt>Synesthesia/dt>dd>Mixing of senses (e.g., loud color)./dd>/div> div classterm-item>dt>Metonymy/dt>dd>Substituting an associated word for the thing meant./dd>/div> div classterm-item>dt>Synecdoche/dt>dd>Using a part to represent the whole./dd>/div> div classterm-item>dt>Allusion/dt>dd>Reference to a famous person, event, or work./dd>/div> /div> !-- Rhetorical --> div classguide-category> h4>🧠 Logic & Rhetoric/h4> div classterm-item>dt>Hyperbole/dt>dd>Extreme exaggeration./dd>/div> div classterm-item>dt>Litotes/dt>dd>Understatement using double negatives./dd>/div> div classterm-item>dt>Antithesis/dt>dd>Juxtaposition of opposing ideas./dd>/div> div classterm-item>dt>Oxymoron/dt>dd>Combination of contradictory words./dd>/div> div classterm-item>dt>Paradox/dt>dd>A self-contradictory statement that may be true./dd>/div> div classterm-item>dt>Rhetorical Question/dt>dd>A question asked for effect, not an answer./dd>/div> div classterm-item>dt>Hypophora/dt>dd>Asking a question and immediately answering it./dd>/div> div classterm-item>dt>Aporia/dt>dd>Expression of doubt or uncertainty./dd>/div> /div> !-- Word Choice --> div classguide-category> h4>📖 Vocabulary/h4> div classterm-item>dt>Archaism/dt>dd>Use of old or obsolete language./dd>/div> div classterm-item>dt>Colloquialism/dt>dd>Informal or slang language./dd>/div> div classterm-item>dt>Jargon/dt>dd>Specialized language of a profession./dd>/div> div classterm-item>dt>Pleonasm/dt>dd>Use of redundant words./dd>/div> div classterm-item>dt>Tautology/dt>dd>Saying the same thing twice in different words./dd>/div> div classterm-item>dt>Euphemism/dt>dd>Mild word substited for a harsh one./dd>/div> div classterm-item>dt>Dysphemism/dt>dd>Harsh word substituted for a neutral one./dd>/div> div classterm-item>dt>Portmanteau/dt>dd>Blending two words into one./dd>/div> /div> /div> /div> /div>/div>script> // --- Helper Functions --- const clean (s) > s.toLowerCase().replace(/^a-z0-9\s/g, ).trim(); const getWords (s) > clean(s).split(/\s+/).filter(w > w.length > 0); const stem (w) > { if(!w) return ; w w.toLowerCase(); if(w.endsWith(ing)) return w.slice(0, -3); if(w.endsWith(ed)) return w.slice(0, -2); if(w.endsWith(s) && !w.endsWith(ss)) return w.slice(0, -1); return w; }; // --- Data Lists --- const data { humanVerbs: whisper,scream,sing,dance,cry,laugh,smile,think,dream,hope,plan,hate,love,marry,divorce,worry,judge,mutter,shout, animalWords: bark,growl,hiss,claw,paw,snarl,howl,purr,chirp,moo,bleat,gallop,trot,tail, absoluteWords: always,never,forever,million,billion,infinite,endless,dying of,starving,everyone,everywhere,nowhere,nothing,perfect,impossible, soundWords: bang,buzz,click,hiss,sizzle,snap,splash,drip,clatter,thump,tick,tock,whack,boom,chirp,creak,flutter,gurgle,honk,plop,pop,purr,rattle,screech,slurp,squeak,whimper,whoosh,zip,zoom, oxymorons: deafening silence,open secret,living dead,alone together,clearly confused,bittersweet,crash landing,seriously funny,jumbo shrimp,virtual reality,old news,small crowd,act naturally,found missing,pretty ugly, euphemisms: passed away,let go,between jobs,economical with the truth,powder my nose,sleeping together,collateral damage,negative patient outcome,relocation center,correctional facility, dysphemisms: loony bin,shrink,pig,croak,worm food,nutcase,bean counter,ambulance chaser,cancer stick,fuzz, archaisms: thou,thee,thy,thine,hath,dost,art,shalt,wilt,hither,thither,yonder,betwixt,forsooth,verily, cliches: time will tell,nervous wreck,fit as a fiddle,brave as a lion,opposites attract,read between the lines,uphill battle,calm before the storm,diamond in the rough,last straw,piece of cake, jargon: bandwidth,synergy,deep dive,leverage,paradigm shift,touch base,low-hanging fruit,deliverables,actionable,scalability,drill down, metonyms: crown,white house,pentagon,hollywood,wall street,press,bench,suits,brass,oval office, synecdoche: wheels,hands,boots,sails,threads,plastic,bread,head,roof, pleonasms: burning fire,black darkness,free gift,unexpected surprise,past history,end result,sum total,frozen ice,tuna fish,atm machine,pin number, antonyms: hot,cold,big,small,life,death,good,bad,love,hate,war,peace,light,dark,day,night,young,old,fast,slow,win,lose,friend,enemy,truth,lie, synesthesia: loud color,sweet sound,bitter cold,warm voice,sharp taste,cool color,heavy silence,smooth taste,bright sound,soft light, allusions: eden,scrooge,romeo,juliet,achilles,midas,hercules,einstein,sherlock,frankenstein,big brother,catch-22,odyssey,titanic,mona lisa }; // --- Detectors --- // Returns object { match: boolean, data: any, category: string } const detectors { // --- Sound --- Alliteration: (s) > { const words getWords(s); if (words.length 3) return null; let matches {}; for(let i0; iwords.length-1; i++) { let char wordsi0; if (!char || aeiou.includes(char)) continue; if (wordsi+10 char) { if (!matcheschar) matcheschar wordsi; matcheschar.push(wordsi+1); } } let res Object.entries(matches).filter((k,v) > new Set(v).size > 2); return res.length > 0 ? { data: res, cat: tag-sound } : null; }, Assonance: (s) > { // Basic vowel cluster check const words getWords(s); const vowels words.map(w > w.match(/aeiou+/g)).flat().filter(x>x); // Count occurrences const counts {}; vowels.forEach(v > countsv (countsv||0)+1); const matches Object.entries(counts).filter((k,v) > v > 3 && k.length > 0); return matches.length > 0 ? { data: matches, cat: tag-sound } : null; }, Sibilance: (s) > { const total s.length; const sCount (s.match(/s|sh|z|zh|ch/gi) || ).length; return (sCount > 5 && (sCount/total) > 0.1) ? { data: sCount, cat: tag-sound } : null; }, Euphony: (s) > { const total s.length; const soft (s.match(/lmnrfvwh/gi) || ).length; return (total > 20 && (soft/total) > 0.4) ? { data: soft, cat: tag-sound } : null; }, Cacophony: (s) > { const total s.length; const hard (s.match(/kgbtpq/gi) || ).length; return (total > 20 && (hard/total) > 0.25) ? { data: hard, cat: tag-sound } : null; }, Onomatopoeia: (s) > { const found data.soundWords.filter(w > new RegExp(`\\b${w}\\b`, i).test(s)); return found.length > 0 ? { data: found, cat: tag-sound } : null; }, // --- Repetition --- Anaphora: (s, prev) > { if (!prev) return null; const w1 getWords(s).slice(0,2).join( ); const w2 getWords(prev).slice(0,2).join( ); return (w1.length > 3 && w1 w2) ? { data: w1, cat: tag-repetition } : null; }, Epistrophe: (s, prev) > { if (!prev) return null; const w1 getWords(s).slice(-1)0; const w2 getWords(prev).slice(-1)0; return (w1 && w1.length > 3 && w1 w2) ? { data: w1, cat: tag-repetition } : null; }, Symploce: (s, prev) > { // Checks for both Anaphora and Epistrophe if (!prev) return null; const start1 getWords(s)0, start2 getWords(prev)0; const end1 getWords(s).slice(-1)0, end2 getWords(prev).slice(-1)0; return (start1start2 && end1end2 && start1.length > 2) ? { data: {start: start1, end: end1}, cat: tag-repetition } : null; }, Anadiplosis: (s, prev) > { // Check clause level or sentence level const words getWords(s); if (prev) { const prevLast getWords(prev).slice(-1)0; if (prevLast && words0 prevLast) return { data: words0, cat: tag-repetition }; } // Check within sentence (comma separation) const parts s.split(/,;/); for(let i0; iparts.length-1; i++) { const end getWords(partsi).slice(-1)0; const start getWords(partsi+1)0; if (end && start && end start) return { data: end, cat: tag-repetition }; } return null; }, Epizeuxis: (s) > { const words getWords(s); for(let i0; iwords.length-1; i++) { if(wordsi wordsi+1 && wordsi.length > 2) return { data: wordsi, cat: tag-repetition }; } return null; }, Diacope: (s) > { const words getWords(s); for(let i0; iwords.length-2; i++) { if(wordsi wordsi+2 && wordsi.length > 2) return { data: wordsi, cat: tag-repetition }; } return null; }, Conduplicatio: (s, prev) > { if(!prev) return null; const w1 getWords(s); const w2 getWords(prev); // Look for non-trivial words repeated const intersection w1.filter(x > w2.includes(x) && x.length > 4); return intersection.length > 0 ? { data: ...new Set(intersection), cat: tag-repetition } : null; }, Polyptoton: (s) > { const words getWords(s); const stems words.map(stem); const counts {}; stems.forEach(st > { if(st.length>3) countsst (countsst||0)+1 }); const matches Object.entries(counts).filter((k,v) > v>2); return matches.length > 0 ? { data: matches.map(m>m0), cat: tag-repetition } : null; }, // --- Structure --- Asyndeton: (s) > { const commas (s.match(/,/g)||).length; const ands (s.match(/\band\b/gi)||).length; return (commas > 2 && ands 0) ? { data: commas, cat: tag-structure } : null; }, Polysyndeton: (s) > { const ands (s.match(/\b(and|or)\b/gi)||).length; return ands > 3 ? { data: ands, cat: tag-structure } : null; }, Tricolon: (s) > { const parts s.split(/,;/); return (parts.length 3 && Math.abs(parts0.length - parts1.length) 10) ? { data: parts, cat: tag-structure } : null; }, Isocolon: (s) > { const parts s.split(/,;/); if (parts.length ! 2) return null; const l1 getWords(parts0).length; const l2 getWords(parts1).length; return (l1 > 3 && Math.abs(l1 - l2) 1) ? { data: l1,l2, cat: tag-structure } : null; }, Antimetabole: (s) > { const parts s.split(/,;/); if (parts.length 2) return null; const w1 getWords(parts0); const w2 getWords(parts1); const intersection w1.filter(x > w2.includes(x)); return (intersection.length > 2 && w10 ! w20) ? { data: intersection, cat: tag-structure } : null; }, Parallelism: (s) > { const ings (s.match(/\w+ing\b/g)||).length; const eds (s.match(/\w+ed\b/g)||).length; return (ings > 3 || eds > 3) ? { data: ings>3?ing:ed, cat: tag-structure } : null; }, Parenthesis: (s) > { return (s.includes(() && s.includes())) ? { data: (), cat: tag-structure } : null; }, Enumeratio: (s) > { const indicators first, second, third, one, two, three, next, then, finally; const found indicators.filter(i > new RegExp(`\\b${i}\\b`, i).test(s)); return found.length > 3 ? { data: found, cat: tag-structure } : null; }, // --- Figurative --- Simile: (s) > { const regex /\b(like|as)\b\s+(?:a|an|the)?\s*(a-z+)/gi; let matches ; let match; while ((match regex.exec(s)) ! null) { if (match1like && i,we,you.includes(getWords(s.substring(0,match.index)).pop())) continue; matches.push(match0); } return matches.length > 0 ? { data: matches, cat: tag-figurative } : null; }, Metaphor: (s) > { const regex /\b(is|are|was|were)\s+(?:a|an|the)\s+(a-z+)/gi; let matches ; let match; while ((match regex.exec(s)) ! null) matches.push(match0); return matches.length > 0 ? { data: matches, cat: tag-figurative } : null; }, Personification: (s) > { const found data.humanVerbs.filter(v > new RegExp(`\\b${v}\\w*\\b`, i).test(s)); return found.length > 0 ? { data: found, cat: tag-figurative } : null; }, Zoomorphism: (s) > { const found data.animalWords.filter(v > new RegExp(`\\b${v}\\w*\\b`, i).test(s)); return found.length > 0 ? { data: found, cat: tag-figurative } : null; }, Pathetic Fallacy: (s) > { const nature rain,wind,sun,sky,cloud,storm,weather; const emotion angry,sad,happy,weeping,smiling,cruel,kind; const hasNature nature.some(w > s.toLowerCase().includes(w)); const hasEmotion emotion.some(w > s.toLowerCase().includes(w)); return (hasNature && hasEmotion) ? { data: nature+emotion, cat: tag-figurative } : null; }, Synesthesia: (s) > { const found data.synesthesia.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-figurative } : null; }, Metonymy: (s) > { const found data.metonyms.filter(w > new RegExp(`\\b${w}\\b`, i).test(s)); return found.length > 0 ? { data: found, cat: tag-figurative } : null; }, Synecdoche: (s) > { const found data.synecdoche.filter(w > new RegExp(`\\b${w}\\b`, i).test(s)); return found.length > 0 ? { data: found, cat: tag-figurative } : null; }, Allusion: (s) > { const found data.allusions.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-figurative } : null; }, // --- Rhetorical --- Hyperbole: (s) > { const found data.absoluteWords.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-rhetoric } : null; }, Litotes: (s) > { const match s.match(/\bnot\s+(?:un|in|dis|bad|poor|ugly|small)\w*/gi); return match ? { data: match, cat: tag-rhetoric } : null; }, Antithesis: (s) > { const words getWords(s); const found ; data.antonyms.forEach((a,b) > { if (words.includes(a) && words.includes(b)) found.push(`${a}/${b}`); }); return found.length > 0 ? { data: found, cat: tag-rhetoric } : null; }, Oxymoron: (s) > { const found data.oxymorons.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-rhetoric } : null; }, Rhetorical Question: (s) > { return (s.trim().endsWith(?) && !/^(who|what|where|when|why)/i.test(s)) ? { data: ?, cat: tag-rhetoric } : null; }, Hypophora: (s, prev, next) > { if (s.trim().endsWith(?) && next && !next.trim().endsWith(?)) return { data: Q&A, cat: tag-rhetoric }; return null; }, Aporia: (s) > { return /^(i wonder|i doubt|i am unsure)/i.test(s) ? { data: doubt, cat: tag-rhetoric } : null; }, // --- Vocabulary --- Archaism: (s) > { const found data.archaisms.filter(w > new RegExp(`\\b${w}\\b`, i).test(s)); return found.length > 0 ? { data: found, cat: tag-word } : null; }, Colloquialism: (s) > { const list gonna,wanna,ain\t,kinda,y\all,cool,guys,stuff; const found list.filter(w > new RegExp(`\\b${w}\\b`, i).test(s)); return found.length > 0 ? { data: found, cat: tag-word } : null; }, Jargon: (s) > { const found data.jargon.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-word } : null; }, Pleonasm: (s) > { const found data.pleonasms.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-word } : null; }, Tautology: (s) > { // Very similar to pleonasm, check for word repetitions like ATM machine const found data.pleonasms.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-word } : null; }, Euphemism: (s) > { const found data.euphemisms.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-word } : null; }, Dysphemism: (s) > { const found data.dysphemisms.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-word } : null; }, Cliché: (s) > { const found data.cliches.filter(w > s.toLowerCase().includes(w)); return found.length > 0 ? { data: found, cat: tag-word } : null; } }; // --- Explanations --- const getExplanation (device, result, s) > { const d result.data; const note (text) > `p classeducational-note>${text}/p>`; const content { Alliteration: () > `p>Repeated initial sounds: span classhighlight-match>${d.map(x>x0).join(, )}/span> in words: em>${d.map(x>x1.join(, )).join(; )}/em>./p>${note(Creates rhythm and mnemonic stickiness.)}`, Assonance: () > `p>Repeated vowel clusters found in: span classhighlight-match>${d.map(x>x0).join(, )}/span>./p>${note(Creates internal rhyming and mood.)}`, Sibilance: () > `p>High concentration of s/sh sounds (${d} occurrences)./p>${note(Creates a hissing quality, often used for sinister or soft atmospheres.)}`, Euphony: () > `p>Dominance of soft consonants (l, m, n, r)./p>${note(Creates a pleasant, melodious effect.)}`, Cacophony: () > `p>Dominance of harsh plosives (k, g, b, t)./p>${note(Creates a jarring, discordant effect to mirror chaotic subjects.)}`, Onomatopoeia: () > `p>Sound-imitating words: span classhighlight-match>${d.join(, )}/span>./p>${note(Brings auditory imagery directly into the reader\s mind.)}`, Anaphora: () > `p>Starts with span classhighlight-match>${d}/span>, matching the previous sentence./p>${note(Builds momentum and emphasizes the starting concept.)}`, Epistrophe: () > `p>Ends with span classhighlight-match>${d}/span>, matching the previous sentence./p>${note(Creates a hammering rhythm and reinforces the final thought.)}`, Symploce: () > `p>Matches both start (${d.start}) and end (${d.end}) of previous sentence./p>${note(Combines the effects of Anaphora and Epistrophe for total emphasis.)}`, Anadiplosis: () > `p>Connects clauses using the word span classhighlight-match>${d}/span>./p>${note(Creates a chain-link effect that carries the reader forward.)}`, Epizeuxis: () > `p>Immediate repetition of span classhighlight-match>${d}/span>./p>${note(Communicates intense emotion or vehemence.)}`, Diacope: () > `p>Repetition of span classhighlight-match>${d}/span> broken by intervening words./p>${note(Reinforces a key concept while adding detail.)}`, Conduplicatio: () > `p>Repetition of keyword span classhighlight-match>${d.join(, )}/span> from previous sentence./p>${note(Maintains focus on the central theme across sentences.)}`, Polyptoton: () > `p>Use of root variations: span classhighlight-match>${d.join(, )}/span>./p>${note(Shows different aspects of the same concept.)}`, Asyndeton: () > `p>List separated only by commas (${d} commas, no conjunctions)./p>${note(Speeds up the rhythm, suggesting an endless or rapid list.)}`, Polysyndeton: () > `p>Frequent use of conjunctions (${d} occurrences)./p>${note(Slows down the rhythm, giving equal weight to every item.)}`, Tricolon: () > `p>Sentence composed of three distinct parts./p>${note(The Rule of Three makes ideas more memorable and satisfying.)}`, Isocolon: () > `p>Two parts of roughly equal length (${d0} vs ${d1} words)./p>${note(Creates a sense of balance, fairness, and order.)}`, Antimetabole: () > `p>Words repeated in reverse order: span classhighlight-match>${d.join(, )}/span>./p>${note(Demonstrates that reality is not one-sided.)}`, Parallelism: () > `p>Repeated grammatical structure ending in span classhighlight-match>-${d}/span>./p>${note(Create patterns that are easy to process and remember.)}`, Parenthesis: () > `p>Use of parentheses to insert a thought./p>${note(Adds a whisper, an aside, or a clarification.)}`, Enumeratio: () > `p>Systematic listing: span classhighlight-match>${d.join(, )}/span>./p>${note(Used for organizing arguments or detailing proofs.)}`, Simile: () > `p>Comparison found: span classhighlight-match>${d.join(, )}/span>./p>${note(Connects the subject to a known image using like or as.)}`, Metaphor: () > `p>Direct identification: span classhighlight-match>${d.join(, )}/span>./p>${note(Asserts that the subject IS the image, creating a stronger bond than a simile.)}`, Personification: () > `p>Human verbs applied to subject: span classhighlight-match>${d.join(, )}/span>./p>${note(Makes abstract or inanimate things feel alive and relatable.)}`, Zoomorphism: () > `p>Animal traits applied: span classhighlight-match>${d.join(, )}/span>./p>${note(Reduces the subject to primal, beast-like instincts.)}`, Pathetic Fallacy: () > `p>Nature reflects emotion./p>${note(Projects human mood onto the environment.)}`, Synesthesia: () > `p>Sensory mixing: span classhighlight-match>${d.join(, )}/span>./p>${note(Creates vivid, surreal imagery that appeals to multiple senses.)}`, Metonymy: () > `p>Association used: span classhighlight-match>${d.join(, )}/span>./p>${note(Emphasizes a specific aspect of the concept.)}`, Synecdoche: () > `p>Part representing whole: span classhighlight-match>${d.join(, )}/span>./p>${note(Highlights the most essential part of the object.)}`, Allusion: () > `p>Reference to: span classhighlight-match>${d.join(, )}/span>./p>${note(Borrows the cultural weight and meaning of the referenced work.)}`, Hyperbole: () > `p>Extreme language: span classhighlight-match>${d.join(, )}/span>./p>${note(Used for emphasis or humor, not literal truth.)}`, Litotes: () > `p>Understatement via negation: span classhighlight-match>${d.join(, )}/span>./p>${note(Often acts as a modest or ironic way to affirm something.)}`, Antithesis: () > `p>Opposing concepts: span classhighlight-match>${d.join(, )}/span>./p>${note(Clarifies differences and creates dramatic contrast.)}`, Oxymoron: () > `p>Contradictory terms: span classhighlight-match>${d.join(, )}/span>./p>${note(Reveals a deeper paradox or complexity.)}`, Rhetorical Question: () > `p>Question ending without immediate answer structure./p>${note(Provokes thought or implies the answer is obvious.)}`, Hypophora: () > `p>Question immediately followed by a statement./p>${note(Allows the speaker to control the conversation by asking and answering their own questions.)}`, Aporia: () > `p>Expression of doubt./p>${note(Engages the audience in the speaker\s uncertainty.)}`, Archaism: () > `p>Old language: span classhighlight-match>${d.join(, )}/span>./p>${note(Adds a sense of history, biblical weight, or fantasy.)}`, Colloquialism: () > `p>Informal language: span classhighlight-match>${d.join(, )}/span>./p>${note(Creates a conversational, authentic tone.)}`, Jargon: () > `p>Technical language: span classhighlight-match>${d.join(, )}/span>./p>${note(Establishes authority or excludes outsiders.)}`, Pleonasm: () > `p>Redundant phrasing: span classhighlight-match>${d.join(, )}/span>./p>${note(Can be an error, or used for emphasis.)}`, Euphemism: () > `p>Softened term: span classhighlight-match>${d.join(, )}/span>./p>${note(Avoids harsh reality.)}`, Dysphemism: () > `p>Harsh term: span classhighlight-match>${d.join(, )}/span>./p>${note(Intentionally shocks or offends.)}`, Cliché: () > `p>Overused phrase: span classhighlight-match>${d.join(, )}/span>./p>${note(Often loses its original meaning due to overuse.)}` }; return contentdevice ? contentdevice() : `p>Pattern detected: ${JSON.stringify(d)}/p>`; }; // --- Main Logic --- function analyzeText() { const text document.getElementById(textInput).value.trim(); const resultsDiv document.getElementById(results); if (!text) { alert(Please enter some text to analyze.); return; } // Split text into sentences (basic split) const sentences text.match(/^.!?+.!?+|^.!?+$/g) || text; resultsDiv.innerHTML ; sentences.forEach((sentence, index) > { const rawSentence sentence; sentence sentence.trim(); if (!sentence) return; const prevSentence index > 0 ? sentencesindex-1.trim() : null; const nextSentence index sentences.length - 1 ? sentencesindex+1.trim() : null; let detections {}; // Run all detectors for (let device, detector of Object.entries(detectors)) { let result detector(sentence, prevSentence, nextSentence); if (result) { detectionsdevice result; } } // Create UI Card const card document.createElement(div); card.className sentence-card; // Generate Tags HTML let tagsHtml ; if (Object.keys(detections).length 0) { tagsHtml `span classdevice-tag no-device-tag>No devices detected/span>`; } else { for (let device in detections) { const catClass detectionsdevice.cat || ; tagsHtml + `span classdevice-tag ${catClass} onclicktoggleAnalysis(this, analysis-${index}-${device.replace(/\s/g,)})>${device}/span>`; } } // Generate Detail Sections HTML let detailsHtml ; for (let device in detections) { const content getExplanation(device, detectionsdevice, sentence); detailsHtml + ` div idanalysis-${index}-${device.replace(/\s/g,)} classanalysis-detail> div classanalysis-content> div classanalysis-title> span stylefont-size: 1.2rem;>🔍/span> ${device} Analysis /div> div classanalysis-box> ${content} /div> /div> /div> `; } card.innerHTML ` div classsentence-header> div classsentence-meta> span>Sentence ${index + 1}/span> span>${Object.keys(detections).length} Devices/span> /div> div classsentence-content>${rawSentence}/div> div classtag-container> ${tagsHtml} /div> /div> ${detailsHtml} `; resultsDiv.appendChild(card); }); } // --- UI Interactions --- function toggleAnalysis(tag, id) { const isActive tag.classList.contains(active); const card tag.closest(.sentence-card); // Reset siblings card.querySelectorAll(.device-tag).forEach(t > t.classList.remove(active)); card.querySelectorAll(.analysis-detail).forEach(d > d.classList.remove(open)); if (!isActive) { tag.classList.add(active); const target document.getElementById(id); if (target) target.classList.add(open); } } function toggleModal(modalId) { const modal document.getElementById(modalId); modal.style.display (modal.style.display block) ? none : block; } window.onclick function(event) { if (event.target.classList.contains(modal)) { event.target.style.display none; } }/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]