<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Free Online Tools - Imediacto</title>
	<atom:link href="https://imediacto.com/category/tools/feed/" rel="self" type="application/rss+xml" />
	<link>https://imediacto.com/category/tools/</link>
	<description>Free Online Tool Set for Text and HTML</description>
	<lastBuildDate>Tue, 09 Jun 2026 09:43:01 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://imediacto.com/wp-content/uploads/2020/04/cropped-favicon-32x32.png</url>
	<title>Free Online Tools - Imediacto</title>
	<link>https://imediacto.com/category/tools/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Random Name Generator</title>
		<link>https://imediacto.com/tools/name-generators/random-name-generator/</link>
					<comments>https://imediacto.com/tools/name-generators/random-name-generator/#respond</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 09:43:01 +0000</pubDate>
				<category><![CDATA[Name Generators]]></category>
		<category><![CDATA[Random Name Generator]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=411</guid>

					<description><![CDATA[<p>Random Name Generator is a free online tool to generate realistic human names by country, gender, style, and name structure. Export as TXT, JSON, CSV, and HTML list.</p>
<p>The post <a href="https://imediacto.com/tools/name-generators/random-name-generator/">Random Name Generator</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot random-name-generator">
            <div class="row mb-3">
                <div class="col-sm-12">
                    <h2>Generate Realistic Names by Country</h2>
                    <p>
                        <strong>Random Name Generator</strong> is a clean and practical online tool to create realistic
                        names with country, gender, style, and structure filters. You can also add optional metadata
                        such as age, nationality, locality, and language, then export results as TXT, JSON, CSV, and
                        HTML lists.
                    </p>
                </div>
            </div>

            <div class="tool-panel">
                <h3 class="step-title">Step 1) Select one or more countries</h3>
                <p class="step-help">Use presets for faster selection, or click countries manually.</p>

                <div class="preset-row">
                    <button class="preset-btn" type="button" onclick="applyPreset('western')">Western preset</button>
                    <button class="preset-btn" type="button" onclick="applyPreset('latin')">Latin preset</button>
                    <button class="preset-btn" type="button" onclick="applyPreset('asian')">Asian preset</button>
                    <button class="preset-btn" type="button" onclick="applyPreset('nordic')">Nordic preset</button>
                    <button class="preset-btn" type="button" onclick="clearCountrySelection()">Clear countries</button>
                </div>

                <div id="countriesGrid" class="countries-grid"></div>
                <div id="selectedCount" class="counter">0 countries selected</div>
                <div id="validationMessage" class="error-inline none"></div>
            </div>

            <div class="tool-panel">
                <h3 class="step-title">Step 2) Configure generation</h3>
                <p class="step-help">Choose structure, gender, style and quantity. Defaults are optimized for fast use.</p>

                <div class="controls-grid">
                    <div>
                        <label for="nameStructure"><strong>Name structure</strong></label>
                        <div class="radio-group">
                            <label><input type="radio" name="nameStructure" value="firstOnly">First name only</label>
                            <label><input type="radio" name="nameStructure" value="firstOne" checked>First + 1 surname</label>
                            <label><input type="radio" name="nameStructure" value="firstTwo">First + 2 surnames</label>
                            <label><input type="radio" name="nameStructure" value="firstFour">First + 4 surnames</label>
                        </div>
                    </div>

                    <div>
                        <label for="gender"><strong>Gender</strong></label>
                        <div class="radio-group">
                            <label><input type="radio" name="gender" value="male">Male</label>
                            <label><input type="radio" name="gender" value="female">Female</label>
                            <label><input type="radio" name="gender" value="both" checked>Both</label>
                            <label><input type="checkbox" id="includeUnisex">Include ambiguous names</label>
                        </div>
                    </div>

                    <div>
                        <label for="nameStyle"><strong>Name style</strong></label>
                        <div class="radio-group">
                            <label><input type="radio" name="nameStyle" value="modern">Modern</label>
                            <label><input type="radio" name="nameStyle" value="classic">Classic</label>
                            <label><input type="radio" name="nameStyle" value="traditional">Traditional</label>
                            <label><input type="radio" name="nameStyle" value="mixed" checked>Mixed</label>
                        </div>
                    </div>

                    <div>
                        <label for="quantity"><strong>Names quantity</strong></label>
                        <input type="number" id="quantity" min="1" max="100" value="20">
                        <p class="step-help">Min 1, max 100. For multiple countries, total is distributed automatically.</p>
                    </div>
                </div>
            </div>

            <div class="tool-panel">
                <h3 class="step-title">Step 3) Select extra output fields (optional)</h3>
                <p class="step-help">These fields appear in results and are included in JSON, CSV, and HTML exports.</p>

                <div class="radio-group">
                    <label class="extra-field"><input type="checkbox" class="extra-checkbox" value="age">Age</label>
                    <label class="extra-field"><input type="checkbox" class="extra-checkbox" value="sex">Sex</label>
                    <label class="extra-field"><input type="checkbox" class="extra-checkbox" value="country">Country</label>
                    <label class="extra-field"><input type="checkbox" class="extra-checkbox" value="nationality">Nationality</label>
                    <label class="extra-field"><input type="checkbox" class="extra-checkbox" value="locality">Locality</label>
                    <label class="extra-field"><input type="checkbox" class="extra-checkbox" value="language">Language</label>
                    <label class="extra-field"><input type="checkbox" class="extra-checkbox" value="popularity">Popularity</label>
                </div>

                <div class="actions">
                    <button id="generateButton" class="btn btn-success" onclick="generateNames()"><i class="fa fa-magic"></i> Generate names</button>
                    <button class="btn btn-light" onclick="clearResults()"><i class="fa fa-eraser"></i> Clear output</button>
                </div>

                <div id="emptyState" class="empty-state">
                    Select at least one country, keep default options if you want, and click Generate names.
                </div>

                <div id="summary" class="summary none"></div>
                <div id="stats" class="stats none"></div>

                <div id="resultTools" class="result-tools none">
                    <button class="soft" onclick="copyToClipboard('plainOutput', 'checkCopy')" title="Copy output to clipboard"><i class="fa fa-copy"></i> Copy</button>
                    <button class="soft" onclick="downloadTxt()" title="Download TXT"><i class="fa fa-download"></i> TXT</button>
                    <button class="soft" onclick="downloadJson()" title="Download JSON"><i class="fa fa-download"></i> JSON</button>
                    <button class="soft" onclick="downloadCsv()" title="Download CSV"><i class="fa fa-download"></i> CSV</button>
                    <button class="soft" onclick="downloadHtmlList('ol')" title="Download ordered HTML list"><i class="fa fa-download"></i> HTML OL</button>
                    <button class="soft" onclick="downloadHtmlList('ul')" title="Download unordered HTML list"><i class="fa fa-download"></i> HTML UL</button>
                    <div id="checkCopy" class="check none"></div>
                </div>

                <div id="resultsCards" class="results-cards"></div>
                <ol id="resultsList" class="results-list none"></ol>
                <div id="plainOutput" class="none"></div>
            </div>

            <hr>

            <div class="more-notes entry-content">
                <h2>What is a Random Name Generator?</h2>
                <p>
                    A random name generator creates realistic person names for scripts, books, NPC creation, test data,
                    game rosters, and creative brainstorming. This tool focuses on country-aware naming structures.
                </p>

                <h2>Why country-based names improve realism</h2>
                <p>
                    Names from different countries follow different first-name and surname patterns. Choosing country,
                    style, and structure helps generate names that feel more authentic to a region and language.
                </p>

                <h2>How the style filter works</h2>
                <p>
                    Use <strong>modern</strong> for contemporary names, <strong>classic</strong> for historically common
                    names, and <strong>traditional</strong> for names with stronger cultural roots. Mixed combines all styles.
                </p>

                <h2>Top 20 names by country</h2>
                <h3>USA</h3>
                <p>James, Michael, William, Alexander, Benjamin, Emma, Olivia, Sophia, Charlotte, Amelia, Mason, Ethan, Harper, Evelyn, Lucas, Henry, Scarlett, Zoe, Jack, Ella.</p>
                <h3>UK</h3>
                <p>Oliver, George, Arthur, Harry, Leo, Jack, Amelia, Isla, Florence, Freya, Noah, Oscar, Archie, Ava, Ivy, Elsie, Theo, Lily, Alfie, Grace.</p>
                <h3>Spain</h3>
                <p>Alejandro, Mateo, Hugo, Daniel, Pablo, Lucia, Sofia, Martina, Carmen, Alba, Javier, Miguel, Laura, Maria, Elena, Diego, Adriana, Raul, Ines, Clara.</p>
                <h3>France</h3>
                <p>Louis, Gabriel, Jules, Arthur, Hugo, Emma, Louise, Chloe, Lea, Camille, Antoine, Paul, Sarah, Claire, Elise, Theo, Lucas, Manon, Zoe, Jeanne.</p>
                <h3>Germany</h3>
                <p>Lukas, Leon, Felix, Jonas, Max, Mia, Emma, Hannah, Lina, Sofia, Finn, Noah, Anna, Lara, Johanna, Elias, Paul, Marie, Greta, Klara.</p>
                <h3>Brazil</h3>
                <p>Joao, Pedro, Gabriel, Lucas, Mateus, Maria, Ana, Julia, Beatriz, Isabela, Rafael, Felipe, Carolina, Fernanda, Luiza, Gustavo, Thiago, Larissa, Camila, Leticia.</p>

                <h2>Frequently Asked Questions (FAQ)</h2>
                <h3>Can I use generated names in commercial projects?</h3>
                <p>Yes. You can use generated results for scripts, game prototypes, stories, and similar creative work.</p>

                <h3>How does unisex mode work?</h3>
                <p>When the ambiguous checkbox is enabled, the generator includes names commonly used across more than one gender.</p>

                <h3>Why are there multiple surname options?</h3>
                <p>Different regions use one or more surnames. This option helps adapt name output to different conventions.</p>
            </div>

            <div class="notes">
                <div class="image"></div>
                <div class="message">
                    <p>
                        Send me your feedback about this <strong>Random Name Generator</strong> and tell me if you need
                        additional countries, better locality mappings, or more export options, so I can improve this tool.
                    </p>
                    <p>
                        You can contribute with fixes and improvements on Github:
                        <a href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/013-random-name-generator" target="_blank">Github >> Random Name Generator</a>.
                        Pull requests are welcome.
                    </p>
                </div>
            </div>
        </div>

        <script>
            const COUNTRY_KEYS = [
                'USA', 'UK', 'Spain', 'France', 'Germany', 'Italy', 'Brazil', 'Japan', 'India', 'Russia', 'Sweden', 'Netherlands'
            ];

            const PRESETS = {
                western: ['USA', 'UK', 'France', 'Germany', 'Netherlands'],
                latin: ['Spain', 'Italy', 'Brazil'],
                asian: ['Japan', 'India'],
                nordic: ['Sweden', 'Russia']
            };

            const selectedCountries = new Set();
            let generatedRecords = [];

            const COUNTRY_BANK = {
                USA: {
                    nationality: 'American',
                    languages: ['English'],
                    localities: ['New York', 'Los Angeles', 'Chicago', 'Austin', 'Seattle', 'Boston'],
                    male: [
                        { name: 'James', style: 'classic', popularity: 'common' },
                        { name: 'Michael', style: 'classic', popularity: 'common' },
                        { name: 'Noah', style: 'modern', popularity: 'common' },
                        { name: 'Logan', style: 'modern', popularity: 'common' },
                        { name: 'Theodore', style: 'traditional', popularity: 'rare' },
                        { name: 'Ethan', style: 'modern', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Emma', style: 'classic', popularity: 'common' },
                        { name: 'Olivia', style: 'modern', popularity: 'common' },
                        { name: 'Amelia', style: 'classic', popularity: 'common' },
                        { name: 'Charlotte', style: 'traditional', popularity: 'rare' },
                        { name: 'Harper', style: 'modern', popularity: 'common' },
                        { name: 'Evelyn', style: 'classic', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Noa', style: 'modern', popularity: 'common' },
                        { name: 'Taylor', style: 'classic', popularity: 'common' },
                        { name: 'Jordan', style: 'classic', popularity: 'common' }
                    ],
                    surnames: ['Smith', 'Johnson', 'Brown', 'Miller', 'Davis', 'Anderson', 'Moore', 'Clark']
                },
                UK: {
                    nationality: 'British',
                    languages: ['English'],
                    localities: ['London', 'Manchester', 'Liverpool', 'Bristol', 'Leeds', 'Oxford'],
                    male: [
                        { name: 'Oliver', style: 'modern', popularity: 'common' },
                        { name: 'George', style: 'classic', popularity: 'common' },
                        { name: 'Arthur', style: 'traditional', popularity: 'rare' },
                        { name: 'Harry', style: 'classic', popularity: 'common' },
                        { name: 'Leo', style: 'modern', popularity: 'common' },
                        { name: 'Alfie', style: 'traditional', popularity: 'rare' }
                    ],
                    female: [
                        { name: 'Isla', style: 'modern', popularity: 'common' },
                        { name: 'Freya', style: 'traditional', popularity: 'rare' },
                        { name: 'Amelia', style: 'classic', popularity: 'common' },
                        { name: 'Ivy', style: 'modern', popularity: 'common' },
                        { name: 'Grace', style: 'classic', popularity: 'common' },
                        { name: 'Florence', style: 'traditional', popularity: 'rare' }
                    ],
                    unisex: [
                        { name: 'Morgan', style: 'classic', popularity: 'common' },
                        { name: 'Alex', style: 'modern', popularity: 'common' },
                        { name: 'Riley', style: 'modern', popularity: 'rare' }
                    ],
                    surnames: ['Smith', 'Taylor', 'Walker', 'Wright', 'Turner', 'Carter', 'Evans', 'Foster']
                },
                Spain: {
                    nationality: 'Spanish',
                    languages: ['Spanish'],
                    localities: ['Madrid', 'Barcelona', 'Valencia', 'Seville', 'Bilbao', 'Granada'],
                    male: [
                        { name: 'Alejandro', style: 'classic', popularity: 'common' },
                        { name: 'Mateo', style: 'modern', popularity: 'common' },
                        { name: 'Hugo', style: 'modern', popularity: 'common' },
                        { name: 'Javier', style: 'traditional', popularity: 'rare' },
                        { name: 'Pablo', style: 'classic', popularity: 'common' },
                        { name: 'Miguel', style: 'traditional', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Lucia', style: 'modern', popularity: 'common' },
                        { name: 'Sofia', style: 'modern', popularity: 'common' },
                        { name: 'Martina', style: 'classic', popularity: 'common' },
                        { name: 'Carmen', style: 'traditional', popularity: 'rare' },
                        { name: 'Alba', style: 'modern', popularity: 'common' },
                        { name: 'Elena', style: 'classic', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Noa', style: 'modern', popularity: 'common' },
                        { name: 'Alexis', style: 'classic', popularity: 'rare' },
                        { name: 'Andrea', style: 'classic', popularity: 'common' }
                    ],
                    surnames: ['Garcia', 'Lopez', 'Martinez', 'Sanchez', 'Perez', 'Gomez', 'Ruiz', 'Hernandez']
                },
                France: {
                    nationality: 'French',
                    languages: ['French'],
                    localities: ['Paris', 'Lyon', 'Marseille', 'Toulouse', 'Nice', 'Bordeaux'],
                    male: [
                        { name: 'Louis', style: 'classic', popularity: 'common' },
                        { name: 'Gabriel', style: 'modern', popularity: 'common' },
                        { name: 'Jules', style: 'traditional', popularity: 'rare' },
                        { name: 'Hugo', style: 'modern', popularity: 'common' },
                        { name: 'Theo', style: 'modern', popularity: 'common' },
                        { name: 'Paul', style: 'classic', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Emma', style: 'modern', popularity: 'common' },
                        { name: 'Louise', style: 'traditional', popularity: 'rare' },
                        { name: 'Chloe', style: 'classic', popularity: 'common' },
                        { name: 'Lea', style: 'modern', popularity: 'common' },
                        { name: 'Camille', style: 'classic', popularity: 'common' },
                        { name: 'Jeanne', style: 'traditional', popularity: 'rare' }
                    ],
                    unisex: [
                        { name: 'Sasha', style: 'modern', popularity: 'rare' },
                        { name: 'Claude', style: 'traditional', popularity: 'rare' },
                        { name: 'Noel', style: 'classic', popularity: 'rare' }
                    ],
                    surnames: ['Martin', 'Bernard', 'Dubois', 'Thomas', 'Robert', 'Richard', 'Petit', 'Moreau']
                },
                Germany: {
                    nationality: 'German',
                    languages: ['German'],
                    localities: ['Berlin', 'Munich', 'Hamburg', 'Cologne', 'Frankfurt', 'Stuttgart'],
                    male: [
                        { name: 'Lukas', style: 'modern', popularity: 'common' },
                        { name: 'Leon', style: 'modern', popularity: 'common' },
                        { name: 'Felix', style: 'classic', popularity: 'common' },
                        { name: 'Jonas', style: 'classic', popularity: 'common' },
                        { name: 'Maximilian', style: 'traditional', popularity: 'rare' },
                        { name: 'Finn', style: 'modern', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Mia', style: 'modern', popularity: 'common' },
                        { name: 'Hannah', style: 'classic', popularity: 'common' },
                        { name: 'Sofia', style: 'modern', popularity: 'common' },
                        { name: 'Lina', style: 'modern', popularity: 'common' },
                        { name: 'Johanna', style: 'traditional', popularity: 'rare' },
                        { name: 'Klara', style: 'traditional', popularity: 'rare' }
                    ],
                    unisex: [
                        { name: 'Nico', style: 'modern', popularity: 'common' },
                        { name: 'Luca', style: 'modern', popularity: 'common' },
                        { name: 'Robin', style: 'classic', popularity: 'common' }
                    ],
                    surnames: ['Muller', 'Schmidt', 'Schneider', 'Fischer', 'Weber', 'Meyer', 'Wagner', 'Becker']
                },
                Italy: {
                    nationality: 'Italian',
                    languages: ['Italian'],
                    localities: ['Rome', 'Milan', 'Naples', 'Turin', 'Florence', 'Bologna'],
                    male: [
                        { name: 'Luca', style: 'modern', popularity: 'common' },
                        { name: 'Leonardo', style: 'classic', popularity: 'common' },
                        { name: 'Matteo', style: 'modern', popularity: 'common' },
                        { name: 'Giovanni', style: 'traditional', popularity: 'rare' },
                        { name: 'Alessandro', style: 'classic', popularity: 'common' },
                        { name: 'Marco', style: 'classic', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Giulia', style: 'modern', popularity: 'common' },
                        { name: 'Sofia', style: 'modern', popularity: 'common' },
                        { name: 'Francesca', style: 'classic', popularity: 'common' },
                        { name: 'Chiara', style: 'classic', popularity: 'common' },
                        { name: 'Beatrice', style: 'traditional', popularity: 'rare' },
                        { name: 'Elena', style: 'classic', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Andrea', style: 'classic', popularity: 'common' },
                        { name: 'Gabriele', style: 'modern', popularity: 'rare' },
                        { name: 'Lorenza', style: 'traditional', popularity: 'rare' }
                    ],
                    surnames: ['Rossi', 'Russo', 'Ferrari', 'Esposito', 'Bianchi', 'Romano', 'Gallo', 'Costa']
                },
                Brazil: {
                    nationality: 'Brazilian',
                    languages: ['Portuguese'],
                    localities: ['Sao Paulo', 'Rio de Janeiro', 'Belo Horizonte', 'Curitiba', 'Salvador', 'Recife'],
                    male: [
                        { name: 'Joao', style: 'traditional', popularity: 'common' },
                        { name: 'Pedro', style: 'classic', popularity: 'common' },
                        { name: 'Gabriel', style: 'modern', popularity: 'common' },
                        { name: 'Lucas', style: 'modern', popularity: 'common' },
                        { name: 'Rafael', style: 'classic', popularity: 'common' },
                        { name: 'Thiago', style: 'traditional', popularity: 'rare' }
                    ],
                    female: [
                        { name: 'Maria', style: 'traditional', popularity: 'common' },
                        { name: 'Ana', style: 'classic', popularity: 'common' },
                        { name: 'Julia', style: 'modern', popularity: 'common' },
                        { name: 'Beatriz', style: 'classic', popularity: 'common' },
                        { name: 'Isabela', style: 'modern', popularity: 'common' },
                        { name: 'Luiza', style: 'modern', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Noa', style: 'modern', popularity: 'rare' },
                        { name: 'Alex', style: 'modern', popularity: 'common' },
                        { name: 'Ariel', style: 'classic', popularity: 'rare' }
                    ],
                    surnames: ['Silva', 'Santos', 'Oliveira', 'Souza', 'Lima', 'Costa', 'Pereira', 'Almeida']
                },
                Japan: {
                    nationality: 'Japanese',
                    languages: ['Japanese'],
                    localities: ['Tokyo', 'Osaka', 'Kyoto', 'Sapporo', 'Fukuoka', 'Yokohama'],
                    male: [
                        { name: 'Haruto', style: 'modern', popularity: 'common' },
                        { name: 'Ren', style: 'modern', popularity: 'common' },
                        { name: 'Yuto', style: 'modern', popularity: 'common' },
                        { name: 'Takumi', style: 'classic', popularity: 'common' },
                        { name: 'Daiki', style: 'traditional', popularity: 'rare' },
                        { name: 'Kenta', style: 'classic', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Yui', style: 'modern', popularity: 'common' },
                        { name: 'Aoi', style: 'modern', popularity: 'common' },
                        { name: 'Sakura', style: 'traditional', popularity: 'common' },
                        { name: 'Hina', style: 'modern', popularity: 'common' },
                        { name: 'Mio', style: 'classic', popularity: 'common' },
                        { name: 'Akari', style: 'modern', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Haru', style: 'modern', popularity: 'common' },
                        { name: 'Rei', style: 'classic', popularity: 'common' },
                        { name: 'Kaoru', style: 'traditional', popularity: 'rare' }
                    ],
                    surnames: ['Sato', 'Suzuki', 'Takahashi', 'Tanaka', 'Watanabe', 'Ito', 'Yamamoto', 'Nakamura']
                },
                India: {
                    nationality: 'Indian',
                    languages: ['Hindi', 'English'],
                    localities: ['Mumbai', 'Delhi', 'Bangalore', 'Hyderabad', 'Pune', 'Chennai'],
                    male: [
                        { name: 'Aarav', style: 'modern', popularity: 'common' },
                        { name: 'Vihaan', style: 'modern', popularity: 'common' },
                        { name: 'Arjun', style: 'classic', popularity: 'common' },
                        { name: 'Rahul', style: 'classic', popularity: 'common' },
                        { name: 'Siddharth', style: 'traditional', popularity: 'rare' },
                        { name: 'Karan', style: 'modern', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Anaya', style: 'modern', popularity: 'common' },
                        { name: 'Diya', style: 'modern', popularity: 'common' },
                        { name: 'Priya', style: 'classic', popularity: 'common' },
                        { name: 'Aisha', style: 'classic', popularity: 'common' },
                        { name: 'Meera', style: 'traditional', popularity: 'rare' },
                        { name: 'Kavya', style: 'modern', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Aadi', style: 'modern', popularity: 'rare' },
                        { name: 'Sam', style: 'modern', popularity: 'common' },
                        { name: 'Krishna', style: 'traditional', popularity: 'rare' }
                    ],
                    surnames: ['Sharma', 'Patel', 'Singh', 'Gupta', 'Kumar', 'Verma', 'Reddy', 'Nair']
                },
                Russia: {
                    nationality: 'Russian',
                    languages: ['Russian'],
                    localities: ['Moscow', 'Saint Petersburg', 'Kazan', 'Novosibirsk', 'Sochi', 'Samara'],
                    male: [
                        { name: 'Ivan', style: 'traditional', popularity: 'common' },
                        { name: 'Nikolai', style: 'classic', popularity: 'common' },
                        { name: 'Dmitri', style: 'classic', popularity: 'common' },
                        { name: 'Alexei', style: 'classic', popularity: 'common' },
                        { name: 'Mikhail', style: 'traditional', popularity: 'common' },
                        { name: 'Artem', style: 'modern', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Anna', style: 'classic', popularity: 'common' },
                        { name: 'Sofia', style: 'modern', popularity: 'common' },
                        { name: 'Elena', style: 'classic', popularity: 'common' },
                        { name: 'Irina', style: 'traditional', popularity: 'rare' },
                        { name: 'Ksenia', style: 'modern', popularity: 'rare' },
                        { name: 'Maria', style: 'classic', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Sasha', style: 'classic', popularity: 'common' },
                        { name: 'Zhenya', style: 'traditional', popularity: 'rare' },
                        { name: 'Nikita', style: 'traditional', popularity: 'common' }
                    ],
                    surnames: ['Ivanov', 'Smirnov', 'Kuznetsov', 'Popov', 'Sokolov', 'Lebedev', 'Morozov', 'Volkov']
                },
                Sweden: {
                    nationality: 'Swedish',
                    languages: ['Swedish'],
                    localities: ['Stockholm', 'Gothenburg', 'Malmo', 'Uppsala', 'Lund', 'Vasteras'],
                    male: [
                        { name: 'Liam', style: 'modern', popularity: 'common' },
                        { name: 'Noah', style: 'modern', popularity: 'common' },
                        { name: 'Erik', style: 'traditional', popularity: 'common' },
                        { name: 'Oscar', style: 'classic', popularity: 'common' },
                        { name: 'Axel', style: 'traditional', popularity: 'rare' },
                        { name: 'Elias', style: 'modern', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Alice', style: 'classic', popularity: 'common' },
                        { name: 'Maja', style: 'modern', popularity: 'common' },
                        { name: 'Elsa', style: 'traditional', popularity: 'rare' },
                        { name: 'Linn', style: 'classic', popularity: 'rare' },
                        { name: 'Freja', style: 'traditional', popularity: 'common' },
                        { name: 'Nora', style: 'modern', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Kim', style: 'classic', popularity: 'common' },
                        { name: 'Robin', style: 'modern', popularity: 'common' },
                        { name: 'Alex', style: 'modern', popularity: 'common' }
                    ],
                    surnames: ['Andersson', 'Johansson', 'Karlsson', 'Nilsson', 'Eriksson', 'Larsson', 'Olsson', 'Persson']
                },
                Netherlands: {
                    nationality: 'Dutch',
                    languages: ['Dutch', 'English'],
                    localities: ['Amsterdam', 'Rotterdam', 'Utrecht', 'Eindhoven', 'The Hague', 'Groningen'],
                    male: [
                        { name: 'Daan', style: 'modern', popularity: 'common' },
                        { name: 'Lucas', style: 'modern', popularity: 'common' },
                        { name: 'Milan', style: 'modern', popularity: 'common' },
                        { name: 'Pieter', style: 'traditional', popularity: 'rare' },
                        { name: 'Jasper', style: 'classic', popularity: 'common' },
                        { name: 'Bram', style: 'traditional', popularity: 'common' }
                    ],
                    female: [
                        { name: 'Emma', style: 'modern', popularity: 'common' },
                        { name: 'Julia', style: 'classic', popularity: 'common' },
                        { name: 'Sophie', style: 'modern', popularity: 'common' },
                        { name: 'Lotte', style: 'traditional', popularity: 'rare' },
                        { name: 'Mila', style: 'modern', popularity: 'common' },
                        { name: 'Eva', style: 'classic', popularity: 'common' }
                    ],
                    unisex: [
                        { name: 'Sam', style: 'modern', popularity: 'common' },
                        { name: 'Noa', style: 'modern', popularity: 'common' },
                        { name: 'Robin', style: 'classic', popularity: 'common' }
                    ],
                    surnames: ['De Jong', 'Jansen', 'De Vries', 'Van den Berg', 'Van Dijk', 'Bakker', 'Janssen', 'Visser']
                }
            };

            function createCountryPills() {
                const grid = document.getElementById('countriesGrid');
                grid.innerHTML = '';
                COUNTRY_KEYS.forEach((country) => {
                    const button = document.createElement('button');
                    button.type = 'button';
                    button.className = 'country-pill';
                    button.textContent = country;
                    button.setAttribute('data-country', country);
                    button.addEventListener('click', function () {
                        toggleCountry(country, button);
                    });
                    grid.appendChild(button);
                });
            }

            function toggleCountry(country, button) {
                if (selectedCountries.has(country)) {
                    selectedCountries.delete(country);
                    button.classList.remove('active');
                } else {
                    selectedCountries.add(country);
                    button.classList.add('active');
                }
                syncCountryCount();
            }

            function syncCountryCount() {
                const count = selectedCountries.size;
                document.getElementById('selectedCount').textContent = count + (count === 1 ? ' country selected' : ' countries selected');
                document.getElementById('validationMessage').classList.add('none');
                document.getElementById('validationMessage').textContent = '';
            }

            function applyPreset(type) {
                clearCountrySelection(true);
                PRESETS[type].forEach((country) => {
                    selectedCountries.add(country);
                    const button = document.querySelector('[data-country="' + country + '"]');
                    if (button) {
                        button.classList.add('active');
                    }
                });
                syncCountryCount();
            }

            function clearCountrySelection(skipSync) {
                selectedCountries.clear();
                document.querySelectorAll('.country-pill.active').forEach((el) => el.classList.remove('active'));
                if (!skipSync) {
                    syncCountryCount();
                }
            }

            function pickRandom(arr) {
                return arr[Math.floor(Math.random() * arr.length)];
            }

            function sanitizeQuantity() {
                const input = document.getElementById('quantity');
                let value = parseInt(input.value, 10);
                if (isNaN(value)) {
                    value = 20;
                }
                if (value < 1) {
                    value = 1;
                }
                if (value > 100) {
                    value = 100;
                }
                input.value = value;
                return value;
            }

            function getSelectedValue(name, fallback) {
                const selected = document.querySelector('input[name="' + name + '"]:checked');
                return selected ? selected.value : fallback;
            }

            function getSelectedExtras() {
                const extras = [];
                document.querySelectorAll('.extra-checkbox:checked').forEach((box) => extras.push(box.value));
                return extras;
            }

            function poolByGender(countryData, gender, includeUnisex, style) {
                let pool = [];

                if (gender === 'male') {
                    pool = pool.concat(countryData.male.map((i) => ({
                        name: i.name,
                        style: i.style,
                        popularity: i.popularity,
                        sex: 'male'
                    })));
                } else if (gender === 'female') {
                    pool = pool.concat(countryData.female.map((i) => ({
                        name: i.name,
                        style: i.style,
                        popularity: i.popularity,
                        sex: 'female'
                    })));
                } else {
                    pool = pool
                        .concat(countryData.male.map((i) => ({ name: i.name, style: i.style, popularity: i.popularity, sex: 'male' })))
                        .concat(countryData.female.map((i) => ({ name: i.name, style: i.style, popularity: i.popularity, sex: 'female' })));
                }

                if (includeUnisex) {
                    pool = pool.concat(countryData.unisex.map((i) => ({
                        name: i.name,
                        style: i.style,
                        popularity: i.popularity,
                        sex: 'unisex'
                    })));
                }

                if (style !== 'mixed') {
                    pool = pool.filter((item) => item.style === style);
                }

                if (!pool.length) {
                    pool = countryData.male
                        .concat(countryData.female)
                        .concat(includeUnisex ? countryData.unisex : [])
                        .map((i) => ({ name: i.name, style: i.style, popularity: i.popularity, sex: 'unisex' }));
                }

                return pool;
            }

            function surnameCountByStructure(structure) {
                if (structure === 'firstOnly') {
                    return 0;
                }
                if (structure === 'firstTwo') {
                    return 2;
                }
                if (structure === 'firstFour') {
                    return 4;
                }
                return 1;
            }

            function pickSurnames(surnames, count) {
                if (count === 0) {
                    return [];
                }
                const local = [];
                let attempts = 0;
                while (local.length < count && attempts < 40) {
                    attempts++;
                    const s = pickRandom(surnames);
                    if (!local.includes(s)) {
                        local.push(s);
                    }
                }
                while (local.length < count) {
                    local.push(pickRandom(surnames));
                }
                return local;
            }

            function distribute(total, countries) {
                const base = Math.floor(total / countries.length);
                const rem = total % countries.length;
                const map = {};
                countries.forEach((country, index) => {
                    map[country] = base + (index < rem ? 1 : 0);
                });
                return map;
            }

            function buildRecord(country, config) {
                const data = COUNTRY_BANK[country];
                const firstPool = poolByGender(data, config.gender, config.includeUnisex, config.style);
                const first = pickRandom(firstPool);
                const surnameCount = surnameCountByStructure(config.structure);
                const surnames = pickSurnames(data.surnames, surnameCount);

                const fullName = [first.name].concat(surnames).join(' ');

                const record = {
                    fullName: fullName,
                    firstName: first.name,
                    surnames: surnames,
                    country: country,
                    style: first.style,
                    sex: first.sex,
                    popularity: first.popularity
                };

                if (config.extras.includes('age')) {
                    record.age = Math.floor(Math.random() * 63) + 18;
                }
                if (config.extras.includes('sex')) {
                    record.outputSex = first.sex;
                }
                if (config.extras.includes('nationality')) {
                    record.nationality = data.nationality;
                }
                if (config.extras.includes('locality')) {
                    record.locality = pickRandom(data.localities);
                }
                if (config.extras.includes('language')) {
                    record.language = data.languages[0];
                }
                if (config.extras.includes('popularity')) {
                    record.outputPopularity = first.popularity;
                }

                return record;
            }

            function buildRecordViewText(record, extras) {
                const mainText = extras.includes('country')
                    ? record.fullName + ' (' + record.country + ')'
                    : record.fullName;
                const parts = [mainText];

                if (extras.includes('sex')) {
                    parts.push('sex: ' + record.outputSex);
                }
                if (extras.includes('age')) {
                    parts.push('age: ' + record.age);
                }
                if (extras.includes('nationality')) {
                    parts.push('nationality: ' + record.nationality);
                }
                if (extras.includes('locality')) {
                    parts.push('locality: ' + record.locality);
                }
                if (extras.includes('language')) {
                    parts.push('language: ' + record.language);
                }
                if (extras.includes('popularity')) {
                    parts.push('popularity: ' + record.outputPopularity);
                }

                return parts.join(' | ');
            }

            function buildMainDisplayText(record, extras) {
                return extras.includes('country')
                    ? record.fullName + ' (' + record.country + ')'
                    : record.fullName;
            }

            function buildExtrasOnlyText(record, extras) {
                const parts = [];

                if (extras.includes('sex')) {
                    parts.push('sex: ' + record.outputSex);
                }
                if (extras.includes('age')) {
                    parts.push('age: ' + record.age);
                }
                if (extras.includes('nationality')) {
                    parts.push('nationality: ' + record.nationality);
                }
                if (extras.includes('locality')) {
                    parts.push('locality: ' + record.locality);
                }
                if (extras.includes('language')) {
                    parts.push('language: ' + record.language);
                }
                if (extras.includes('popularity')) {
                    parts.push('popularity: ' + record.outputPopularity);
                }

                return parts.join(' | ');
            }

            function generateNames() {
                const quantity = sanitizeQuantity();
                const countries = Array.from(selectedCountries);
                const style = getSelectedValue('nameStyle', 'mixed');
                const structure = getSelectedValue('nameStructure', 'firstOne');
                const gender = getSelectedValue('gender', 'both');
                const includeUnisex = document.getElementById('includeUnisex').checked;
                const extras = getSelectedExtras();

                const validation = document.getElementById('validationMessage');
                if (!countries.length) {
                    validation.classList.remove('none');
                    validation.textContent = 'Please select at least one country.';
                    return;
                }

                const distribution = distribute(quantity, countries);
                const globalUsed = new Set();
                const result = [];
                const stats = {};

                countries.forEach((country) => {
                    const need = distribution[country];
                    stats[country] = 0;
                    const localUsed = new Set();
                    let attempts = 0;
                    const maxAttempts = Math.max(need * 60, 80);

                    while (stats[country] < need && attempts < maxAttempts) {
                        attempts++;
                        const record = buildRecord(country, {
                            style: style,
                            structure: structure,
                            gender: gender,
                            includeUnisex: includeUnisex,
                            extras: extras
                        });

                        if (!localUsed.has(record.fullName) && !globalUsed.has(record.fullName)) {
                            localUsed.add(record.fullName);
                            globalUsed.add(record.fullName);
                            result.push(record);
                            stats[country]++;
                        }
                    }

                    let fallback = 1;
                    while (stats[country] < need) {
                        const record = buildRecord(country, {
                            style: style,
                            structure: structure,
                            gender: gender,
                            includeUnisex: includeUnisex,
                            extras: extras
                        });

                        const forced = record.fullName + ' ' + fallback;
                        fallback++;
                        if (!localUsed.has(forced) && !globalUsed.has(forced)) {
                            record.fullName = forced;
                            localUsed.add(forced);
                            globalUsed.add(forced);
                            result.push(record);
                            stats[country]++;
                        }
                    }
                });

                generatedRecords = result;
                renderResult(result, stats, { style: style, structure: structure, gender: gender, includeUnisex: includeUnisex, extras: extras });
            }

            function renderResult(records, stats, context) {
                const empty = document.getElementById('emptyState');
                const summaryEl = document.getElementById('summary');
                const statsEl = document.getElementById('stats');
                const cardsEl = document.getElementById('resultsCards');
                const listEl = document.getElementById('resultsList');
                const toolsEl = document.getElementById('resultTools');

                empty.classList.add('none');
                cardsEl.innerHTML = '';
                listEl.innerHTML = '';

                const structTextMap = {
                    firstOnly: 'first name only',
                    firstOne: 'first + 1 surname',
                    firstTwo: 'first + 2 surnames',
                    firstFour: 'first + 4 surnames'
                };

                let summary = records.length + ' realistic names were generated using ' + structTextMap[context.structure] + ' structure';
                summary += ', style ' + context.style + ', gender ' + context.gender;
                if (context.includeUnisex) {
                    summary += ', with ambiguous names enabled';
                }
                summary += '.';

                summaryEl.classList.remove('none');
                summaryEl.textContent = summary;

                const statsLines = [];
                Object.keys(stats).forEach((country) => {
                    statsLines.push(country + ': ' + stats[country] + ' names');
                });
                statsEl.classList.remove('none');
                statsEl.innerHTML = '<strong>Breakdown:</strong><br>' + statsLines.join('<br>');

                if (records.length <= 20) {
                    listEl.classList.add('none');
                    records.forEach((record) => {
                        const mainText = buildMainDisplayText(record, context.extras);
                        const extrasText = buildExtrasOnlyText(record, context.extras);
                        const card = document.createElement('div');
                        card.className = 'name-card';
                        card.innerHTML = '<div class="main">' + mainText + '</div>';
                        if (extrasText !== '') {
                            card.innerHTML += '<div class="meta">' + extrasText + '</div>';
                        }
                        cardsEl.appendChild(card);
                    });
                } else {
                    listEl.classList.remove('none');
                    records.forEach((record) => {
                        const li = document.createElement('li');
                        li.textContent = buildRecordViewText(record, context.extras);
                        listEl.appendChild(li);
                    });
                }

                const plainLines = [summary, '', 'Breakdown:'].concat(statsLines).concat(['']);
                records.forEach((record, index) => {
                    plainLines.push((index + 1) + '. ' + buildRecordViewText(record, context.extras));
                });
                document.getElementById('plainOutput').textContent = plainLines.join('\n');

                toolsEl.classList.remove('none');
            }

            function clearResults() {
                generatedRecords = [];
                document.getElementById('summary').classList.add('none');
                document.getElementById('summary').textContent = '';
                document.getElementById('stats').classList.add('none');
                document.getElementById('stats').innerHTML = '';
                document.getElementById('resultsCards').innerHTML = '';
                document.getElementById('resultsList').innerHTML = '';
                document.getElementById('resultsList').classList.add('none');
                document.getElementById('plainOutput').textContent = '';
                document.getElementById('resultTools').classList.add('none');
                document.getElementById('emptyState').classList.remove('none');
            }

            function selectedExportFields() {
                const extras = getSelectedExtras();
                const base = ['fullName', 'style'];
                if (extras.includes('country')) {
                    base.push('country');
                }
                if (extras.includes('sex')) {
                    base.push('outputSex');
                }
                if (extras.includes('age')) {
                    base.push('age');
                }
                if (extras.includes('nationality')) {
                    base.push('nationality');
                }
                if (extras.includes('locality')) {
                    base.push('locality');
                }
                if (extras.includes('language')) {
                    base.push('language');
                }
                if (extras.includes('popularity')) {
                    base.push('outputPopularity');
                }
                return base;
            }

            function downloadText(filename, text, mimeType) {
                const blob = new Blob([text], { type: mimeType });
                const url = URL.createObjectURL(blob);
                const a = document.createElement('a');
                a.href = url;
                a.download = filename;
                document.body.appendChild(a);
                a.click();
                a.remove();
                URL.revokeObjectURL(url);
            }

            function downloadTxt() {
                if (!generatedRecords.length) {
                    return;
                }
                downloadText('random-names.txt', document.getElementById('plainOutput').textContent, 'text/plain;charset=utf-8');
            }

            function downloadJson() {
                if (!generatedRecords.length) {
                    return;
                }
                const fields = selectedExportFields();
                const output = generatedRecords.map((record) => {
                    const obj = {};
                    fields.forEach((field) => {
                        obj[field] = record[field] !== undefined ? record[field] : '';
                    });
                    return obj;
                });
                downloadText('random-names.json', JSON.stringify(output, null, 2), 'application/json;charset=utf-8');
            }

            function csvEscape(value) {
                const s = String(value === undefined ? '' : value);
                if (s.includes('"') || s.includes(',') || s.includes('\n')) {
                    return '"' + s.replace(/"/g, '""') + '"';
                }
                return s;
            }

            function downloadCsv() {
                if (!generatedRecords.length) {
                    return;
                }
                const fields = selectedExportFields();
                const rows = [fields.join(',')];
                generatedRecords.forEach((record) => {
                    rows.push(fields.map((f) => csvEscape(record[f])).join(','));
                });
                downloadText('random-names.csv', rows.join('\n'), 'text/csv;charset=utf-8');
            }

            function downloadHtmlList(type) {
                if (!generatedRecords.length) {
                    return;
                }
                const extras = getSelectedExtras();
                const tag = type === 'ol' ? 'ol' : 'ul';
                const lines = [];
                lines.push('<!DOCTYPE html>');
                lines.push('<html lang="en">');
                lines.push('<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Random Names List</title></head>');
                lines.push('<body>');
                lines.push('<h1>Random Names Export</h1>');
                lines.push('<' + tag + '>');
                generatedRecords.forEach((record) => {
                    lines.push('<li>' + buildRecordViewText(record, extras).replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</li>');
                });
                lines.push('</' + tag + '>');
                lines.push('</body>');
                lines.push('</html>');

                const filename = type === 'ol' ? 'random-names-ordered-list.html' : 'random-names-unordered-list.html';
                downloadText(filename, lines.join('\n'), 'text/html;charset=utf-8');
            }

            function init() {
                createCountryPills();
                syncCountryCount();
                applyPreset('western');
                sanitizeQuantity();
            }

            init();
        </script></p>
<p>The post <a href="https://imediacto.com/tools/name-generators/random-name-generator/">Random Name Generator</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/name-generators/random-name-generator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dragon Name Generator</title>
		<link>https://imediacto.com/tools/name-generators/dragon-name-generator/</link>
					<comments>https://imediacto.com/tools/name-generators/dragon-name-generator/#respond</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 09:30:58 +0000</pubDate>
				<category><![CDATA[Name Generators]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=407</guid>

					<description><![CDATA[<p>Dragon Name Generator is a free online tool to create dragon names by origin. Generate simple, epic, or mixed dragon names for RPG campaigns, novels, and fantasy worlds.</p>
<p>The post <a href="https://imediacto.com/tools/name-generators/dragon-name-generator/">Dragon Name Generator</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot dragon-name-generator">
            <div class="row mb-3">
                <div class="col-sm-12">
                    <h2>Generate Dragon Names by Origin</h2>
                    <p>
                        <strong>Dragon Name Generator</strong> is a free online tool focused only on
                        <strong>dragon names</strong>. Choose one or multiple origins such as
                        <strong>Greek, Japanese, Welsh, German, English, Celtic, Nordic, and Latin</strong>, then
                        generate simple, epic, or mixed names for RPG campaigns, fantasy novels, and worldbuilding.
                    </p>
                </div>
            </div>

            <div class="tool-panel">
                <h3 class="mb-1">1) Select origin(s)</h3>
                <p class="help-text">You can mix origins to generate broader dragon naming styles.</p>
                <div id="originsGrid" class="origins-grid"></div>
                <div id="selectedCount" class="counter">0 origins selected</div>

                <div class="inline-controls">
                    <div>
                        <h3 class="mb-1">2) Names per origin</h3>
                        <label for="namesPerOrigin">Choose a value between 1 and 100</label>
                        <input type="number" id="namesPerOrigin" min="1" max="100" value="10">
                        <p class="help-text">If you select 3 origins and choose 10, this tool generates 30 names.</p>
                    </div>

                    <div>
                        <h3 class="mb-1">3) Name complexity</h3>
                        <div class="radio-group">
                            <label for="complexitySimple"><input type="radio" id="complexitySimple" name="complexity" value="simple">Simple</label>
                            <label for="complexityEpic"><input type="radio" id="complexityEpic" name="complexity" value="epic">Epic</label>
                            <label for="complexityMixed"><input type="radio" id="complexityMixed" name="complexity" value="mixed" checked>Mixed</label>
                        </div>
                        <p class="help-text">Simple names are short (Nox, Krios). Epic names are longer and mythic.</p>
                    </div>
                </div>

                <div class="inline-controls">
                    <div>
                        <h3 class="mb-1">4) Gender style</h3>
                        <div class="radio-group">
                            <label for="genderMale"><input type="radio" id="genderMale" name="gender" value="male">Male</label>
                            <label for="genderFemale"><input type="radio" id="genderFemale" name="gender" value="female">Female</label>
                            <label for="genderBoth"><input type="radio" id="genderBoth" name="gender" value="both" checked>Both</label>
                        </div>
                    </div>

                    <div>
                        <h3 class="mb-1">5) Extra options</h3>
                        <div class="radio-group">
                            <label for="withEpithets"><input type="checkbox" id="withEpithets" checked>Include epithets</label>
                        </div>
                        <p class="help-text">Epithets add flavor like "the Ember Tyrant" or "of the Ancient Sky".</p>
                    </div>
                </div>

                <div class="actions">
                    <button class="btn btn-success" onclick="generateNames()"><i class="fa fa-magic"></i> Generate dragon names</button>
                    <button class="btn btn-light" onclick="clearResults()"><i class="fa fa-eraser"></i> Clear results</button>
                </div>

                <div id="summary" class="summary none"></div>
                <div id="stats" class="stats none"></div>

                <div id="resultTools" class="result-tools none">
                    <button class="soft" onclick="copyToClipboard('plainOutput', 'checkCopy')" title="Copy generated names">
                        <i class="fa fa-copy"></i> Copy output
                    </button>
                    <button class="soft" onclick="downloadOutput()" title="Download generated names as TXT">
                        <i class="fa fa-download"></i> Download TXT
                    </button>
                    <div id="checkCopy" class="check none"></div>
                </div>

                <div id="resultsCards" class="results-cards"></div>
                <ol id="resultsList" class="results-list none"></ol>
                <div id="plainOutput" class="none"></div>
            </div>

            <hr>

            <div class="more-notes entry-content">
                <h2>What is a Dragon Name Generator?</h2>
                <p>
                    A <strong>dragon name generator</strong> helps writers, players, and creators build original names
                    for drakes, wyverns, and ancient dragons in fantasy worlds. This online generator focuses on
                    dragon-only naming logic to deliver stronger thematic consistency.
                </p>

                <h2>Why origin-based dragon names matter</h2>
                <p>
                    Different cultures produce different sound patterns. Greek-inspired names often feel mythic and
                    grand, Japanese-inspired names may sound elegant and sharp, and Welsh or Celtic-inspired names can
                    feel ancient and mystical. Origin filters help shape the exact atmosphere you need.
                </p>

                <h2>Simple vs epic dragon names</h2>
                <p>
                    Use <strong>simple dragon names</strong> for fast identification and memorable enemies or mounts,
                    such as <strong>Nox</strong>, <strong>Krios</strong>, <strong>Zyphon</strong>, and
                    <strong>Arax</strong>. Use <strong>epic dragon names</strong> for bosses, lore guardians, and
                    legendary creatures, such as <strong>Vaergahl the Ember Tyrant</strong>.
                </p>

                <h2>Dragon name ideas by origin</h2>
                <h3>Greek dragon names</h3>
                <p>Often mythic, dramatic, and ancient-sounding, great for god-tier dragons and primordial beings.</p>
                <h3>Japanese dragon names</h3>
                <p>Elegant, sharp, and symbolic, useful for sky dragons, temple guardians, and mystical clans.</p>
                <h3>Welsh and Celtic dragon names</h3>
                <p>Mystical and old-world in tone, ideal for ancient bloodlines, runic lore, and sacred mountains.</p>
                <h3>Germanic and Nordic dragon names</h3>
                <p>Strong and heavy phonetics, suitable for war dragons, frost dragons, and iron-scale tyrants.</p>

                <h2>Frequently Asked Questions (FAQ)</h2>
                <h3>Can I use these dragon names in my game or book?</h3>
                <p>Yes. The generated names are provided as creative suggestions for fiction, campaigns, and prototypes.</p>

                <h3>Can I combine origins to create hybrid dragon names?</h3>
                <p>Yes. Select multiple origins and the tool generates names for each selected origin in one run.</p>

                <h3>Why do I see both short and long names in mixed mode?</h3>
                <p>Mixed mode combines simple and epic pipelines to provide a balanced list for common and legendary dragons.</p>
            </div>

            <div class="notes">
                <div class="image"></div>
                <div class="message">
                    <p>
                        Send me your feedback about this <strong>Dragon Name Generator</strong> and tell me if you need
                        more origins, naming rules, or special dragon classes, so I can improve this online tool.
                    </p>
                    <p>
                        You can learn how this generator works or contribute with improvements and bug fixes on Github:
                        <a href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/012-dragon-name-generator" target="_blank">Github >> Dragon Name Generator</a>.
                        Pull requests are welcome.
                    </p>
                </div>
            </div>
        </div>

        <script>
            const ORIGIN_NAMES = [
                'Greek', 'Japanese', 'Welsh', 'German', 'American / English', 'Celtic', 'Nordic / Scandinavian', 'Latin / Romance'
            ];

            const selectedOrigins = new Set();
            let generatedItems = [];

            // Curated short names inspired by the requested style.
            const SIMPLE_DRAGON_NAMES = [
                'Nox', 'Krios', 'Zyphon', 'Eireisone', 'Varos', 'Arax', 'Balon', 'Nhil', 'Bazyn', 'Draak',
                'Telarion', 'Virgil', 'Baloryx', 'Ryoko', 'Krin', 'Illuzan', 'Gyo', 'Dreq', 'Temedius', 'Circe',
                'Thrarion', 'Kolloth', 'Heren', 'Drayke', 'Drazyn', 'Vaergahl', 'Skariax', 'Raek', 'Nedryz',
                'Ktakl', 'Felscathor', 'Drakoth', 'Erebus', 'Khmaz', 'Oedyz', 'Hiryur', 'Ahnok', 'Vespak'
            ];

            const ORIGIN_BANK = {
                'Greek': {
                    simplePrefixes: ['dra', 'kri', 'nox', 'zy', 'phe', 'the', 'myr', 'var', 'ara'],
                    simpleSuffixes: ['os', 'on', 'ios', 'ax', 'es', 'or', 'eus', 'ion'],
                    male: ['drak', 'pyr', 'krath', 'nyx', 'aer', 'thal', 'vyr', 'mor'],
                    female: ['dria', 'pyria', 'nyra', 'aeria', 'thalya', 'moria', 'vyria', 'kyria'],
                    neutral: ['ion', 'eon', 'ae', 'or', 'yx', 'eth', 'os', 'yr'],
                    epithets: ['of Olympus', 'the Draconic', 'the Star-Forged', 'the Ember Tyrant', 'of Eternal Sky']
                },
                'Japanese': {
                    simplePrefixes: ['ryu', 'tatsu', 'kyo', 'hiro', 'aki', 'ren', 'kira', 'sora', 'ra'],
                    simpleSuffixes: ['ko', 'shi', 'maru', 'jin', 'ra', 'to', 'ki', 'ya'],
                    male: ['ryu', 'tatsu', 'kamin', 'shiro', 'kuro', 'akio', 'ren', 'haku'],
                    female: ['ryuna', 'tsuki', 'sakura', 'hina', 'kaori', 'aika', 'akira', 'yume'],
                    neutral: ['no', 'ka', 'ri', 'zen', 'maru', 'to', 'mi', 'ra'],
                    epithets: ['of Rising Sun', 'the Celestial Fang', 'of Scarlet Storm', 'the Cloud Serpent', 'the Sky Warden']
                },
                'Welsh': {
                    simplePrefixes: ['draig', 'gwyn', 'eir', 'taran', 'mor', 'cae', 'bryn', 'dun'],
                    simpleSuffixes: ['yn', 'or', 'eth', 'oc', 'wen', 'an', 'ach', 'ion'],
                    male: ['draig', 'gwyn', 'coch', 'taran', 'mawr', 'bryn', 'rhys', 'mor'],
                    female: ['draiga', 'gwena', 'eira', 'cerys', 'anwen', 'ffion', 'mora', 'rhi'],
                    neutral: ['dd', 'yn', 'or', 'eth', 'ach', 'wen', 'ion', 'air'],
                    epithets: ['of the Mountain Crown', 'the Ancient Scale', 'of the Red Peak', 'the Hollow Flame', 'of the Deep Vale']
                },
                'German': {
                    simplePrefixes: ['dra', 'feu', 'stur', 'nacht', 'eis', 'blit', 'krag', 'val'],
                    simpleSuffixes: ['gar', 'hart', 'wolf', 'en', 'ach', 'or', 'ing', 'ald'],
                    male: ['wurm', 'feuer', 'sturm', 'nacht', 'blitz', 'stein', 'krag', 'eisen'],
                    female: ['wurma', 'feura', 'sturma', 'nachtsa', 'blitza', 'steina', 'eisa', 'vala'],
                    neutral: ['fang', 'kraft', 'licht', 'wald', 'heim', 'horn', 'drang', 'zorn'],
                    epithets: ['the Iron Maw', 'of Black Mountain', 'the Thunder Scale', 'the Rift Keeper', 'of Ember Forge']
                },
                'American / English': {
                    simplePrefixes: ['dra', 'sky', 'ash', 'storm', 'night', 'ember', 'vex', 'raz'],
                    simpleSuffixes: ['on', 'er', 'ex', 'yn', 'or', 'us', 'ix', 'an'],
                    male: ['drake', 'storm', 'ash', 'shadow', 'iron', 'blaze', 'flint', 'crag'],
                    female: ['draya', 'storma', 'embera', 'ashara', 'lyra', 'nova', 'skya', 'fira'],
                    neutral: ['fang', 'wing', 'fire', 'bane', 'scale', 'claw', 'thorn', 'mist'],
                    epithets: ['the Dread Flame', 'of Ancient Skies', 'the Rift Hunter', 'the Ash Crown', 'of the Storm Coast']
                },
                'Celtic': {
                    simplePrefixes: ['bal', 'mor', 'finn', 'sid', 'cael', 'ru', 'ail', 'dra'],
                    simpleSuffixes: ['or', 'eth', 'an', 'wyn', 'ach', 'on', 'ys', 'air'],
                    male: ['balor', 'morr', 'cael', 'fionn', 'ruad', 'draoi', 'aed', 'sionn'],
                    female: ['balora', 'morra', 'caela', 'fiona', 'ruana', 'aine', 'siona', 'briana'],
                    neutral: ['sidhe', 'wyn', 'eth', 'an', 'or', 'air', 'stone', 'vale'],
                    epithets: ['of the Old Grove', 'the Rune-Bound', 'of Moonlit Hills', 'the Wild Ember', 'of Forgotten Circles']
                },
                'Nordic / Scandinavian': {
                    simplePrefixes: ['drau', 'skol', 'fro', 'ulv', 'val', 'thor', 'grim', 'yr'],
                    simpleSuffixes: ['nir', 'son', 'var', 'rik', 'gard', 'heim', 'thor', 'ulf'],
                    male: ['drak', 'frost', 'ulv', 'thorn', 'grim', 'valk', 'bjorn', 'skog'],
                    female: ['draka', 'frosta', 'ulva', 'vala', 'sigrid', 'freya', 'yrsa', 'astrid'],
                    neutral: ['nir', 'heim', 'gard', 'skarn', 'volt', 'rek', 'fang', 'hraf'],
                    epithets: ['of Frozen Spine', 'the Winter Tyrant', 'of Nine Storms', 'the Rune Maw', 'of the Iron Fjord']
                },
                'Latin / Romance': {
                    simplePrefixes: ['draco', 'igni', 'nox', 'sol', 'aure', 'voro', 'ser', 'lux'],
                    simpleSuffixes: ['us', 'is', 'or', 'a', 'ex', 'ius', 'um', 'on'],
                    male: ['draco', 'ignis', 'nox', 'sol', 'ferox', 'aureus', 'vorax', 'umbra'],
                    female: ['draca', 'ignia', 'noxia', 'solara', 'aurelia', 'voria', 'umbra', 'luna'],
                    neutral: ['rex', 'axis', 'or', 'is', 'um', 'ar', 'enix', 'vel'],
                    epithets: ['the Infernal', 'of Eternal Flame', 'the Golden Scale', 'of the Dusk Empire', 'the Sky Sovereign']
                }
            };

            function createOriginPills() {
                const grid = document.getElementById('originsGrid');
                grid.innerHTML = '';

                ORIGIN_NAMES.forEach((name) => {
                    const button = document.createElement('button');
                    button.type = 'button';
                    button.className = 'origin-pill';
                    button.textContent = name;
                    button.setAttribute('data-origin', name);

                    button.addEventListener('click', function () {
                        toggleOrigin(name, button);
                    });

                    grid.appendChild(button);
                });
            }

            function toggleOrigin(originName, button) {
                if (selectedOrigins.has(originName)) {
                    selectedOrigins.delete(originName);
                    button.classList.remove('active');
                } else {
                    selectedOrigins.add(originName);
                    button.classList.add('active');
                }
                updateSelectedCount();
            }

            function updateSelectedCount() {
                const count = selectedOrigins.size;
                document.getElementById('selectedCount').textContent = count + (count === 1 ? ' origin selected' : ' origins selected');
            }

            function sanitizeCount(value) {
                let count = parseInt(value, 10);
                if (isNaN(count)) {
                    count = 10;
                }
                if (count < 1) {
                    count = 1;
                }
                if (count > 100) {
                    count = 100;
                }
                return count;
            }

            function pickRandom(arr) {
                return arr[Math.floor(Math.random() * arr.length)];
            }

            function capitalizeWords(text) {
                return text
                    .split(' ')
                    .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
                    .join(' ');
            }

            function getGenderValue() {
                const selected = document.querySelector('input[name="gender"]:checked');
                return selected ? selected.value : 'both';
            }

            function getComplexityValue() {
                const selected = document.querySelector('input[name="complexity"]:checked');
                return selected ? selected.value : 'mixed';
            }

            function buildCorePool(origin, gender) {
                const data = ORIGIN_BANK[origin];
                if (gender === 'male') {
                    return data.male.concat(data.neutral);
                }
                if (gender === 'female') {
                    return data.female.concat(data.neutral);
                }
                return data.male.concat(data.female).concat(data.neutral);
            }

            function buildSimpleName(origin, gender) {
                const data = ORIGIN_BANK[origin];

                if (Math.random() < 0.3) {
                    return pickRandom(SIMPLE_DRAGON_NAMES);
                }

                let prefix = pickRandom(data.simplePrefixes);
                let suffix = pickRandom(data.simpleSuffixes);

                if (gender === 'female' && Math.random() < 0.35 && !suffix.endsWith('a')) {
                    suffix = suffix + 'a';
                }
                if (gender === 'male' && Math.random() < 0.2 && suffix.endsWith('a')) {
                    suffix = suffix.slice(0, -1);
                }

                const name = prefix + suffix;
                return capitalizeWords(name);
            }

            function buildEpicName(origin, gender, includeEpithets) {
                const pool = buildCorePool(origin, gender);
                const chunks = Math.random() < 0.5 ? 3 : 4;
                let name = '';

                for (let i = 0; i < chunks; i++) {
                    name += pickRandom(pool);
                }

                name = capitalizeWords(name);

                if (Math.random() < 0.2) {
                    name = name + '-' + capitalizeWords(pickRandom(pool));
                }

                if (includeEpithets && Math.random() < 0.55) {
                    name += ' ' + pickRandom(ORIGIN_BANK[origin].epithets);
                }

                return name;
            }

            function generateDragonName(origin, gender, complexity, includeEpithets) {
                if (complexity === 'simple') {
                    return { name: buildSimpleName(origin, gender), type: 'Simple' };
                }

                if (complexity === 'epic') {
                    return { name: buildEpicName(origin, gender, includeEpithets), type: 'Epic' };
                }

                if (Math.random() < 0.5) {
                    return { name: buildSimpleName(origin, gender), type: 'Simple' };
                }

                return { name: buildEpicName(origin, gender, includeEpithets), type: 'Epic' };
            }

            // Anti-repetition: unique names in the same generation with retries + deterministic fallback.
            function generateUniqueByOrigin(origin, gender, complexity, amount, includeEpithets, usedGlobal) {
                const localUsed = new Set();
                const items = [];
                const maxAttempts = amount * 35;
                let attempts = 0;

                while (items.length < amount && attempts < maxAttempts) {
                    attempts++;
                    const candidate = generateDragonName(origin, gender, complexity, includeEpithets);
                    if (!localUsed.has(candidate.name) && !usedGlobal.has(candidate.name)) {
                        localUsed.add(candidate.name);
                        usedGlobal.add(candidate.name);
                        items.push({ origin: origin, name: candidate.name, type: candidate.type });
                    }
                }

                let fallback = 1;
                while (items.length < amount) {
                    const candidate = generateDragonName(origin, gender, complexity, includeEpithets);
                    const forced = candidate.name + ' ' + fallback;
                    fallback++;
                    if (!localUsed.has(forced) && !usedGlobal.has(forced)) {
                        localUsed.add(forced);
                        usedGlobal.add(forced);
                        items.push({ origin: origin, name: forced, type: candidate.type });
                    }
                }

                return items;
            }

            function buildSummary(total, origins, complexity) {
                const modeText = complexity === 'mixed' ? 'mixed' : complexity;
                if (origins.length === 1) {
                    return total + ' ' + modeText + ' dragon names were generated for ' + origins[0] + ' origin.';
                }

                if (origins.length === 2) {
                    return total + ' ' + modeText + ' dragon names were generated for ' + origins[0] + ' and ' + origins[1] + ' origins.';
                }

                const last = origins[origins.length - 1];
                const firstPart = origins.slice(0, -1).join(', ');
                return total + ' ' + modeText + ' dragon names were generated for ' + firstPart + ' and ' + last + ' origins.';
            }

            function buildStats(statsMap) {
                const lines = ['<strong>Breakdown:</strong>'];
                Object.keys(statsMap).forEach((origin) => {
                    const s = statsMap[origin];
                    lines.push(origin + ': ' + s.total + ' names (' + s.simple + ' simple, ' + s.epic + ' epic)');
                });
                return lines.join('<br>');
            }

            function renderResults(items) {
                const cardsEl = document.getElementById('resultsCards');
                const listEl = document.getElementById('resultsList');

                cardsEl.innerHTML = '';
                listEl.innerHTML = '';

                if (items.length <= 20) {
                    listEl.classList.add('none');
                    items.forEach((item) => {
                        const card = document.createElement('div');
                        card.className = 'name-card';
                        card.innerHTML = '<span class="meta">' + item.origin + ' / ' + item.type + '</span>' + item.name;
                        cardsEl.appendChild(card);
                    });
                } else {
                    listEl.classList.remove('none');
                    items.forEach((item) => {
                        const li = document.createElement('li');
                        li.textContent = item.name + ' (' + item.origin + ' / ' + item.type + ')';
                        listEl.appendChild(li);
                    });
                }
            }

            function buildPlainOutput(items, summaryText, statsHtml) {
                const statsPlain = statsHtml.replace(/<strong>|<\/strong>/g, '').replace(/<br>/g, '\n');
                const lines = [summaryText, '', statsPlain, ''];
                items.forEach((item, index) => {
                    lines.push((index + 1) + '. ' + item.name + ' [' + item.origin + ' / ' + item.type + ']');
                });
                return lines.join('\n');
            }

            function generateNames() {
                const quantityInput = document.getElementById('namesPerOrigin');
                const amount = sanitizeCount(quantityInput.value);
                quantityInput.value = amount;

                const origins = Array.from(selectedOrigins);
                const complexity = getComplexityValue();
                const gender = getGenderValue();
                const includeEpithets = document.getElementById('withEpithets').checked;

                const summaryEl = document.getElementById('summary');
                const statsEl = document.getElementById('stats');
                const resultTools = document.getElementById('resultTools');

                if (origins.length === 0) {
                    summaryEl.classList.remove('none');
                    summaryEl.textContent = 'Select at least one origin before generating dragon names.';
                    statsEl.classList.add('none');
                    statsEl.innerHTML = '';
                    resultTools.classList.add('none');
                    document.getElementById('resultsCards').innerHTML = '';
                    document.getElementById('resultsList').innerHTML = '';
                    document.getElementById('resultsList').classList.add('none');
                    document.getElementById('plainOutput').textContent = '';
                    generatedItems = [];
                    return;
                }

                const usedGlobal = new Set();
                const results = [];
                const statsMap = {};

                origins.forEach((origin) => {
                    const chunk = generateUniqueByOrigin(origin, gender, complexity, amount, includeEpithets, usedGlobal);
                    statsMap[origin] = { total: chunk.length, simple: 0, epic: 0 };

                    chunk.forEach((item) => {
                        if (item.type === 'Simple') {
                            statsMap[origin].simple++;
                        } else {
                            statsMap[origin].epic++;
                        }
                        results.push(item);
                    });
                });

                generatedItems = results;
                const summaryText = buildSummary(results.length, origins, complexity);
                const statsHtml = buildStats(statsMap);

                summaryEl.classList.remove('none');
                summaryEl.textContent = summaryText;
                statsEl.classList.remove('none');
                statsEl.innerHTML = statsHtml;

                renderResults(results);

                document.getElementById('plainOutput').textContent = buildPlainOutput(results, summaryText, statsHtml);
                resultTools.classList.remove('none');
            }

            function downloadOutput() {
                if (!generatedItems.length) {
                    return;
                }
                const text = document.getElementById('plainOutput').textContent;
                download('dragon-names.txt', text);
            }

            function clearResults() {
                generatedItems = [];
                document.getElementById('summary').classList.add('none');
                document.getElementById('summary').textContent = '';
                document.getElementById('stats').classList.add('none');
                document.getElementById('stats').innerHTML = '';
                document.getElementById('resultTools').classList.add('none');
                document.getElementById('resultsCards').innerHTML = '';
                document.getElementById('resultsList').innerHTML = '';
                document.getElementById('resultsList').classList.add('none');
                document.getElementById('plainOutput').textContent = '';
            }

            function presetInitialGeneration() {
                const defaultOrigin = 'Greek';
                selectedOrigins.add(defaultOrigin);
                const button = document.querySelector('[data-origin="' + defaultOrigin + '"]');
                if (button) {
                    button.classList.add('active');
                }
                updateSelectedCount();
                generateNames();
            }

            createOriginPills();
            updateSelectedCount();
            presetInitialGeneration();
        </script></p>
<p>The post <a href="https://imediacto.com/tools/name-generators/dragon-name-generator/">Dragon Name Generator</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/name-generators/dragon-name-generator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fantasy Name Generator</title>
		<link>https://imediacto.com/tools/name-generators/fantasy-name-generator/</link>
					<comments>https://imediacto.com/tools/name-generators/fantasy-name-generator/#respond</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 01:41:02 +0000</pubDate>
				<category><![CDATA[Name Generators]]></category>
		<category><![CDATA[fantasy name generator]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=400</guid>

					<description><![CDATA[<p>Fantasy Name Generator is a free online tool to create random fantasy character and world names by category. Generate names for dragons, elves, kingdoms, pirates and more.</p>
<p>The post <a href="https://imediacto.com/tools/name-generators/fantasy-name-generator/">Fantasy Name Generator</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot fantasy-name-generator">
            <div class="row mb-3">
                <div class="col-sm-12">
                    <h2>Generate Fantasy Names by Category</h2>
                    <p>
                        <strong>Fantasy Name Generator</strong> is a free online tool to create random names for fantasy
                        characters, creatures and places. Choose one or multiple categories such as
                        <strong>Dragons, Elves, Goblins, Kingdoms and Cities</strong>, pick the amount of names, choose
                        the gender and generate your list instantly.
                    </p>
                </div>
            </div>

            <div class="tool-panel">
                <h3 class="mb-1">1) Select one or more categories</h3>
                <p class="help-text">You can combine categories to generate mixed fantasy naming sets.</p>
                <div id="categoriesGrid" class="categories-grid"></div>
                <div id="selectedCount" class="counter">0 categories selected</div>

                <div class="inline-controls">
                    <div>
                        <h3 class="mb-1">2) Names per category</h3>
                        <label for="namesPerCategory">Choose a value between 1 and 100</label>
                        <input type="number" id="namesPerCategory" min="1" max="100" value="10">
                        <p class="help-text">If you select 3 categories and choose 10, the tool will generate 30 names.</p>
                    </div>

                    <div>
                        <h3 class="mb-1">3) Gender</h3>
                        <div class="radio-group">
                            <label for="genderMale"><input type="radio" id="genderMale" name="gender" value="male">Male</label>
                            <label for="genderFemale"><input type="radio" id="genderFemale" name="gender" value="female">Female</label>
                            <label for="genderBoth"><input type="radio" id="genderBoth" name="gender" value="both" checked>Both</label>
                        </div>
                        <p class="help-text">Both uses male and female styles and still avoids duplicate names in the same generation.</p>
                    </div>
                </div>

                <div class="actions">
                    <button class="btn btn-success" onclick="generateNames()"><i class="fa fa-magic"></i> Generate fantasy names</button>
                    <button class="btn btn-light" onclick="clearResults()"><i class="fa fa-eraser"></i> Clear results</button>
                </div>

                <div id="summary" class="summary none"></div>

                <div id="resultTools" class="result-tools none">
                    <button class="soft" onclick="copyToClipboard('plainOutput', 'checkCopy')" title="Copy generated names">
                        <i class="fa fa-copy"></i> Copy output
                    </button>
                    <button class="soft" onclick="downloadOutput()" title="Download generated names as TXT">
                        <i class="fa fa-download"></i> Download TXT
                    </button>
                    <div id="checkCopy" class="check none"></div>
                </div>

                <div id="resultsCards" class="results-cards"></div>
                <ol id="resultsList" class="results-list none"></ol>
                <div id="plainOutput" class="none"></div>
            </div>

            <hr>

            <div class="more-notes entry-content">
                <h2>What is a Fantasy Name Generator?</h2>
                <p>
                    A <strong>fantasy name generator</strong> is a writing and game design tool used to create names for
                    heroes, villains, magical creatures and fictional places. Authors, RPG players and worldbuilders
                    often need many names quickly, and random generation helps keep the creative flow moving.
                </p>
                <p>
                    This tool supports several naming contexts, from <strong>dragon names</strong> and
                    <strong>elf names</strong> to <strong>kingdom names</strong> and <strong>city names</strong>. You can
                    combine categories to build richer worlds for stories, tabletop RPG campaigns and fantasy games.
                </p>

                <h3>Why use category-based fantasy names?</h3>
                <ul>
                    <li><strong>Consistency:</strong> each category uses a distinct naming style.</li>
                    <li><strong>Speed:</strong> generate many names in one click.</li>
                    <li><strong>Flexibility:</strong> use single or multi-category output.</li>
                    <li><strong>Anti-repetition:</strong> the generator avoids duplicate names in the same run.</li>
                </ul>

                <h3>Use Cases</h3>
                <p>
                    Use this free fantasy naming tool to create names for novels, game prototypes, DnD campaigns,
                    character sheets, factions, regions, ports, pirate crews and mythical races.
                </p>

                <h2>The origins behind fantasy names</h2>
                <p>
                    Fantasy names are often inspired by ancient languages, mythological traditions, medieval history,
                    and folklore from different cultures. Many iconic names in fantasy literature combine soft vowels,
                    hard consonants, and symbolic meanings to communicate power, mystery, lineage, or magic.
                </p>
                <p>
                    In high fantasy settings, elves usually receive melodic and elegant names, dwarves use sturdy and
                    clan-oriented naming structures, and orcs tend to have short, impactful, and guttural sounds.
                    Understanding these naming roots helps writers and players create characters that feel more
                    believable inside a fantasy world.
                </p>

                <h2>How does the Fantasy Name Generator work?</h2>
                <p>
                    Simply select your preferred category (such as Elves, Dwarves, Wizards, Orcs, Dragons, or
                    Kingdoms), choose the gender style, define the number of names, and click "Generate fantasy
                    names". The tool combines fantasy-inspired prefixes, syllables, and suffixes to build authentic
                    names for characters, races, and locations.
                </p>
                <p>
                    You can also select multiple categories at once to create mixed name sets for RPG campaigns,
                    fictional civilizations, guilds, or worldbuilding projects. The anti-repetition logic helps reduce
                    duplicate outputs during each generation cycle.
                </p>

                <h2>Fantasy name ideas by race and class</h2>
                <h3>Names for Elves (Elf Names)</h3>
                <p>
                    Elven names are usually melodic, with flowing vowels and elegant rhythm. Examples:
                    <strong>Elandorr</strong>, <strong>Aerith</strong>, <strong>Laerion</strong>,
                    <strong>Myrielle</strong>.
                </p>

                <h3>Names for Dwarves (Dwarf Names)</h3>
                <p>
                    Dwarf names are robust and grounded, often linked to clans, stone, metal, and craftsmanship.
                    Examples: <strong>Thorgar Ironfoot</strong>, <strong>Bramdur</strong>,
                    <strong>Kazgrim Stonebeard</strong>, <strong>Durik Emberhammer</strong>.
                </p>

                <h3>Names for Orcs and Warriors</h3>
                <p>
                    Orc and warrior names favor aggressive phonetics and short, memorable sounds. Examples:
                    <strong>Grommash</strong>, <strong>Garruk</strong>, <strong>Drakzul</strong>,
                    <strong>Krothar</strong>.
                </p>

                <h2>Frequently Asked Questions (FAQ)</h2>

                <h3>Can I use these names in my book or commercial game?</h3>
                <p>
                    Yes. The generated names are free to use as creative suggestions for fiction, RPG characters,
                    campaigns, and game prototypes.
                </p>

                <h3>How do I choose a good name for an RPG character?</h3>
                <p>
                    A strong RPG name should reflect the character's race, role, social background, and personality.
                    Noble characters often benefit from longer and cleaner names, while wild creatures and frontline
                    warriors usually fit short and impactful names.
                </p>

                <h3>Do these generated names fit games like World of Warcraft or D&D?</h3>
                <p>
                    Absolutely. The naming styles are designed for classic fantasy atmospheres, making them suitable
                    for Dungeons & Dragons, Pathfinder, Warcraft-inspired settings, and other tabletop or digital RPG
                    experiences.
                </p>
            </div>

            <div class="notes">
                <div class="image"></div>
                <div class="message">
                    <p>
                        Send me your feedback about this <strong>Fantasy Name Generator</strong> and let me know if you
                        need a specific naming style, then I can improve this online tool with new rules and categories.
                        Also, tell me if you need another <strong>RPG tool</strong>, <strong>writing tool</strong> or
                        <strong>coding tool set</strong>.
                    </p>
                    <p>
                        You can learn how this tool works or contribute with improvements and bug fixes on Github:
                        <a href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/011-fantasy-name-generator" target="_blank">Github >> Fantasy Name Generator</a>.
                        Pull requests are welcome.
                    </p>
                </div>
            </div>
        </div>

        <script>
            const CATEGORY_NAMES = [
                'Human', 'Angel', 'Aliens', 'Centaurs', 'Demons', 'Dragons', 'Elves', 'Fairies', 'Giants', 'Gnomes',
                'Goblins', 'Imps', 'Merfolk', 'Ogres', 'Orks', 'Pixies', 'Sea monsters', 'Trolls', 'Unicorns',
                'Vampires', 'Werewolves', 'Witches / Wizards', 'Yeties', 'Zombies', 'Pirate', 'Ship', 'Kingdom',
                'Country', 'City', 'Town'
            ];

            const selectedCategories = new Set();
            let generatedItems = [];

            const SYLLABLE_BANK = {
                Human: {
                    male: ['al', 'ric', 'tor', 'dan', 'mar', 'fen', 'lor', 'vin', 'gar', 'hal'],
                    female: ['ara', 'lia', 'mira', 'sel', 'ena', 'dora', 'yra', 'nora', 'fina', 'lara'],
                    neutral: ['brin', 'cael', 'wyn', 'tal', 'ren', 'sor']
                },
                Angel: {
                    male: ['el', 'zar', 'iel', 'or', 'ram', 'hael', 'thon', 'mal'],
                    female: ['ael', 'riel', 'ana', 'lya', 'sera', 'miel', 'ora', 'ziel'],
                    neutral: ['sol', 'lum', 'eth', 'kir', 'aer', 'vyr']
                },
                Aliens: {
                    male: ['xar', 'zor', 'qen', 'vak', 'thr', 'gon', 'kri', 'ul'],
                    female: ['xia', 'ziri', 'qira', 'vexa', 'thra', 'goni', 'krya', 'ula'],
                    neutral: ['xe', 'qo', 'vr', 'zi', 'ka', 'nu']
                },
                Centaurs: {
                    male: ['bron', 'kar', 'thal', 'dor', 'magn', 'per', 'rhun', 'vorn'],
                    female: ['bria', 'kara', 'thala', 'doria', 'magna', 'pera', 'rhuna', 'vorna'],
                    neutral: ['hoof', 'glen', 'step', 'mane', 'oak', 'ridge']
                },
                Demons: {
                    male: ['az', 'krag', 'mor', 'bal', 'rax', 'dru', 'vor', 'zhul'],
                    female: ['aza', 'kira', 'mora', 'bala', 'raxa', 'dria', 'vora', 'zhula'],
                    neutral: ['ash', 'hex', 'void', 'grim', 'bane', 'scar']
                },
                Dragons: {
                    male: ['dra', 'gor', 'thar', 'vyr', 'rax', 'kran', 'zor', 'fyre'],
                    female: ['dria', 'gora', 'thara', 'vyra', 'raxa', 'krana', 'zora', 'fyra'],
                    neutral: ['scale', 'flame', 'claw', 'ember', 'wing', 'smoke']
                },
                Elves: {
                    male: ['ae', 'lin', 'thal', 'eris', 'fae', 'nor', 'sil', 'elor'],
                    female: ['aela', 'lina', 'thalia', 'eris', 'faena', 'noria', 'sila', 'elora'],
                    neutral: ['moon', 'leaf', 'star', 'bloom', 'mist', 'song']
                },
                Fairies: {
                    male: ['pip', 'nib', 'til', 'fae', 'wisp', 'lark', 'flyn', 'spark'],
                    female: ['pippa', 'niba', 'tila', 'faeya', 'wispa', 'larka', 'flyna', 'sparka'],
                    neutral: ['dew', 'petal', 'glow', 'dust', 'flutter', 'twirl']
                },
                Giants: {
                    male: ['grom', 'thok', 'brak', 'ulv', 'morn', 'darg', 'krol', 'varg'],
                    female: ['groma', 'thoka', 'braka', 'ulva', 'morna', 'darga', 'krola', 'varga'],
                    neutral: ['stone', 'peak', 'hammer', 'ridge', 'boulder', 'crag']
                },
                Gnomes: {
                    male: ['nim', 'fizz', 'brim', 'cog', 'tink', 'wob', 'pim', 'gub'],
                    female: ['nima', 'fizza', 'brima', 'coga', 'tinka', 'woba', 'pima', 'guba'],
                    neutral: ['gear', 'spark', 'clock', 'whistle', 'bolt', 'gadget']
                },
                Goblins: {
                    male: ['grib', 'snik', 'krub', 'mog', 'zib', 'rag', 'trog', 'blik'],
                    female: ['griba', 'snika', 'kruba', 'moga', 'ziba', 'raga', 'troga', 'blika'],
                    neutral: ['tooth', 'mud', 'scrap', 'fang', 'sneak', 'grin']
                },
                Imps: {
                    male: ['zip', 'nex', 'vib', 'tik', 'mox', 'drip', 'rix', 'fum'],
                    female: ['zipa', 'nexa', 'viba', 'tika', 'moxa', 'dripa', 'rixa', 'fuma'],
                    neutral: ['spark', 'snicker', 'smudge', 'flick', 'hop', 'blink']
                },
                Merfolk: {
                    male: ['mar', 'thal', 'orin', 'kai', 'nere', 'drel', 'vash', 'lyr'],
                    female: ['mara', 'thalia', 'orina', 'kaia', 'nera', 'drela', 'vasha', 'lyra'],
                    neutral: ['tide', 'reef', 'wave', 'pearl', 'foam', 'shell']
                },
                Ogres: {
                    male: ['ug', 'brut', 'mog', 'kran', 'thud', 'gar', 'snor', 'drum'],
                    female: ['uga', 'bruta', 'moga', 'krana', 'thuda', 'gara', 'snora', 'druma'],
                    neutral: ['swamp', 'club', 'bog', 'stomp', 'mire', 'grub']
                },
                Orks: {
                    male: ['gash', 'krug', 'thrak', 'ug', 'morg', 'brak', 'zug', 'drok'],
                    female: ['gasha', 'kruga', 'thraka', 'uga', 'morga', 'braka', 'zuga', 'droka'],
                    neutral: ['war', 'iron', 'axe', 'rage', 'scar', 'blood']
                },
                Pixies: {
                    male: ['pin', 'twix', 'bree', 'nib', 'lumo', 'spri', 'tiv', 'wim'],
                    female: ['pina', 'twixa', 'bria', 'niba', 'lumia', 'spria', 'tiva', 'wima'],
                    neutral: ['dust', 'petal', 'beam', 'flutter', 'wink', 'dew']
                },
                'Sea monsters': {
                    male: ['krak', 'thol', 'dred', 'marn', 'vash', 'gor', 'hyd', 'nar'],
                    female: ['kraka', 'thola', 'dreda', 'marna', 'vasha', 'gora', 'hydra', 'nara'],
                    neutral: ['depth', 'abyss', 'tide', 'maw', 'storm', 'brine']
                },
                Trolls: {
                    male: ['grum', 'thog', 'bruk', 'snarl', 'krog', 'dunk', 'mug', 'vrak'],
                    female: ['gruma', 'thoga', 'bruka', 'snarla', 'kroga', 'dunka', 'muga', 'vraka'],
                    neutral: ['moss', 'bridge', 'rock', 'cave', 'stump', 'grit']
                },
                Unicorns: {
                    male: ['ael', 'prys', 'lune', 'ser', 'myr', 'faun', 'ior', 'glis'],
                    female: ['aela', 'prysa', 'lunea', 'sera', 'myra', 'fauna', 'iora', 'glisa'],
                    neutral: ['moon', 'glimmer', 'starlight', 'dawn', 'crystal', 'rainbow']
                },
                Vampires: {
                    male: ['vlad', 'drak', 'noct', 'serg', 'mor', 'raz', 'vel', 'nik'],
                    female: ['vlada', 'draka', 'nocta', 'serga', 'mora', 'raza', 'vela', 'nika'],
                    neutral: ['night', 'blood', 'veil', 'shadow', 'thirst', 'crypt']
                },
                Werewolves: {
                    male: ['wulf', 'gar', 'lycan', 'thorn', 'draug', 'fen', 'rake', 'grim'],
                    female: ['wulfa', 'gara', 'lycana', 'thorna', 'drauga', 'fena', 'raka', 'grima'],
                    neutral: ['moon', 'fang', 'howl', 'pelt', 'claw', 'hunt']
                },
                'Witches / Wizards': {
                    male: ['mer', 'alz', 'vor', 'quill', 'zan', 'ther', 'rune', 'cal'],
                    female: ['mera', 'alza', 'vora', 'quilla', 'zana', 'thera', 'runa', 'cala'],
                    neutral: ['spell', 'arcane', 'sigil', 'potion', 'glyph', 'hex']
                },
                Yeties: {
                    male: ['yor', 'thrum', 'glak', 'fros', 'bor', 'krim', 'snor', 'vak'],
                    female: ['yora', 'thruma', 'glaka', 'frosa', 'bora', 'krima', 'snora', 'vaka'],
                    neutral: ['frost', 'ice', 'snow', 'blizzard', 'peak', 'glacier']
                },
                Zombies: {
                    male: ['rot', 'grim', 'mold', 'zed', 'rag', 'nox', 'dec', 'ghoul'],
                    female: ['rota', 'grima', 'molda', 'zeda', 'raga', 'noxa', 'deca', 'ghoula'],
                    neutral: ['grave', 'crypt', 'bone', 'ash', 'dust', 'hunger']
                },
                Pirate: {
                    male: ['rack', 'flint', 'scar', 'brine', 'jack', 'marl', 'drift', 'hook'],
                    female: ['racka', 'flinta', 'scara', 'brina', 'jacka', 'marla', 'drifta', 'hooka'],
                    neutral: ['black', 'tide', 'cutlass', 'reef', 'anchor', 'storm']
                },
                Ship: {
                    male: ['iron', 'storm', 'salt', 'drift', 'black', 'wind', 'wave', 'reef'],
                    female: ['ivory', 'silver', 'scarlet', 'golden', 'misty', 'moon', 'azure', 'brave'],
                    neutral: ['voyager', 'spear', 'banner', 'gale', 'serpent', 'mariner']
                },
                Kingdom: {
                    male: ['val', 'drak', 'eld', 'thor', 'nor', 'grim', 'cald', 'mor'],
                    female: ['vala', 'draka', 'elda', 'thora', 'nora', 'grima', 'calda', 'mora'],
                    neutral: ['realm', 'crown', 'throne', 'dominion', 'keep', 'spire']
                },
                Country: {
                    male: ['ard', 'bel', 'cor', 'dal', 'est', 'fal', 'gor', 'hal'],
                    female: ['arda', 'bela', 'cora', 'dala', 'esta', 'fala', 'gora', 'hala'],
                    neutral: ['lands', 'union', 'province', 'domain', 'expanse', 'nation']
                },
                City: {
                    male: ['ash', 'briar', 'crest', 'dawn', 'ember', 'frost', 'glen', 'harbor'],
                    female: ['astra', 'bria', 'cela', 'doria', 'elya', 'fira', 'gala', 'helia'],
                    neutral: ['port', 'gate', 'hold', 'haven', 'ford', 'market']
                },
                Town: {
                    male: ['oak', 'river', 'hill', 'wind', 'stone', 'mead', 'pine', 'fox'],
                    female: ['willow', 'rose', 'ivy', 'daisy', 'hazel', 'lily', 'violet', 'maple'],
                    neutral: ['crossing', 'village', 'brook', 'field', 'mill', 'hollow']
                }
            };

            const CATEGORY_TITLES = {
                Human: ['the Swift', 'the Wanderer', 'of Northwatch', 'the Bold', 'the Ironhand'],
                Angel: ['of Dawn', 'the Radiant', 'the Merciful', 'of Eternal Light', 'the Seraphic'],
                Aliens: ['of Sector IX', 'from the Outer Rim', 'the Starborn', 'Prime', 'the Unknown'],
                Centaurs: ['Hoof of Storms', 'the Meadow Guard', 'of Oak Plains', 'the Longstride', 'the Archer'],
                Demons: ['the Corruptor', 'of the Ash Pit', 'the Cruel', 'the Unbound', 'the Tormentor'],
                Dragons: ['Flameborn', 'the Ancient', 'of Ember Peak', 'Sky Tyrant', 'the Molten'],
                Elves: ['of Silvergrove', 'Moon Whisper', 'Starweaver', 'the Graceful', 'Leafcaller'],
                Fairies: ['of Dewlight', 'the Tiny Bright', 'Petal Dancer', 'of Spring Bloom', 'the Luminous'],
                Giants: ['Stonebreaker', 'of High Crag', 'the Mountain', 'Hammerheart', 'the Colossal'],
                Gnomes: ['Gearspinner', 'of Copperhill', 'the Clever', 'Clockmind', 'Sparkfiddle'],
                Goblins: ['Mud Sneak', 'the Cunning', 'of Scrap Pit', 'Toothgrin', 'the Quick'],
                Imps: ['the Trickster', 'of Cinder Alley', 'Snap Tail', 'the Sneaky', 'the Flicker'],
                Merfolk: ['of Coral Bay', 'Wave Singer', 'the Deepborn', 'Pearl Keeper', 'Tide Caller'],
                Ogres: ['the Club', 'of Mire Bog', 'the Heavy', 'Bog Stomper', 'the Brutal'],
                Orks: ['Skull Cleaver', 'the Warlord', 'of Iron Camp', 'the Ruthless', 'Rageborn'],
                Pixies: ['Duststep', 'the Glitter', 'of Moonpetal', 'Twinkle Wing', 'the Tiny'],
                'Sea monsters': ['from the Abyss', 'the Drowned', 'of Dark Tides', 'the Maw', 'Brine Terror'],
                Trolls: ['Bridge Keeper', 'of Moss Cave', 'the Gruff', 'Stump Crusher', 'the Rugged'],
                Unicorns: ['of Crystal Meadow', 'the Gentle', 'Starlit Hoof', 'the Pure', 'Rainbow Crest'],
                Vampires: ['of Crimson Hall', 'the Eternal', 'Night Whisper', 'the Pale', 'Blood Regent'],
                Werewolves: ['Moon Hunter', 'the Feral', 'of Winter Forest', 'Claw Runner', 'the Howl'],
                'Witches / Wizards': ['of Arcane Tower', 'Spellweaver', 'Rune Keeper', 'the Wise', 'of Mystic Vale'],
                Yeties: ['of Frozen Spine', 'Snow Roarer', 'the White Fang', 'Blizzard Walker', 'Ice Climber'],
                Zombies: ['of the Grave', 'the Restless', 'Crypt Walker', 'the Hollow', 'Ash Stalker'],
                Pirate: ['of Black Tide', 'the Raider', 'Cutlass Hand', 'Storm Sailor', 'the Buccaneer'],
                Ship: ['of the North Sea', 'the Unbroken', 'of the Crimson Ocean', 'the Swift Sail', 'of Storm Water'],
                Kingdom: ['the Golden Realm', 'of the High Crown', 'the Old Throne', 'the Eternal Seat', 'of Seven Keeps'],
                Country: ['the Great Union', 'of Endless Plains', 'the Free Lands', 'the High Fields', 'of Wide Rivers'],
                City: ['the Old Gate', 'of Merchant Square', 'the Harbor Light', 'of Seven Towers', 'the Walled'],
                Town: ['the Riverside', 'of Windy Hollow', 'the Little Market', 'of Green Fields', 'the Quiet']
            };

            function createCategoryPills() {
                const grid = document.getElementById('categoriesGrid');
                grid.innerHTML = '';

                CATEGORY_NAMES.forEach((name) => {
                    const button = document.createElement('button');
                    button.type = 'button';
                    button.className = 'category-pill';
                    button.textContent = name;
                    button.setAttribute('data-category', name);

                    button.addEventListener('click', function () {
                        toggleCategory(name, button);
                    });

                    grid.appendChild(button);
                });
            }

            function toggleCategory(categoryName, button) {
                if (selectedCategories.has(categoryName)) {
                    selectedCategories.delete(categoryName);
                    button.classList.remove('active');
                } else {
                    selectedCategories.add(categoryName);
                    button.classList.add('active');
                }
                updateSelectedCount();
            }

            function updateSelectedCount() {
                const count = selectedCategories.size;
                document.getElementById('selectedCount').textContent = count + (count === 1 ? ' category selected' : ' categories selected');
            }

            function getGenderValue() {
                const selected = document.querySelector('input[name="gender"]:checked');
                return selected ? selected.value : 'both';
            }

            function sanitizeCount(value) {
                let count = parseInt(value, 10);
                if (isNaN(count)) {
                    count = 10;
                }
                if (count < 1) {
                    count = 1;
                }
                if (count > 100) {
                    count = 100;
                }
                return count;
            }

            function pickRandom(arr) {
                return arr[Math.floor(Math.random() * arr.length)];
            }

            function capitalizeWords(text) {
                return text
                    .split(' ')
                    .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
                    .join(' ');
            }

            function buildSyllables(category, gender) {
                const source = SYLLABLE_BANK[category];
                const neutralPool = source.neutral.slice();

                if (gender === 'male') {
                    return source.male.concat(neutralPool);
                }
                if (gender === 'female') {
                    return source.female.concat(neutralPool);
                }
                return source.male.concat(source.female).concat(neutralPool);
            }

            function createBaseName(category, gender) {
                const pool = buildSyllables(category, gender);
                const partsCount = Math.random() < 0.5 ? 2 : 3;
                let name = '';

                for (let i = 0; i < partsCount; i++) {
                    name += pickRandom(pool);
                }

                name = capitalizeWords(name);
                if (Math.random() < 0.4) {
                    name += ' ' + pickRandom(CATEGORY_TITLES[category]);
                }
                return name;
            }

            // Anti-repetition: keep names unique in the same generation using retries + deterministic suffix fallback.
            function generateUniqueNames(category, gender, amount, usedGlobalNames) {
                const categoryNames = [];
                const localUsed = new Set();
                const maxAttempts = amount * 30;
                let attempts = 0;

                while (categoryNames.length < amount && attempts < maxAttempts) {
                    attempts++;
                    const candidate = createBaseName(category, gender);
                    if (!localUsed.has(candidate) && !usedGlobalNames.has(candidate)) {
                        localUsed.add(candidate);
                        usedGlobalNames.add(candidate);
                        categoryNames.push(candidate);
                    }
                }

                let suffixCounter = 1;
                while (categoryNames.length < amount) {
                    const candidate = createBaseName(category, gender) + ' ' + suffixCounter;
                    suffixCounter++;
                    if (!localUsed.has(candidate) && !usedGlobalNames.has(candidate)) {
                        localUsed.add(candidate);
                        usedGlobalNames.add(candidate);
                        categoryNames.push(candidate);
                    }
                }

                return categoryNames;
            }

            function buildSummary(total, categories) {
                if (categories.length === 1) {
                    return total + ' fantasy names were generated for ' + categories[0] + '.';
                }

                if (categories.length === 2) {
                    return total + ' fantasy names were generated for ' + categories[0] + ' and ' + categories[1] + '.';
                }

                const last = categories[categories.length - 1];
                const firstPart = categories.slice(0, -1).join(', ');
                return total + ' fantasy names were generated for ' + firstPart + ' and ' + last + '.';
            }

            function renderResults(items) {
                const cardsEl = document.getElementById('resultsCards');
                const listEl = document.getElementById('resultsList');

                cardsEl.innerHTML = '';
                listEl.innerHTML = '';

                if (items.length <= 20) {
                    listEl.classList.add('none');
                    items.forEach((item) => {
                        const card = document.createElement('div');
                        card.className = 'name-card';
                        card.innerHTML = '<span class="category">' + item.category + '</span>' + item.name;
                        cardsEl.appendChild(card);
                    });
                } else {
                    listEl.classList.remove('none');
                    items.forEach((item) => {
                        const li = document.createElement('li');
                        li.textContent = item.name + ' (' + item.category + ')';
                        listEl.appendChild(li);
                    });
                }
            }

            function buildPlainOutput(items, summaryText) {
                const lines = [summaryText, ''];
                items.forEach((item, index) => {
                    lines.push((index + 1) + '. ' + item.name + ' [' + item.category + ']');
                });
                return lines.join('\n');
            }

            function generateNames() {
                const quantityInput = document.getElementById('namesPerCategory');
                const namesPerCategory = sanitizeCount(quantityInput.value);
                quantityInput.value = namesPerCategory;

                const categories = Array.from(selectedCategories);
                const summaryEl = document.getElementById('summary');
                const resultTools = document.getElementById('resultTools');

                if (categories.length === 0) {
                    summaryEl.classList.remove('none');
                    summaryEl.textContent = 'Select at least one category before generating names.';
                    resultTools.classList.add('none');
                    document.getElementById('resultsCards').innerHTML = '';
                    document.getElementById('resultsList').innerHTML = '';
                    document.getElementById('resultsList').classList.add('none');
                    document.getElementById('plainOutput').textContent = '';
                    generatedItems = [];
                    return;
                }

                const gender = getGenderValue();
                const allNamesUsed = new Set();
                const results = [];

                categories.forEach((category) => {
                    const names = generateUniqueNames(category, gender, namesPerCategory, allNamesUsed);
                    names.forEach((name) => {
                        results.push({ category: category, name: name });
                    });
                });

                generatedItems = results;
                const total = results.length;
                const summaryText = buildSummary(total, categories);

                summaryEl.classList.remove('none');
                summaryEl.textContent = summaryText;

                renderResults(results);

                const plainOutputText = buildPlainOutput(results, summaryText);
                document.getElementById('plainOutput').textContent = plainOutputText;
                resultTools.classList.remove('none');
            }

            function downloadOutput() {
                if (!generatedItems.length) {
                    return;
                }
                const text = document.getElementById('plainOutput').textContent;
                download('fantasy-names.txt', text);
            }

            function clearResults() {
                generatedItems = [];
                document.getElementById('summary').classList.add('none');
                document.getElementById('summary').textContent = '';
                document.getElementById('resultTools').classList.add('none');
                document.getElementById('resultsCards').innerHTML = '';
                document.getElementById('resultsList').innerHTML = '';
                document.getElementById('resultsList').classList.add('none');
                document.getElementById('plainOutput').textContent = '';
            }

            function presetInitialGeneration() {
                const defaultCategory = 'Dragons';
                selectedCategories.add(defaultCategory);
                const button = document.querySelector('[data-category="' + defaultCategory + '"]');
                if (button) {
                    button.classList.add('active');
                }
                updateSelectedCount();
                generateNames();
            }

            createCategoryPills();
            updateSelectedCount();
            presetInitialGeneration();
        </script></p>
<p>The post <a href="https://imediacto.com/tools/name-generators/fantasy-name-generator/">Fantasy Name Generator</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/name-generators/fantasy-name-generator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>REM to PX Converter</title>
		<link>https://imediacto.com/tools/rem-to-px-converter/</link>
					<comments>https://imediacto.com/tools/rem-to-px-converter/#respond</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Thu, 28 May 2026 22:27:09 +0000</pubDate>
				<category><![CDATA[HTML Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=395</guid>

					<description><![CDATA[<p>Convert REM (Root Em) units to PX (Pixels). This tool is useful for frontend developers working with responsive design and font sizing.</p>
<p>The post <a href="https://imediacto.com/tools/rem-to-px-converter/">REM to PX Converter</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot rem-to-px-converter">
			<div class="row mb-3">
				<div class="col-sm-12">
					<h2>Converting REM to PX and PX to REM</h2>
					<p>
						The <strong>REM to PX Converter</strong> is a <strong>CSS unit converter</strong> tool that helps you
						<strong>convert REM (Root Em) units to PX (Pixels)</strong> and vice versa. This tool is especially useful
						for frontend developers and designers who work with responsive design, as it helps convert between relative
						and absolute units. Simply input your value, set the base font size, and the conversion happens instantly.
					</p>
				</div>
			</div>

			<div class="base-font-section">
				<label for="baseFontSize">Base Font Size (REM root/default):</label>
				<input type="number" id="baseFontSize" value="16" min="8" max="32" step="0.5"
					placeholder="Base font size in pixels" onchange="updateConversions()">
				<span class="help-text mt-2">Default is 16px. Adjust this value if your root font-size is different.</span>
			</div>

			<div class="converter-section">
				<!-- REM to PX Column -->
				<div class="converter-column">
					<h3>REM to PX</h3>
					<div class="row">
						<div class="col-sm-12 mb-3">
							<label for="remInput">Enter REM value:</label>
							<input type="number" id="remInput" class="mb-2" placeholder="e.g., 1.5" step="0.1"
								oninput="convertRemToPx()">
							<div class="conversion-result mb-2">
								<span id="pxOutput">0</span> px
							</div>
							<div class="flex">
								<button class="soft mr-1" onclick="copyToClipboard('pxOutput', 'checkRemPx')" title="Copy REM to PX conversion to clipboard">
									<i class="fa fa-copy"></i>
									Copy
								</button>
								<div id="checkRemPx" class="check none"></div>
							</div>
						</div>
					</div>

					<div class="info-box">
						<strong>Formula:</strong> PX = REM × Base Font Size<br>
						Example: 1rem × 16px = 16px
					</div>
				</div>

				<!-- PX to REM Column -->
				<div class="converter-column">
					<h3>PX to REM</h3>
					<div class="row">
						<div class="col-sm-12 mb-3">
							<label for="pxInput">Enter PX value:</label>
							<input type="number" id="pxInput" class="mb-2" placeholder="e.g., 24" step="1"
								oninput="convertPxToRem()">
							<div class="conversion-result mb-2">
								<span id="remOutput">0</span> rem
							</div>
							<div class="flex">
								<button class="soft mr-1" onclick="copyToClipboard('remOutput', 'checkPxRem')" title="Copy PX to REM conversion to clipboard">
									<i class="fa fa-copy"></i>
									Copy
								</button>
								<div id="checkPxRem" class="check none"></div>
							</div>
						</div>
					</div>

					<div class="info-box">
						<strong>Formula:</strong> REM = PX ÷ Base Font Size<br>
						Example: 24px ÷ 16px = 1.5rem
					</div>
				</div>
			</div>

			<hr>

			<div class="more-notes entry-content">
				<h2>What is REM and PX in CSS?</h2>
				<p>
					<strong>PX (Pixels)</strong> is an absolute unit of measurement in CSS. One pixel is always the same size,
					regardless of the parent element or screen size. Pixels are fixed and do not scale, making them useful for
					precise layouts but less flexible for responsive design.
				</p>
				<p>
					<strong>REM (Root Em)</strong> is a relative unit of measurement in CSS. It is always relative to the root
					element's font size (usually the <code>&lt;html&gt;</code> element). By default, the root font size is 16px,
					so 1rem = 16px. REM units are scalable and responsive, making them ideal for modern web development.
				</p>

				<h3>Why Use REM Instead of PX?</h3>
				<ul>
					<li><strong>Responsive Design:</strong> REM values scale based on the root font size, making it easier to
						create responsive layouts.</li>
					<li><strong>Better Accessibility:</strong> Users who have set a custom base font size in their browser will
						see properly scaled text.</li>
					<li><strong>Easier Maintenance:</strong> Changing the root font size updates all REM-based values throughout
						your site.</li>
					<li><strong>Better for Typography:</strong> Line heights, margins, and paddings scale together when using REM.</li>
				</ul>

				<h3>Common Conversions</h3>
				<table>
					<tr>
						<th>REM</th>
						<th>PX (16px base)</th>
						<th>Usage</th>
					</tr>
					<tr>
						<td>0.5rem</td>
						<td>8px</td>
						<td>Small text, helper text</td>
					</tr>
					<tr>
						<td>0.75rem</td>
						<td>12px</td>
						<td>Smaller text</td>
					</tr>
					<tr>
						<td>1rem</td>
						<td>16px</td>
						<td>Base font size, body text</td>
					</tr>
					<tr>
						<td>1.25rem</td>
						<td>20px</td>
						<td>Normal text</td>
					</tr>
					<tr>
						<td>1.5rem</td>
						<td>24px</td>
						<td>Headings, larger text</td>
					</tr>
					<tr>
						<td>2rem</td>
						<td>32px</td>
						<td>Large headings</td>
					</tr>
					<tr>
						<td>2.5rem</td>
						<td>40px</td>
						<td>Very large headings</td>
					</tr>
					<tr>
						<td>3rem</td>
						<td>48px</td>
						<td>Page titles</td>
					</tr>
				</table>

				<h3>Example CSS Code</h3>
				<pre style="background-color: #f5f5f5; padding: 15px; border-radius: 4px; overflow-x: auto;">
/* Setting the root font size to 16px (default in most browsers) */
html {
  font-size: 16px;
}

/* Using REM for responsive spacing */
body {
  font-size: 1rem;      /* 16px */
  line-height: 1.5rem;  /* 24px */
}

h1 {
  font-size: 2rem;      /* 32px */
  margin-bottom: 1.5rem; /* 24px */
}

h2 {
  font-size: 1.5rem;    /* 24px */
  margin-bottom: 1rem;  /* 16px */
}

.button {
  padding: 0.75rem 1.5rem;  /* 12px 24px */
  font-size: 1rem;          /* 16px */
}
				</pre>
			</div>

			<div class="notes">
				<div class="image"></div>
				<div class="message">
					<p>
						Send me your feedback about this <strong>REM to PX converter</strong> and let me know if you have some
						specific need, then I can implement this new feature and improve this online tool. Also, let me know if
						you have some need about other different <strong>CSS tool</strong> or <strong>coding tool set</strong>.
					</p>
					<p>
						You can learn about how this online tool works or contribute improving the REM to PX Converter by
						programming some new feature or fixing bugs. For that, go to Github on <a
							href="https://github.com/dantovsky/Imediacto-Online-Tool-Set">Imediacto-Online-Tool-Set
							repository</a>. Any contribution is welcome and very appreciated. Thank you!
					</p>
				</div>
			</div>
		</div><!-- end .boot -->

		<script>
			function convertRemToPx() {
				const remValue = parseFloat(document.getElementById('remInput').value) || 0;
				const baseFont = parseFloat(document.getElementById('baseFontSize').value) || 16;
				const pxValue = (remValue * baseFont).toFixed(2);
				document.getElementById('pxOutput').textContent = pxValue;
			}

			function convertPxToRem() {
				const pxValue = parseFloat(document.getElementById('pxInput').value) || 0;
				const baseFont = parseFloat(document.getElementById('baseFontSize').value) || 16;
				const remValue = (pxValue / baseFont).toFixed(4);
				document.getElementById('remOutput').textContent = remValue;
			}

			function updateConversions() {
				convertRemToPx();
				convertPxToRem();
			}
		</script></p>
<p>The post <a href="https://imediacto.com/tools/rem-to-px-converter/">REM to PX Converter</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/rem-to-px-converter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Find and Replace Text Online</title>
		<link>https://imediacto.com/tools/text-tools/find-and-replace-text-online/</link>
					<comments>https://imediacto.com/tools/text-tools/find-and-replace-text-online/#respond</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Sun, 11 Sep 2022 02:08:30 +0000</pubDate>
				<category><![CDATA[Text Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=334</guid>

					<description><![CDATA[<p>Use the Online Text Replacer Tool to find and replace text saving your time when you need to change some words in a large document.</p>
<p>The post <a href="https://imediacto.com/tools/text-tools/find-and-replace-text-online/">Find and Replace Text Online</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot">
        <p>This is an <strong>online text replacer tool</strong> that allows you to find and replace text saving your time when you need to change some words in a large document.</p>
        
        <div class="row">
            <div class="col-sm-12 mb-3">
                <strong class="title">Input</strong>
                <textarea id="input" name="input" cols="30" rows="10" placeholder="Insert text to replace"></textarea>
            </div>
        </div>

        <div class="row">
            <div class="col-md-6 col-12 col-sm-12">
                <strong class="title">Search for</strong>
                <div class="form-group">
                    <input id="search" class="form-control mb-2 mr-sm-2" type="text" value=""
                        placeholder="Text to search for">
                </div>
            </div>
            <div class="col-md-6 col-12 col-sm-12">
                <strong class="title">Replace with</strong>
                <div class="form-group">
                    <input id="replace" class="form-control mb-2 mr-sm-2" type="text" value=""
                        placeholder="Text to replace with">
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-6 col-12 col-sm-12 mb-3">
                <strong class="title">Options</strong>
                <div class="custom-control custom-checkbox">
                    <input type="checkbox" id="case-sensitive" class="custom-control-input">
                    <label class="custom-control-label" for="case-sensitive">Math case-sensitive</label>
                </div>
                <div class="custom-control custom-checkbox">
                    <input type="checkbox" id="match-exact-word" class="custom-control-input" checked>
                    <label class="custom-control-label" for="match-exact-word">Math exact word / term</label>
                </div>
                <div class="custom-control custom-checkbox">
                    <input type="checkbox" id="first-occurrence" class="custom-control-input">
                    <label class="custom-control-label" for="first-occurrence">Find only first occurrence</label>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-sm-12 mb-3">
                <button class="btn btn-success" onclick="findAndReplace();"
                    aria-label="Button to find and replace text">
                    <i class="fa fa-chevron-right"></i> Find and replace
                </button>
            </div>
            <div class="col-sm-12">
                <strong class="title">Output</strong>
                <div id="output"></div>
                <div class="flex" style="justify-content: space-between;">
                    <div class="flex mt-2">
                        <div class="div-btn mr-1" onclick="saveToFile()" title="Download as TXT"
                            aria-label="Button to download the output JSON"> <i class="fa fa-download">
                                <span>TXT</span></i>
                        </div>
                        <div class="flex">
                            <div class="div-btn" onclick="copyToClipboard()" title="Copy output to clipboard"
                                area-label="Button to copy the JSON to clipboard"> <i class="fa fa-copy"> <span
                                        class="hide-on-xs">Copy to clipboard</span></i></div>
                            <div id="check" class="none"
                                style="width: 18px; height: 18px; background-size: contain; margin-left: 8px; margin-bottom: 4px;">
                            </div>
                        </div>
                    </div>
                    <div id="num-occurrences" class="mt-2 float-right"></div>
                </div>
            </div>
        </div>

        <hr>

        <h2>How does the Find and Replace Text work?</h2>
        <p>To use this tool you need:</p>
        <ol>
            <li>In the <strong>Input</strong> textarea, type or paste a block of text you want to replace.</li>
            <li>In the <strong>Search for</strong> input, put the term you want to search for.</li>
            <li>In the <strong>Replace with</strong> input, put the term you want to replace for.</li>
            <li>Choose options to improve your search.</li>
            <li>Click the <strong>Find and replace</strong> button. Actually the process will be applyed automatically.</li>
            <li>Finally, you can see the resulting text in the <strong>Output</strong> textarea.</li>
        </ol>

        <div class="notes">
            <div class="image"></div>
            <div class="message">
                <p>
                    You can view the source code of this online tool or contribute to improving it
                    by programming some new feature or fixing bugs. For that, go to Github at <a
                        href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/009-find-and-replace-text-online"
                        target="_blank">Github >> Find and Replace Text Online</a> and make a pull request. This will be
                    great!
                </p>
            </div>
    </div>
</div>

    <script>
        function findAndReplace() {

            const search = document.getElementById('search').value
            const replace = document.getElementById('replace').value

            if (search == '' || replace == '') {
                document.getElementById('output').innerHTML = ''
                return
            }

            const text = document.getElementById('input').value
            const isCaseSensitive = document.getElementById('case-sensitive').checked ? true : false
            const isMatchExactlyWord = document.getElementById('match-exact-word').checked ? true : false
            const isToFindFirstOccurrence = document.getElementById('first-occurrence').checked ? true : false

            const regex = new RegExp((isMatchExactlyWord ? '\\b' : '') + search + (isMatchExactlyWord ? '\\b' : ''), (isToFindFirstOccurrence ? '' : 'g') + (isCaseSensitive ? '' : 'i'))

            document.getElementById('output').innerHTML = text
                .replace(regex, '<mark>' + replace + '</mark>')
                .replace(/\n/g, '<br />')
            // console.log(text.match(regex))
            document.getElementById('num-occurrences').innerHTML = (text.match(regex) ? text.match(regex).length : '0') + (text.match(regex) && text.match(regex).length == 1 ? ' occurrence' : ' occurrences')
        }

        function saveToFile() {
            download('text-replaced.txt', document.getElementById('output').innerText)
        }

        document.getElementById('search').addEventListener('keyup', findAndReplace)
        document.getElementById('replace').addEventListener('keyup', findAndReplace)
        document.getElementById('case-sensitive').addEventListener('click', findAndReplace)
        document.getElementById('match-exact-word').addEventListener('click', findAndReplace)
        document.getElementById('first-occurrence').addEventListener('click', findAndReplace)
    </script></p>
<p>The post <a href="https://imediacto.com/tools/text-tools/find-and-replace-text-online/">Find and Replace Text Online</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/text-tools/find-and-replace-text-online/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Compare Two Lists ~ Free List Comparison Tool</title>
		<link>https://imediacto.com/tools/list-tools/compare-two-lists/</link>
					<comments>https://imediacto.com/tools/list-tools/compare-two-lists/#comments</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Tue, 09 Feb 2021 15:13:34 +0000</pubDate>
				<category><![CDATA[List Tools]]></category>
		<category><![CDATA[Text Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[List comparison tool]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=266</guid>

					<description><![CDATA[<p>This list comparison tool allows you to compare two lists to be able you analyze SET operations (difference, intersection, union, symmetric difference).</p>
<p>The post <a href="https://imediacto.com/tools/list-tools/compare-two-lists/">Compare Two Lists ~ Free List Comparison Tool</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot">
        <p>This <strong>list comparison tool</strong> allows you to <strong>compare two lists</strong> (arrays) to be able you analyze the <strong>difference between the two lists</strong>.
            The program receives lists of the type string or number and after starting the comparison it is possible to sort the results.</p>

        <!-- Results -->
        <div class="row">
            <div class="col-12 mt-2 mb-2">
                <h2>Inputs</h2>
            </div>
        </div>

        <div class="row">
            <div class="col-md-6 col-12 col-sm-12 mb-3">
                <p class="strong font-topic">Input data structure</p>
                <div class="custom-control custom-radio">
                    <input type="radio" id="sep1" name="items-separation" value="lines" class="custom-control-input"
                        checked>
                    <label class="custom-control-label" for="sep1">From lines</label>
                </div>
                <div class="custom-control custom-radio">
                    <input type="radio" id="sep2" name="items-separation" value="commas" class="custom-control-input">
                    <label class="custom-control-label" for="sep2">Separeted by commas</label>
                </div>
                <div class="custom-control custom-radio">
                    <input type="radio" id="sep3" name="items-separation" value="spaces" class="custom-control-input">
                    <label class="custom-control-label" for="sep3">Separeted by space</label>
                </div>
            </div>
            <div class="col-md-6 col-12 col-sm-12 mb-3">
                <p class="strong font-topic">Input data type</p>
                <div class="custom-control custom-radio">
                    <input type="radio" id="string" name="data-type" value="string" class="custom-control-input"
                        checked>
                    <label class="custom-control-label" for="string">String</label>
                </div>
                <div class="custom-control custom-radio">
                    <input type="radio" id="number" name="data-type" value="number" class="custom-control-input">
                    <label class="custom-control-label" for="number">Number</label>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-12 mb-3 hide-on-xs">
                <div class="div-btn mr-1 mr-2" title="Switch view">
                    <i class="fa fa-list" onclick="toggleLines()"> <span>Toggle layout view</span></i>
                </div>
            </div>
            <div class="col-sm-6 mb-3">
                <p class="strong font-topic">List A</p>
                <textarea id="input-a" name="input-a" cols="30" rows="10" placeholder="Insert items for list A"></textarea>
            </div>
            <div class="col-sm-6 mb-3">

                <p class="strong font-topic">List B</p>
                <textarea id="input-b" name="input-a" cols="30" rows="10" placeholder="Insert items for list B"></textarea>
            </div>
        </div>
        <div class="row">
            <div class="col-md-6 col-sm-12 mb-3">
                <p class="strong font-topic">Handle data as</p>
                <div class="custom-control custom-radio">
                    <input type="radio" id="set" name="set-or-list" value="set" class="custom-control-input" checked>
                    <label class="custom-control-label" for="set">As a set (no repeated elements)</label>
                </div>
                <div class="custom-control custom-radio">
                    <input type="radio" id="list" name="set-or-list" value="list" class="custom-control-input">
                    <label class="custom-control-label" for="list">As a list (with repeated elements)</label>
                </div>
            </div>
            <div class="col-md-6 col-sm-12 mb-3">
                <p class="strong font-topic">Output data separetad by</p>
                <div class="custom-control custom-radio">
                    <input type="radio" id="output1" name="items-separation-output" value="lines"
                        class="custom-control-input" checked>
                    <label class="custom-control-label" for="output1">By lines</label>
                </div>
                <div class="custom-control custom-radio">
                    <input type="radio" id="output2" name="items-separation-output" value="commas"
                        class="custom-control-input">
                    <label class="custom-control-label" for="output2">By commas</label>
                </div>
                <div class="custom-control custom-radio">
                    <input type="radio" id="output-" name="items-separation-output" value="spaces"
                        class="custom-control-input">
                    <label class="custom-control-label" for="output-">By space</label>
                </div>
            </div>
        </div>
        <div class="row mb-3">
            <div class="col-sm-12">
                <div class="flex space-between mt-2">
                    <button onclick="applyDiffImproved()" class="btn btn-success mr-2">
                        <i class="fa fa-chevron-right"></i> Compare lists
                    </button>
                    <div class="flex">
                        <!-- TODO :: aplicar button.soft em todos os divs que fazem o papel de botão -->
                        <button class="soft mr-1" onclick="sortAllItems(false)" title="Sort all items asc" aria-label="Sort all items desc">
                            <i class="fa fa-sort-amount-asc"> <span class="hide-on-xs">Sort all asc</span></i>
                        </button>
                        <button class="soft mr-1" onclick="sortAllItems(true)" title="Sort all items asc" aria-label="Sort all items asc">
                            <i class="fa fa-sort-amount-desc"> <span class="hide-on-xs">Sort all desc</span></i>
                        </button>
                    </div>
                </div>
            </div>
        </div>

        <!-- Results -->
        <div class="row">
            <div class="col-12">
                <h2>Results</h2>
            </div>
        </div>
        
        <div class="row">
            
            <!-- Only in A -->
            <div class="col-sm-6 mt-3">
                <div class="flex mb-2">
                    <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-a-minus-b.png" class="img-set" alt="Set: A minus B">
                    <p class="strong font-topic" title="A minus B">Only in list A</p>
                </div>
                <pre title="A minus B"><span id="adiffb"><span class="help-text">A diff B</span></span></pre>
                <div class="flex">
                    <button class="soft mr-1" onclick="sortItems('adiffb')" title="Sort items asc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-asc"></i>
                    </button>
                    <button class="soft mr-1" onclick="sortItems('adiffb', true)" title="Sort items desc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-desc"></i>
                    </button>
                    <button class="soft mr-1" onclick="copyToClipboard('adiffb', 'check1')" title="Copy output to clipboard" aria-label="Copy the output A minus B to clipboard">
                        <i class="fa fa-copy"></i>&nbsp;
                    </button>
                    <div id="check1" class="check none"></div>
                </div>
            </div>
            
            <!-- Only in B -->
            <div class="col-sm-6 mt-3">
                <div class="flex mb-2">
                    <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-b-minus-a.png" class="img-set" alt="Set: B minus A">
                    <p class="strong font-topic" title="B minus A">Only in list B</p>
                </div>
                <pre title="B minus A"><span id="bdiffa"><span class="help-text">B diff A</span></span></pre>
                <div class="flex">
                    <button class="soft mr-1" onclick="sortItems('bdiffa')" title="Sort items asc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-asc"></i>
                    </button>
                    <button class="soft mr-1" onclick="sortItems('bdiffa', true)" title="Sort items desc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-desc"></i>
                    </button>
                    <button class="soft mr-1" onclick="copyToClipboard('bdiffa', 'check2')" title="Copy output to clipboard" aria-label="Copy the output B minus A to clipboard">
                        <i class="fa fa-copy"></i>&nbsp;
                    </button>
                    <div id="check2" class="check none"></div>
                </div>
            </div>
            
            <!-- A intersection B -->
            <div class="col-sm-6 mt-3">
                <div class="flex mb-2">
                    <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-intersection.png" class="img-set" alt="Set: A intersection B">
                    <p class="strong font-topic" title="A intersection B">Common items (A &cap; B)</p>
                </div>
                <pre title="A intersection B"><span id="ainterb"><span class="help-text">Intersection ​​between A and B</span></span></pre>
                <div class="flex">
                    <button class="soft mr-1" onclick="sortItems('ainterb')" title="Sort items asc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-asc"></i>
                    </button>
                    <button class="soft mr-1" onclick="sortItems('ainterb', true)" title="Sort items desc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-desc"></i>
                    </button>
                    <button class="soft mr-1" onclick="copyToClipboard('ainterb', 'check3')" title="Copy output to clipboard" aria-label="Copy the common items to clipboard">
                        <i class="fa fa-copy"></i>&nbsp;
                    </button>
                    <div id="check3" class="check none"></div>
                </div>
            </div>

            <!-- A union B -->
            <div class="col-sm-6 mt-3">
                <div class="flex mb-2">
                    <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-union.png" class="img-set" alt="Set: A union B">
                    <p class="strong font-topic" title="A union B">All items (A &cup; B)</p>
                </div>
                <pre title="A union B"><span id="aunionb"><span class="help-text">Union of values ​​between A and B</span></span></pre>
                <div class="flex">
                    <button class="soft mr-1" onclick="sortItems('aunionb')" title="Sort items asc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-asc"></i>
                    </button>
                    <button class="soft mr-1" onclick="sortItems('aunionb', true)" title="Sort items desc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-desc"></i>
                    </button>
                    <button class="soft mr-1" onclick="copyToClipboard('aunionb', 'check4')" title="Copy output to clipboard" aria-label="Copy the union output to clipboard">
                        <i class="fa fa-copy"></i>&nbsp;
                    </button>
                    <div id="check4" class="check none"></div>
                </div>
            </div>
            <!-- Symmetric difference -->
            <div class="col-sm-6 mt-3">
                <div class="flex mb-2">
                    <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-symmetric-difference.png" class="img-set" alt="Set: Symmetric diference between A and B">
                    <p class="strong font-topic" title="Symmetric difference">Exclusive items (A &bigtriangleup; B)</p>
                </div>
                <pre title="Symmetric difference"><span id="difference"><span class="help-text">Symmetric difference between A and B</span></span></pre>
                <div class="flex">
                    <button class="soft mr-1" onclick="sortItems('difference')" title="Sort items asc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-asc"></i>
                    </button>
                    <button class="soft mr-1" onclick="sortItems('difference', true)" title="Sort items desc" aria-label="Sort items">
                        <i class="fa fa-sort-amount-desc"></i>
                    </button>
                    <button class="soft mr-1" onclick="copyToClipboard('difference', 'check5')" title="Copy output to clipboard" aria-label="Copy the symetric difference between A and B to clipboard">
                        <i class="fa fa-copy"></i>&nbsp;
                    </button>
                    <div id="check5" class="check none"></div>
                </div>
            </div>
        </div>
        <hr>
        <section class="tips">
        <h2>Tips for Better Results</h2>
            <ul>
                <li>Paste clean text without extra spaces.</li>
                <li>Use “set” mode to ignore duplicates.</li>
                <li>Use “list” mode to include repeated items.</li>
            </ul>
        </section>
        <hr>
        <h2>How does the Compare Two Lists tool work?</h2>
        <p>It will function normally according to the rules of the sets, in Mathematics. However, in this tool, you can also choose the list option, so that it is possible to work with repeated values. The following operations are performed:</p>

        <div class="flex mt-3">
            <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-a-minus-b.png" class="img-set" alt="Set: A minus B"><h3 class="mb-0 mt-0 pb-0">A minus B</h3>
        </div>
        <p>Returns the values ​​that are present only in list A.</p>

        <div class="flex mt-3">
            <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-b-minus-a.png" class="img-set" alt="Set: B minus A"><h3 class="mb-0 mt-0 pb-0">B minus A</h3>
        </div>
        <p>Returns the values ​​that are present only in list B.</p>

        <div class="flex mt-3">
            <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-intersection.png" class="img-set" alt="Set: A intersection B"><h3 class="mb-0 mt-0 pb-0">A intersection B</h3>
        </div>
        <p>They are represented by the values ​​that occur simultaneously in the two lists.</p>

        <div class="flex mt-3">
            <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-union.png" class="img-set" alt="Set: A union B"><h3 class="mb-0 mt-0 pb-0">A union B</h3>
        </div>
        <p>They are represented by all the values ​​present in both lists.</p>

        <div class="flex mt-3">
            <img decoding="async" src="https://imediacto.com/wp-content/uploads/2021/02/set-symmetric-difference.png" class="img-set" alt="Set: Symmetric diference between A and B"><h3 class="mb-0 mt-0 pb-0">Symmetric difference</h3>
        </div>
        <p>The symmetric difference of two sets is the set of elements that are in one of the sets, but not at its intersection.</p>

        <h2>Important note</h2>

        <p>There is no limitation on the maximum number of rows allowed in a list, however, if you put in too large a volume of data, the browser may slow down or even crash for a moment.</p>
        
        <hr>
        <!-- FAQ sem JS -->
        <h2 class="mt-4 mb-3">FAQ about this Comparison List Tool</h2>

        <div class="faq-list">
            <details>
                <summary>Can I compare lists with numbers?</summary>
                <div class="faq-content">
                    Yes. Just switch the “Data Type” option to <strong>Number</strong> before clicking <em>Compare Lists</em>.
                </div>
            </details>

            <details>
                <summary>What is the maximum list size?</summary>
                <div class="faq-content">
                    There is no fixed limit. However, very large lists (thousands of lines) may slow down your browser temporarily.
                </div>
            </details>

            <details>
                <summary>Does this tool store my data?</summary>
                <div class="faq-content">
                    No. All processing happens locally in your browser — your data never leaves your device.
                </div>
            </details>

            <details>
                <summary>Can I find duplicate items between two lists?</summary>
                <div class="faq-content">
                    Yes. Use the <strong>Common items (A ∩ B)</strong> section to see all items that appear in both lists — these are your duplicates.
                </div>
            </details>

            <details>
                <summary>Is the comparison case sensitive?</summary>
                <div class="faq-content">
                    Yes. The comparison is <strong>case sensitive</strong>, meaning “Apple” and “apple” are treated as different items.
                </div>
            </details>

            <details>
                <summary>What is the difference between Union and Symmetric Difference?</summary>
                <div class="faq-content">
                    <strong>Union (A ∪ B)</strong> shows all unique items from both lists combined.  
                    <strong>Symmetric Difference (A △ B)</strong> shows items that appear in either list, but <em>not</em> in both — the unique items from each list.
                </div>
            </details>
        </div>

        <!-- JSON-LD FAQ schema for SEO -->
        <script type="application/ld+json">
        {
        "@context": "https://schema.org",
        "@type": "FAQPage",
        "mainEntity": [
                {
                "@type": "Question",
                "name": "Can I compare lists with numbers?",
                "acceptedAnswer": {
                    "@type": "Answer",
                    "text": "Yes. Just switch the Data Type option to Number before clicking Compare Lists."
                }
                },
                {
                "@type": "Question",
                "name": "What is the maximum list size?",
                "acceptedAnswer": {
                    "@type": "Answer",
                    "text": "There is no fixed limit. However, very large lists may slow down your browser temporarily."
                }
                },
                {
                "@type": "Question",
                "name": "Does this tool store my data?",
                "acceptedAnswer": {
                    "@type": "Answer",
                    "text": "No. All processing happens locally in your browser — your data never leaves your device."
                }
                },
                {
                "@type": "Question",
                "name": "Can I find duplicate items between two lists?",
                "acceptedAnswer": {
                    "@type": "Answer",
                    "text": "Yes. Use the In Both Lists (A ∩ B) section to see all items that appear in both lists — these are your duplicates."
                }
                },
                {
                "@type": "Question",
                "name": "Is the comparison case sensitive?",
                "acceptedAnswer": {
                    "@type": "Answer",
                    "text": "Yes. The comparison is case sensitive, meaning 'Apple' and 'apple' are considered different items."
                }
                },
                {
                "@type": "Question",
                "name": "What is the difference between Union and Symmetric Difference?",
                "acceptedAnswer": {
                    "@type": "Answer",
                    "text": "Union (A ∪ B) shows all unique items from both lists combined, while Symmetric Difference (A △ B) shows items that appear in either list but not in both."
                }
                }
            ]
        }
        </script>
        
        <div class="notes">
            <div class="image"></div>
            <div class="message">
                <p>
                    List comparison is a recurring task among professional programmers and students.
                    If you want some new feature for this <strong>Compare Two Lists</strong> tool, let me know in the comments area.
                    Also, tell me if you found some bug, that I can fix it as soon as possible.
                </p>
                <p>
                    You can learn about how this online list tool works or contribute improving the it
                    by programming some new feature or fixing bugs. For that, go to Github on <a
                        href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/008-compare-two-lists"
                        target="_blank">Github >> Compare Two Lists</a> and make a pull request. This will be great!
                </p>
            </div>
        </div>
    </div>

    <script>
        let separatorOutput = '\n';

        // Improved
        function applyDiffImproved() {

            const itemsSeparationsInput = document.querySelector('input[name="items-separation"]:checked').value
            const setOrList = document.querySelector('input[name="set-or-list"]:checked').value
            const itemsSeparationsOutput = document.querySelector('input[name="items-separation-output"]:checked').value

            // Input sepearator
            let separatorInput = '\n';
            if (itemsSeparationsInput == 'lines') {
                separatorInput = '\n';
            } else if (itemsSeparationsInput == 'commas') {
                separatorInput = ',';
            } else if (itemsSeparationsInput == 'spaces') {
                separatorInput = ' ';
            }

            // Output sepearator
            if (itemsSeparationsOutput == 'lines') {
                separatorOutput = '\n';
            } else if (itemsSeparationsOutput == 'commas') {
                separatorOutput = ', ';
            } else if (itemsSeparationsOutput == 'spaces') {
                separatorOutput = ' ';
            }

            // Set or list
            const isSet = setOrList === 'set' ? true : false

            // Get items on input textareas
            let inputA = document.getElementById('input-a').value.split(separatorInput)
            let inputB = document.getElementById('input-b').value.split(separatorInput)

            if (separatorInput == '\n') {
                inputA = inputA.filter(item => item != '')
                inputB = inputB.filter(item => item != '')
            }

            if (separatorInput == '\n' || separatorInput == ',') {
                inputA = inputA.map(item => item.trim())
                inputB = inputB.map(item => item.trim())
            } else {
                // Remove empty elements
                inputA = inputA.filter(item => item != '')
                inputB = inputB.filter(item => item != '')
            }

            aDiffB = []
            bDiffA = []
            aInterB = []

            // Passing through arrayA :: get A diff B and A inter B
            for (item in inputA) {
                if (!inputB.includes(inputA[item])) {
                    aDiffB.push(inputA[item])
                } else {
                    aInterB.push(inputA[item])
                }
            }

            // Passing through arrayB :: get B diff A
            bDiffA = inputB.filter(item => !inputA.includes(item))

            // Writing results
            if (isSet) {
                document.getElementById('adiffb').innerHTML = [...new Set(aDiffB)].join(separatorOutput)
                document.getElementById('bdiffa').innerHTML = [...new Set(bDiffA)].join(separatorOutput)
                document.getElementById('ainterb').innerHTML = [...new Set(aInterB)].join(separatorOutput)
                document.getElementById('aunionb').innerHTML = [...new Set(inputA.concat(inputB))].join(separatorOutput)
                document.getElementById('difference').innerHTML = [...new Set(aDiffB.concat(bDiffA))].join(separatorOutput)
            } else {
                document.getElementById('adiffb').innerHTML = aDiffB.join(separatorOutput)
                document.getElementById('bdiffa').innerHTML = bDiffA.join(separatorOutput)
                document.getElementById('ainterb').innerHTML = aInterB.join(separatorOutput)
                document.getElementById('aunionb').innerHTML = inputA.concat(inputB).join(separatorOutput)
                document.getElementById('difference').innerHTML = aDiffB.concat(bDiffA).join(separatorOutput)
            }
        }

        function toggleLines() {
            const elems = document.querySelectorAll('.row > div')
            elems.forEach(elem => {
                elem.classList.contains('col-sm-12') ? elem.classList.remove('col-sm-12') : elem.classList.add('col-sm-12')
            })
        }

        function sortItems(id, isDesc = false) {

            const dataType = document.querySelector('input[name="data-type"]:checked').value
            const element = document.getElementById(id)
            let content = element.innerText.split(separatorOutput)

            if (dataType === 'string') {
                content.sort()
                if (isDesc) {
                    content = content.reverse()
                }
            } else if (dataType === 'number') {
                isDesc ? content.sort((a, b) => b - a) : content.sort((a, b) => a - b)
            }

            element.innerHTML = content.join(separatorOutput)
        }
        
        function sortAllItems(isDesc = false) {
            const operations = ['adiffb','bdiffa','ainterb','aunionb','difference']
            operations.forEach(operation => {
                sortItems(operation, isDesc)
            })
        }

        // https://www.w3resource.com/javascript-exercises/javascript-array-exercise-23.php
        // https://stackoverflow.com/questions/9229645/remove-duplicate-values-from-js-array
        // https://www.30secondsofcode.org/blog/s/copy-text-to-clipboard-with-javascript
        // https://fontawesome.com/v4.7.0/icons/

    </script></p>
<p>The post <a href="https://imediacto.com/tools/list-tools/compare-two-lists/">Compare Two Lists ~ Free List Comparison Tool</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/list-tools/compare-two-lists/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Bulk Image Resizer and Compressor</title>
		<link>https://imediacto.com/tools/image-tools/bulk-image-resizer-and-compressor/</link>
					<comments>https://imediacto.com/tools/image-tools/bulk-image-resizer-and-compressor/#respond</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Mon, 05 Oct 2020 17:03:40 +0000</pubDate>
				<category><![CDATA[Image Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=249</guid>

					<description><![CDATA[<p>It's an Image Online Tool that helps you to optimize images and photos, such as resizing, compressing, and converting. It's good for SEO optimization.</p>
<p>The post <a href="https://imediacto.com/tools/image-tools/bulk-image-resizer-and-compressor/">Bulk Image Resizer and Compressor</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot">
        <h1>Bulk Image Resizer and Compressor</h1>
        <div class="boots">
            <h2>Free Online Batch Image Resizer and Compressor</h2>
            <p>This application allows you to resize and compress a single image or multiple images in a batch mode,
                preserving the
                aspect ratio of the images. It's very useful if you want to reduce a photo to a smaller size.</p>

            <div class="row">
                <div class="col-12">
                    <h3>Select your images (.jpg, .png)</h3>
                    <div class="custom-file mb-2">
                        <input type="file" class="custom-file-input" id="file" accept="image/jpeg,image/png" multiple>
                        <label id="holder" class="input-drag-drop" for="file">
                            <div id="file-name" class="file-name text-truncate">
                                Drag & Drop your images here
                            </div>
                            <div class="text-browse"><i class="fa fa-search"></i>
                                <span class="hidden-680-down">Browse</span>
                            </div>
                        </label>
                    </div>
                </div>
                <div class="col-md-6 col-sm-12 mb-2">
                    <h3>Type the new width</h3>
                    <div class="form-group">
                        <input id="new-width" class="form-control mb-2 mr-sm-2" type="number" placeholder="New width"
                            min="10" max="8000">
                        <!-- <div id="error-msg-new-width" class="invalid-feedback" style="margin-top: -19px;"></div> -->
                    </div>
                </div>
                <div class="col-md-6 col-sm-12 mb-2">
                    <h3>Image quality (<span id="quality-selected">92</span>%)</h3>
                    <div class="form-group">
                        <!-- class="form-control-range" -->
                        <input type="range" id="quality" class="custom-range mt-3" min="0" max="100" value="92">
                        <!-- <input type="range" class="custom-range" min="0" max="100" id="quality" value="92"> -->
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-12">
                    <p id="num-items"></p>
                    <div id="list-files" class="mb-3"></div>

                    <div class="custom-control custom-checkbox mb-2">
                        <input type="checkbox" class="custom-control-input" id="zip-output">
                        <label class="custom-control-label" for="zip-output">Output images in a zip file</label>
                    </div>
                </div>
            </div>
            <!-- <div class="row">
                <div class="col-12">
                    <div class="form-check mb-2">
                        <div class="custom-control custom-checkbox">
                            <input type="checkbox" class="custom-control-input" id="zip-output">
                            <label class="custom-control-label" for="zip-output">Wrap the words in quotes</label>
                        </div>
                    </div>
                </div>
            </div> -->
        </div>
        <div class="row">
            <div class="col-12 mb-3">
                <!-- <button class="btn btn-success" onclick="compress(event);" disabled>Resize images</button> -->
                <button class="btn btn-success mb-2" onclick="compress(event);" disabled
                    aria-label="Button to convert CSV to JSON">
                    <i class="fa fa-chevron-right"></i>
                    Resize images
                </button>
            </div>
        </div>
        <div class="row">
            <div class="col-12">
                <div id="message-error"></div>
            </div>
        </div>

        <hr />

        <h3>For what or for whom is this app useful?</h3>
        <p>The Bulk Image Resizer is useful for photographer, designers or SEO experts. One of the jobs of SEO
            optimization is to reduce and compress the size of the images. This app will help you to reduce the size
            in
            pixels and choose a level quality to compress it.</p>
        <p>
            Alternatively, you can resize to a new dimension and maintain 92% of the quality compression (standard
            compression used when resizing) and then use another tool to reduce the size in weight (kB or MB) of the
            images, such as <a href="https://tinypng.com/" target="_blank">tinypng.com</a>.</p>
        <p>The main benefits of this online tool are:
        <ul>
            <li>Avoid installing a tool on your machine.</li>
            <li>Apply the batch resizer (not just one image at a time).</li>
            <li>Get lighter images for a more performing website.</li>
        </ul>
        </p>
    </div>
    <script>
        // referências
        const holder = document.getElementById('holder');
        const fileInput = document.getElementById('file');
        const btn = document.querySelector('button.btn-success');

        // injeta a barra de progresso logo abaixo do botão
        const progContainer = document.createElement('div');
        progContainer.id = 'progress-container';
        progContainer.style.display = 'none';
        progContainer.innerHTML = `
            <progress id="progress-bar" value="0" max="0"></progress>
            <p id="progress-text">0/0</p>
        `;
        btn.parentNode.insertBefore(progContainer, btn.nextSibling);

        const progressBar = document.getElementById('progress-bar');
        const progressText = document.getElementById('progress-text');

        // Previna comportamento padrão nos eventos de drag
        ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(evt => {
            holder.addEventListener(evt, e => {
                e.preventDefault(); e.stopPropagation();
            });
        });

        // Destaca ao arrastar por cima
        ['dragenter', 'dragover'].forEach(evt => {
            holder.addEventListener(evt, () => holder.classList.add('input-drop'));
        });

        // Remove destaque
        ['dragleave', 'drop'].forEach(evt => {
            holder.addEventListener(evt, () => holder.classList.remove('input-drop'));
        });

        // Trata o drop – popula o input e dispara change
        holder.addEventListener('drop', e => {
            if (!e.dataTransfer.files.length) return;
            const dt = new DataTransfer();
            Array.from(e.dataTransfer.files).forEach(f => dt.items.add(f));
            fileInput.files = dt.files;
            fileInput.dispatchEvent(new Event('change'));
        });

        // Placeholder e mensagem de erro
        const newWidth = document.getElementById('new-width');
        newWidth.setAttribute('placeholder', `Min ${newWidth.min} e max ${newWidth.max}`);
        document.getElementById('message-error').innerText =
            `Type a valid width (min ${newWidth.min} e max ${newWidth.max}).`;
        if (localStorage.bulkImageResizerWidth)
            newWidth.value = localStorage.bulkImageResizerWidth;

        // Atualiza label da qualidade
        ['mousemove', 'change'].forEach(evt =>
            document.getElementById('quality').addEventListener(evt, e =>
                document.getElementById('quality-selected').innerText = e.target.value
            )
        );

        // Mostra lista de ficheiros e ativa botão
        fileInput.addEventListener('change', e => {
            const listFiles = document.getElementById('list-files');
            const numItems = document.getElementById('num-items');
            const files = e.target.files;
            let totalSize = 0;
            listFiles.innerHTML = '';
            if (files.length) {
                btn.disabled = false;
                listFiles.classList.add('display-block');
                Array.from(files).forEach(f => {
                    const p = document.createElement('p');
                    p.innerText = f.name;
                    listFiles.appendChild(p);
                    totalSize += f.size;
                });
                numItems.classList.add('display-block');
                numItems.innerHTML =
                    `There ${files.length === 1 ? 'is' : 'are'} <strong>${files.length}</strong>` +
                    ` image${files.length === 1 ? '' : 's'} to resize, ` +
                    `total <strong>${(totalSize / 1000).toFixed(2)} kB</strong>.`;
            } else {
                btn.disabled = true;
                numItems.classList.remove('display-block');
                listFiles.classList.remove('display-block');
            }
            // esconde progress se voltar a escolher
            progContainer.style.display = 'none';
        });

        // Função principal
        function compress() {
            const width = Number(newWidth.value);
            const min = Number(newWidth.min);
            const max = Number(newWidth.max);
            const files = Array.from(fileInput.files);
            const quality = Number(document.getElementById('quality').value);
            const toZip = document.getElementById('zip-output').checked;

            if (width < min || width > max) {
                const msg = document.getElementById('message-error');
                msg.classList.add('display-block');
                setTimeout(() => msg.classList.remove('display-block'), 5000);
                return;
            }

            // preenche progress bar
            progressBar.max = files.length;
            progressBar.value = 0;
            progressText.innerText = `0/${files.length}`;
            progContainer.style.display = 'block';

            // instância Zip se necessário
            const zip = toZip ? new JSZip() : null;

            files.forEach(file => {
                const reader = new FileReader();
                reader.readAsDataURL(file);
                reader.onload = ev => {
                    const img = new Image();
                    img.src = ev.target.result;
                    img.onload = () => {
                        // desenha canvas
                        const canvas = document.createElement('canvas');
                        canvas.width = width;
                        canvas.height = width * (img.height / img.width);
                        const ctx = canvas.getContext('2d');
                        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

                        // função interna para tratar blob comum
                        const handleBlob = blob => {
                            if (toZip) {
                                zip.file(file.name, blob);
                            } else {
                                const link = document.createElement('a');
                                link.href = URL.createObjectURL(blob);
                                link.download = file.name;
                                document.body.appendChild(link);
                                link.click();
                                link.remove();
                                URL.revokeObjectURL(link.href);
                            }

                            // actualiza progresso
                            progressBar.value++;
                            progressText.innerText = `${progressBar.value}/${files.length}`;

                            // se terminou e é zip, gera e faz download
                            if (progressBar.value === files.length && toZip) {
                                zip.generateAsync({ type: 'blob' }).then(zipBlob => {
                                    const zipLink = document.createElement('a');
                                    zipLink.href = URL.createObjectURL(zipBlob);
                                    zipLink.download = 'crompressed-images.zip';
                                    document.body.appendChild(zipLink);
                                    zipLink.click();
                                    zipLink.remove();
                                    URL.revokeObjectURL(zipLink.href);
                                    setTimeout(() => progContainer.style.display = 'none', 2000);
                                });
                            }
                            else if (progressBar.value === files.length) {
                                // esconde progress após 2s (sem zip)
                                setTimeout(() => progContainer.style.display = 'none', 2000);
                            }
                        };

                        // branch PNG: usa UPNG para quantizar
                        if (file.type === 'image/png') {
                            const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
                            const buf = imgData.data.buffer;
                            const maxColors = Math.max(2, Math.round(quality * 2.56));
                            const pngBuf = UPNG.encode([buf], canvas.width, canvas.height, maxColors);
                            const blob = new Blob([pngBuf], { type: 'image/png' });
                            handleBlob(blob);
                        }
                        // branch outros formatos (JPEG, WebP…)
                        else {
                            canvas.toBlob(blob => {
                                handleBlob(blob);
                            }, file.type, quality / 100);
                        }

                        // guarda largura
                        localStorage.bulkImageResizerWidth = width;
                    };
                };
            });
        }
    </script></p>
<p>The post <a href="https://imediacto.com/tools/image-tools/bulk-image-resizer-and-compressor/">Bulk Image Resizer and Compressor</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/image-tools/bulk-image-resizer-and-compressor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Uppercase Converter</title>
		<link>https://imediacto.com/tools/text-tools/uppercase-converter/</link>
					<comments>https://imediacto.com/tools/text-tools/uppercase-converter/#respond</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Mon, 11 May 2020 23:38:28 +0000</pubDate>
				<category><![CDATA[Text Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=135</guid>

					<description><![CDATA[<p>The Uppercase Converter is an online tool to change your text from lowercase to UPPERCASE letters or convert from other letter case types.</p>
<p>The post <a href="https://imediacto.com/tools/text-tools/uppercase-converter/">Uppercase Converter</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot"><h2>Convert to Uppercase Letters</h2><p> The <strong>Uppercase Converter</strong> is an online tool to change your characters, words or text from <strong>lowercase to uppercase letters</strong> or convert from other letter case types like title case or alternating letter case.</p><h3 class="mb-0">Type a text to convert to uppercase<img decoding="async" src="https://imediacto.com/wp-content/uploads/2020/05/arrow-down.svg" width="30" height="30" class="arrow-down" alt="Arrow down to indicate the important textarea"></h3><div class="d-flex align-items-center flex-column"><div class="w-100" style="position: relative;"><div class="counting-chars"><span id="counting-chars">0</span> / <span id="max-length-chars">1000000</span></div><textarea name="input" id="input" class="text-uppercase" cols="30" rows="7" maxlength="1000000" placeholder="Type your text here to convert to UPPERCASE in real time..."></textarea></div></div><div class="row mb-3"><div class="col-12 mt-1"><div class="flex"><div class="div-btn mr-2" onclick="copyToClipboard('input')"> <i class="fa fa-copy"> <span>Copy to clipboard</span></i></div><div id="check" class="none"></div></div></div></div><div class="more-notes"><h2>How Does this Upper Case Conversion Tool Work?</h2><p>The text area automatically converts all the words to uppercase as you type text or paste text directly into it. Basically the input text area has a CSS class with the property <code>{ text-transform: uppercase; }</code>, that make this HTML element always in uppercase mode.</p><p> After getting the text converted to UPPERCASE, click the button below to the text area to copy it to the clipboard.</p><p> Try our most complete <strong><a href="https://imediacto.com/tools/text-tools/case-converter">text case converter online tool</a></strong> that allows you to perform various conversion types in a single tool.</p><h2>What are Uppercase Letters?</h2><p> Uppercase letters are used at the beginning of sentences, in the first letter of the first word. If in the middle of the sentence you have a proper name, names of people or animals, it must also be written in capital letters. They are also used in titles and acronyms. When a word or phrase is all written in capital letters, it can mean something important, a call for attention but it can also mean shouting.</p><p> By convention in most programming languages, uppercase letters are used for contant names.</p><p>These are the english alphabet uppercase letters:<br /><code>{ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }</code></p></div><div class="notes"><div class="image"></div><div class="message"><p> Send me your feedback about this <strong>uppercase converter tool</strong> and let me know if this web application works as you need it. If you need any improvement for this online tool, send me a message in the comments section.</p><p> You can learn about how this online tool works or contribute improving the Uppercase Converter by programming some new feature or fixing bugs. For that, go to Github on <a href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/006-uppercase-converter" target="_blank">Github >> Uppercase Converter</a> and make a pull request. This will be great!</p></div></div></div> <script>window.onload=function(){wordCount('input',1000000);}</script></p>
<p>The post <a href="https://imediacto.com/tools/text-tools/uppercase-converter/">Uppercase Converter</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/text-tools/uppercase-converter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Lowercase Converter</title>
		<link>https://imediacto.com/tools/text-tools/lowercase-converter/</link>
					<comments>https://imediacto.com/tools/text-tools/lowercase-converter/#respond</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Mon, 11 May 2020 19:58:51 +0000</pubDate>
				<category><![CDATA[Text Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=131</guid>

					<description><![CDATA[<p>The Lowercase Converter is an online tool to change your text from uppercase to lowercase letters or convert from other letter case types.</p>
<p>The post <a href="https://imediacto.com/tools/text-tools/lowercase-converter/">Lowercase Converter</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot"><h2>Convert to Lowercase Letters</h2><p> The <strong>Lowercase Converter</strong> is an online tool to change your text from <strong>uppercase to lowercase letters</strong> or convert from other letter case types like title case or alternating letter case.</p><h3 class="mb-0">Type a text to convert to lowercase<img loading="lazy" decoding="async" src="https://imediacto.com/wp-content/uploads/2020/05/arrow-down.svg" width="30" height="30" class="arrow-down" alt="Arrow down to indicate the important textarea"></h3><div class="d-flex align-items-center flex-column"><div class="w-100" style="position: relative;"><div class="counting-chars"><span id="counting-chars">0</span> / <span id="max-length-chars">1000000</span></div><textarea name="input" id="input" class="text-lowercase" cols="30" rows="7" maxlength="1000000" placeholder="Type your text here to convert to lowercase in real time..."></textarea></div></div><div class="row mb-3"><div class="col-12 mt-1"><div class="flex"><div class="div-btn mr-2" onclick="copyToClipboard('input')"> <i class="fa fa-copy"> <span>Copy to clipboard</span></i></div><div id="check" class="none"></div></div></div></div><hr><div class="more-notes"><h2>How Does this Lower Case Conversion Tool Work?</h2><p>The text area automatically converts all the words to lowercase as you type text or paste text directly into it. Basically the input text area has a CSS class with the property <code>{ text-transform: lowercase; }</code>, that make this HTML element always in lowercase mode.</p><p> After getting the text converted to lowercase, click the button below to the text area to copy it to the clipboard.</p><p> Try our most complete <strong><a href="https://imediacto.com/tools/text-tools/case-converter">case converter online tool</a></strong> that allows you to perform various conversion types in a single tool.</p><h2>What are Lowercase Letters?</h2><p>Lowercase letters are used to write names of things or objects. They are called "common nouns" and are therefore written in lowercase letters. In writing most letters are lower case. By convention in most programming languages, lowercase letters are always used for variable names.</p><p>These are the english alphabet lowercase letters:<br /><code>{ a b c d e f g h i j k l m n o p q r s t u v w x y z }</code></p></div><div class="notes"><div class="image"></div><div class="message"><p> Send me your feedback about this <strong>lowercase converter tool</strong> and let me know if this application works as you need it. If you need any improvement for this online tool, send me a message in the comments section.</p><p> You can learn about how this online tool works or contribute improving the Lowercase Converter by programming some new feature or fixing bugs. For that, go to Github on <a href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/005-lowercase-converter" target="_blank">Github >> Lowercase Converter</a> and make a pull request. This will be great!</p></div></div></div> <script>window.onload=function(){wordCount('input',1000000);}</script></p>
<p>The post <a href="https://imediacto.com/tools/text-tools/lowercase-converter/">Lowercase Converter</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/text-tools/lowercase-converter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Case Converter Online</title>
		<link>https://imediacto.com/tools/text-tools/case-converter/</link>
					<comments>https://imediacto.com/tools/text-tools/case-converter/#comments</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Tue, 05 May 2020 02:09:05 +0000</pubDate>
				<category><![CDATA[Text Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=124</guid>

					<description><![CDATA[<p>Case Converter Online is a Text Tool to change case letters. You can convert to uppercase, lowercase, sentence case, capital letters and invert text case.</p>
<p>The post <a href="https://imediacto.com/tools/text-tools/case-converter/">Case Converter Online</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot"><h2>Case Converter Online Tool</h2><p> <strong>Case Converter Online</strong> is a text tool to <strong>change letter case</strong> from a text. Using this tool will help you the following text conversions: convert to <strong>uppercase letter</strong>, <strong>lowercase letter</strong>, <strong>sentence case</strong>, <strong>capital letter</strong> and <strong>invert text case</strong>.</p><h3 class="mb-0">Put a text to convert case<img loading="lazy" decoding="async" src="https://imediacto.com/wp-content/uploads/2020/05/arrow-down.svg" width="30" height="30" class="arrow-down" alt="Arrow down to indicate the important textarea"></h3><div class="d-flex align-items-center flex-column"><div class="w-100" style="position: relative;"><div class="counting-chars"><span id="counting-chars">0</span> / <span id="max-length-chars">10000</span></div><textarea name="input" id="input" cols="30" rows="7" maxlength="10000" placeholder="Insert text here to convert case"></textarea></div><div class="buttons"><div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="radio-lowercase" name="case-option" class="custom-control-input" onclick="applyCase('lowercase');"> <label class="custom-control-label label-case" for="radio-lowercase">lowercase</label></div><div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="radio-uppercase" name="case-option" class="custom-control-input" onclick="applyCase('uppercase');"> <label class="custom-control-label label-case" for="radio-uppercase">UPPERCASE</label></div><div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="radio-capitalize" name="case-option" class="custom-control-input" onclick="applyCase('capitalize');"> <label class="custom-control-label label-case" for="radio-capitalize">Capitalize</label></div><div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="radio-sentence" name="case-option" class="custom-control-input" onclick="applyCase('sentence');"> <label class="custom-control-label label-case" for="radio-sentence">Sentence case</label></div><div class="custom-control custom-radio custom-control-inline"> <input type="radio" id="radio-invert" name="case-option" class="custom-control-input" onclick="applyCase('invert');"> <label class="custom-control-label label-case" for="radio-invert">invert Case</label></div></div></div><div class="row mb-3"><div class="col-12 d-flex align-items-center flex-column mt-3"><div class="flex"><div class="div-btn mr-2" onclick="copyToClipboard('input')"> <i class="fa fa-copy"> <span>Copy to clipboard</span></i></div><div id="check" class="none"></div></div></div></div><div class="more-notes">

<h2>WHAT IS TEXT/LETTER CASE?</h2>
<p>Letter case (or text case) is the distinction between uppercase and lowercase letters. Uppercase letters are also known as large letters, capital letters, upper case, capitals, caps and majuscule (more formal). Similarly lowercase letters are known as small letters, lower case or minuscule (more formal). Systems that distinguish between uppercase and lowercase letters have two parallel sets of letters, making it possible to match each letter with its respective pair. Each variant pair of the same letter have the same name and pronunciation and are treated identically when sorting in alphabetical order.</p>

<p>In the children's learning process, for example, they begin to learn to recognize the symbols of each of the uppercase vowels, to later learn the version of the lowercase vowels (or vice versa), and then continue to learn the uppercase consonant letters to later learn and associate them with the lowercase consonant versions.</p>

<p>In programming, in general, upper and lower case letters are considered as different symbols, that is, the string "a" is different from the string "A". For these letters to be considered the same symbol, it is necessary to enable the "case insensitive" mode. Thus, if we perform the comparison "a" == "A", with case insensitive enabled, the result will be true.</p>

<p>In orthography, lowercase and lowercase letters are generally applied in a mixed way in a text, and their use is prescribed by the grammatical conventions of each language. Capital letters are reserved for special purposes, such as the letters of a given name or acronyms.</p>

<h3>Letter Case Usage Contexts</h3>
<p>There are several contexts where it is agreed to use only one type of case or to use it in a specific format. The following are some practical cases.</p>

<h4>Use of text cases in programming</h4>
<p>In programming languages ​​like C, C ++, Java, JavaScript, PHP, by convention, lowercase letters are always used for variable names and uppercase letters for constant names. For these two letter case types, when it is necessary to write the name of a variable or constant with two words, the "camel case" format is used, which means to unite (concatenate the words removing the spaces) the two words, to start lowercase the first word and transform the first letter of the second word to uppercase, for example: myVariable, letterCase, upperCase, camelCase. In the case of a variable with three or more words, it would follow the same logic: myLetterCase, textCaseConverter. The union of constants with two or more words, in turn, is done in the snake case (snake_case) format, where spaces are replaced by the underscore symbol: LETTER_CASE, TEXT_CASE_CONVERTER.</p>

<p>There are other situations in programming where other types of conventions are applied. Class names in Java are written in the upper camel case format, also known as "Pascal Case", where the camel case style is applied, but the first letter of the variable starts with a capital letter, for example: LetterCase, TextCaseConverter. Package names in Java are all written in lowercase: lettercasepackage, textcaseconverter.</p>

<h4>Use of letter cases in mathematics</h4>
<p>In mathematics, uppercase letters are used to indicate sets and lowercase letters represent members of sets. Lower case letters also represent names of functions and variables, like the f(x) function.</p>

<h4>Use of letter cases in texts and chats on the web</h4>
<p>In informal writing among friends on the internet, when a sentence is written in all caps, it gives the feeling that the person who wrote it is shouting. When using only one or two words in uppercase, in the middle of a text, this can indicate emphasis</p>.

<h2>Letter Case Conversion Functions</h2><p>In this case converter tool you'll find these following <a href="https://imediacto.com/blog/list-of-letter-case-types-in-programming">letter case type</a> functions:</p><h3 class="case-name">Lowercase converter</h3><p class="lead"> <strong><a href="https://imediacto.com/tools/text-tools/lowercase-converter/">Lowercase converter</a></strong> is a function that converts the letters of a text to <strong>lowercase letters</strong>. You can convert from <strong>uppercase to lowercase</strong> or from any other text case types. When letter is already in lowercase, it will remain in that format.<br /> <span class="ex">Example:</span> "i like programming in lowercase letters".</p><hr><h3 class="case-name">Uppercase converter</h3><p class="lead"> <strong><a href="https://imediacto.com/tools/text-tools/uppercase-converter/">Uppercase converter</a></strong> converts the letters of a text <strong>to uppercase</strong>, also known as ALL CAPS format case. You can convert from <strong>lowercase to uppercase</strong> or from any other text case types. When letter is already capitalized, it will remain in that format.<br> <span class="ex">Example:</span> "YOU ARE VIEWING UPPERCASE LETTERS".</p><hr><h3 class="case-name">Capitalize - Capital letter converter</h3><p class="lead"> In the capitalize function, for each word, it make the first letter capitalized and keeps the remaining letters of the word lowercase.<br /> <span class="ex">Example:</span> "This Is A Good Capitalized Phrase".</p><hr><h3 class="case-name">Sentence case converter</h3><p class="lead"> The <strong>sentence case converter</strong> is a function that capitalizes the first letter of each sentence in the text and keeps or converts the remaining letters of all words in the sentence to lowercase letters. Each sentence separation is based on the following symbols: dot (.), exclamation (!), interrogation (?) and ellipsis (...).<br /><span class="ex">Example:</span> "Hi! I'm mary and i like programming in javascript language. And you?".</p><hr><h3 class="case-name">Case inverter</h3><p class="lead"> The case inverter reverses the case of each letter of the text. When the algorithm finds a lowercase letter it converts to uppercase, and when it finds a lowercase letter it converts to lowercase.<br /><span class="ex">Example:</span> for the text "Change case of tExt IS so funnY!", the result will be "cHANGE CASE OF TeXT is SO FUNNy!".</p></div><div class="notes"><div class="image"></div><div class="message"><p> Send me your feedback about this <strong>text case converter</strong> and let me know if you have some specific need, then I can implement this new feature and improve this online tool. Also, let me know if you have some need about other different <strong>text tool</strong> or <strong>coding tool set</strong>.</p><p> You can learn about how this online tool works or contribute improving the Case Converter by programming some new feature or fixing bugs. For that, go to Github on <a href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/004-case-converter" target="_blank">Github >> Case Converter</a> and make a pull request. This will be great!</p></div></div></div>
        <script>
            // Custom Code by Dante
            // ----------------------------------------------

            function isLetter(s) {
                return s.match("^[a-zA-Z()]+$");
            }

            // By lov2dev.com --------------
            function titleCase(str) {
                return str.replace(/\w\S/i, function (t) {
                    return t.toUpperCase();
                });
            }

            function sentenceCase(str) {
                return str.replace(/[a-z]/i, function (letter) {
                    return letter.toUpperCase();
                });
            }

            // by lov2dev.com
            function invertCase(str) {
                var output = "";

                for (var i = 0; i < str.length; i++) {
                    var ch = str[i];

                    if (ch === ch.toUpperCase()) {
                        output += ch.toLowerCase();
                    } else {
                        output += ch.toUpperCase();
                    }
                }

                return output;
            }

            function textToLowercase() {
                jQuery("#input").val(jQuery("#input").val().toLowerCase());
            }

            function textToUpperCase() {
                jQuery("#input").val(jQuery("#input").val().toUpperCase());
            }

            function applyCase(textCase) {
                if (textCase == "lowercase") {
                    textToLowercase();
                } else if (textCase == "uppercase") {
                    textToUpperCase();
                } else if (textCase == "capitalize") {
                    textToLowercase();
                    let inputText = jQuery("#input");
                    let lines = inputText.val().split("\n");

                    inputText.val('')
                    lines.forEach((line) => {
                        let words = line.split(' ');
                        let wordsCapitalized = [];
                        words.forEach((word) => {
                            word = word.toLowerCase();
                            word = word.charAt(0).toUpperCase() + word.slice(1);
                            wordsCapitalized.push(word);
                        });
                        inputText.val(inputText.val() + wordsCapitalized.join(" ") + '\n');
                        words = [];
                    });
                } else if (textCase == "sentence") {
                    textToLowercase();
                    let inputText = jQuery("#input").val();
                    let sentences = inputText.match(/[^\.!\?]+[\.!\?]+["']?|\s*$|[^\r\n]+/g);

                    let sentencesCapitalized = [];
                    sentences.forEach((sentence) => {
                        sentence = sentenceCase(sentence);
                        sentencesCapitalized.push(sentence);
                    });
                    jQuery("#input").val(sentencesCapitalized.join(""));
                    sentences = [];
                } else if (textCase == "invert") {
                    jQuery("#input").val(invertCase(jQuery("#input").val()));
                }
            }
            window.onload = function () {
                wordCount('input', 1000000);
            }
</script></p>
<p>The post <a href="https://imediacto.com/tools/text-tools/case-converter/">Case Converter Online</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/text-tools/case-converter/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>CSV to JSON Converter</title>
		<link>https://imediacto.com/tools/text-tools/csv-to-json-converter/</link>
					<comments>https://imediacto.com/tools/text-tools/csv-to-json-converter/#comments</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Sun, 15 Mar 2020 05:34:39 +0000</pubDate>
				<category><![CDATA[Text Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=28</guid>

					<description><![CDATA[<p>Easily convert your CSV file to JSON with this Online Tool. You can chose a "file.csv" or put directly the text in CSV format (separated by commas).</p>
<p>The post <a href="https://imediacto.com/tools/text-tools/csv-to-json-converter/">CSV to JSON Converter</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot"><h2>Free Online CSV to JSON Converter</h2><p> <strong>CSV to JSON Converter</strong> is a free online tool that converts a given text in CSV format to JSON format. You can chose a "file.csv", "file.txt" with a text structured in CSV format, or put directly the text in CSV format (separated by commas) in the first input text area. You can ignore some fields as needed.</p><h3>Select your CSV file or type in the first box area</h3><div class="custom-file"> <input type="file" class="custom-file-input" id="file" onchange="changeFileNameBoxOnInput(event)" accept=".csv,text/plain"> <label id="holder" class="input-drag-drop" for="file"><div id="file-name" class="file-name text-truncate">Select CSV file or drag and drop here...</div><div class="text-browse"><i class="fa fa-search"></i> <span class="hidden-680-down">Browse</span></div> </label></div><div class="display-flex-row display-flex-col-980-down"><div class="textarea"><textarea class="mb-2" name="area-csv" id="area-csv" cols="30" rows="12" placeholder="Type here your text in comma separated format"></textarea><button class="btn btn-success mb-2" onclick="stringCSVtoJSON();" aria-label="Button to convert CSV to JSON"> <i class="fa fa-chevron-right"></i> Convert to JSON </button><div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="filtering" onchange="toggleFieldsToIgnore(event)" /> <label class="custom-control-label" for="filtering">I want to ignore some fields</label><div id="fields-to-exclude"></div></div></div><div class="icon-apply"> <i class="fa fa-chevron-right" onclick="stringCSVtoJSON()" aria-label="Icon button to convert CSV to JSON" title="Button to convert CSV to JSON"></i> <i class="fa fa-close" onclick="clearAreas()" aria-label="Icon button to clear data" title="Button to clear data"></i></div><div class="textarea"><textarea class="mb-2" name="output" id="output" cols="30" rows="12"></textarea><div class="flex"><div class="div-btn mr-1" onclick="downloadJSON('json')" title="Download as JSON" aria-label="Button to download the output JSON"> <i class="fa fa-download"> <span>JSON</span></i></div><div class="div-btn mr-1" onclick="downloadJSON('txt')" title="Download as TXT" aria-label="Button to download the output JSON"> <i class="fa fa-download"> <span>TXT</span></i></div><div class="flex"><div class="div-btn mr-2" onclick="copyToClipboard()" title="Copy output to clipboard" area-label="Button to copy the JSON to clipboard"> <i class="fa fa-copy"> <span class="hide-on-xs">Copy to clipboard</span></i></div><div id="check" class="none" style="width: 18px; height: 18px; background-size: contain; margin-bottom: 4px;"></div></div></div></div></div><hr><h2>Convert CSV to JSON Excluding Fields</h2><p>After you select or type your CSV in the first text area, you can choose some fields to ignore, so these fields will don't appear in the output JSON format. For that, mark the checkbox "I want to ignore some fields" below of the apply button. This function can be very useful when you have a CSV with many fields and many records, and you need to ignore some fields.</p><h2>What is CSV format file?</h2><p>The CSV (comma-separated values) is a text file delimited by lines where each line is delimited by commas. Usually, the first line of the CSV is the header for the data of the remaining lines.</p><p>CSV format can be read by plain text editors, as it is plain text, in fact. Programs like LibreOffice Calc and Microsoft Office Excel read this format, organizing them between columns and rows.</p><h2>What is JSON format file?</h2><p><a href="https://www.json.org/json-en.html" target="_blank">JSON (JavaScript Object Notation)</a> is a compact text format used for simple and fast data exchange between systems, where its main purpose is the use of key-value pairs.</p><p>Therefore, CSV and JSON are widely used <a href="https://imediacto.com/blog/xml-csv-json-data-formats/">data formats</a> and we constantly need to <strong>convert CSV to JSON</strong> or convert from JSON to CSV.</p><div class="notes"><div class="image"></div><div class="message"><p> Give me your feedback about the <strong>CSV to JSON Converter</strong> and let me know if you have some specific need or if you found some error in this tool, then I can implement this new feature to you and improve or fix this <strong>text tool</strong>. Also, let me know if you have some need about other different <strong>JSON tool converter</strong> or <strong>coding tool set</strong>.</p><p> You can learn about how this online tool works or contribute improving the <strong>CSV to JSON Converter</strong> by programming some new feature or fixing bugs. For that, go to Github on <a href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/003-csv-to-json-converter" target="_blank">Github &gt;&gt; CSV to JSON Converter</a> and make a pull request. This will be great!</p></div></div><hr></div>
<script>
    let fileNameBox = document.getElementById('file-name');
    let areaCSV = document.getElementById('area-csv');
    let areaJSON = document.getElementById('output');
    let csv = '';
    let fileType = '';
    let fileExtension = '';
    let inputMessageDefault = 'Select CSV file or drag and drop here...';

    // --------------------------------------------------------
    // Main functions
    // --------------------------------------------------------

    // Drag and Drop actions
    let holder = document.getElementById('holder');
    holder.ondragover = function () {
        this.classList.add('input-hover');
        this.classList.remove('input-error');
        this.classList.remove('input-drop');
        return false;
    };
    // holder.ondragend = function () { this.classList.remove('hover-input'); return false; };
    holder.ondragleave = function () { this.classList.remove('input-hover'); return false; };
    holder.ondrop = function (e) {
        this.classList.remove('input-error');
        this.classList.add('input-drop');
        e.preventDefault();
        readfiles(e.dataTransfer.files);
    }

    // Read the file uploaded through Drag and Drop
    function readfiles(files) {

        fileType = files[0].type;
        fileNameBox.innerText = files[0].name;

        // Exit process if the file type is not CSV
        if (!isfileTypeAndAllowed(fileType)) {
            return false;
        }

        reader = new FileReader();
        reader.onload = function (event) {
            csv = event.target.result;
            areaCSV.value = csv;
        }
        reader.readAsText(files[0]);
    }

    // Fisrt Step :: Read csv is the CSV file with headers
    function procressInputFile() {

        let inputFile = document.getElementById('file');

        if ('files' in inputFile && inputFile.files.length > 0) {
            let file = inputFile.files[0];
            fileNameBox = file.name;
            fileType = file.type;
            fileExtension = fileNameBox.substring(fileNameBox.lastIndexOf('.'), fileNameBox.length)

            // Exit process if the file type is not allowed (CSV and TXT)
            if (!isfileTypeAndAllowed(fileType)) {
                return false;
            }

            let fileReader = new FileReader();
            fileReader.onload = function (event) {
                csv = event.target.result;
                areaCSV.value = csv;
            }
            fileReader.readAsText(file);
        } else {
            console.log('You need select a CSV file!');
        }
    }

    // Last Step :: Convert the CSV string to JSON and print on textarea
    function stringCSVtoJSON() {

        csv = areaCSV.value.trim();
        let lines = csv.split("\n");
        let result = [];
        let headers = lines[0].split(",");

        // Elements to exclude
        const ignore = document.querySelectorAll('#fields-to-exclude .custom-control-input:checked')
        const headersToIgnore = [...ignore].map(el => {
            // return el.id.substring(el.id.indexOf('-') + 1, el.id.length) //use this if field ID is like field-0, field-1, ...
            return parseInt(el.id)
        })

        const isFiltering = document.getElementById('filtering').checked ? true : false

        for (let i = 1; i < lines.length; i++) {

            let obj = {};
            let currentline = lines[i].split(",");

            for (let j = 0; j < headers.length; j++) {
                try {
                    if (isFiltering) {
                        if (!headersToIgnore.includes(j)) {
                            if (!Number(currentline[j].trim())) {
                                // Case value is string
                                obj[headers[j].trim()] = currentline[j].trim();
                            } else {
                                // Case value is a number
                                let n = Number(currentline[j].trim());
                                obj[headers[j].trim()] = n;
                            }
                        }
                    } else {
                        if (!Number(currentline[j].trim())) {
                            // Case value is string
                            obj[headers[j].trim()] = currentline[j].trim();
                        } else {
                            // Case value is a number
                            let n = Number(currentline[j].trim());
                            obj[headers[j].trim()] = n;
                        }
                    }
                } catch (error) {
                    console.log('Has inconsistent data... ', error);
                }
            }
            result.push(obj);
        }

        //return result; //JavaScript object
        let json = JSON.stringify(result, undefined, 4); //JSON
        areaJSON.value = json;
    }

    function toggleFieldsToIgnore(event) {
        event.preventDefault();
        if (event.target.checked) {

            // const fields = document.getElementById('area-csv').value.split('\n').shift(); // get first line
            const textarea = document.getElementById('area-csv');
            if (textarea.value == '') {
                return false
            }

            textarea.focus({ preventScroll: true })
            textarea.setSelectionRange(0, textarea.value.indexOf('\n'))
            textarea.blur()
            // const fieldsSelected = window.getSelection().toString() // not working on Mozilla Firefox
            const fieldsSelected = textarea.value.substring(textarea.selectionStart, textarea.selectionEnd); // more browser compatible way
            const fields = fieldsSelected.split(',').map(field => field.trim())
            
            // Generate a checkbox for each CSV field
            fields.forEach((campo, index) => {

                const divElem = document.createElement('div');
                divElem.setAttribute('class', 'element-to-exclude custom-control custom-checkbox');

                const iputElem = document.createElement("input");
                iputElem.setAttribute("type", "checkbox");
                iputElem.setAttribute("id", index);
                iputElem.setAttribute("class", "custom-control-input");
                divElem.appendChild(iputElem);

                const labelElem = document.createElement("label");
                labelElem.setAttribute("for", index);
                labelElem.setAttribute("class", "custom-control-label");
                labelElem.innerText = campo;
                divElem.appendChild(labelElem);

                // Add the new checkbox element to group div
                document.getElementById('fields-to-exclude').appendChild(divElem);
            });
        } else {
            document.getElementById('fields-to-exclude').innerHTML = ''
        }
    }

    // --------------------------------------------------------
    // Auxiliar functions
    // --------------------------------------------------------

    // Write the name of file on input box
    function changeFileNameBoxOnInput(event) {
        let partsPath = event.target.value.split('\\');
        fileNameBox.innerText = partsPath[partsPath.length - 1];
        procressInputFile();
    }

    function clearAreas() {
        areaCSV.value = '';
        areaJSON.value = '';
        csv = '';
        document.getElementById('file-name').innerText = inputMessageDefault;
    }

    function isfileTypeAndAllowed(fileType) {

        console.log('filetype: ', fileType)

        // Exit process if the file type is not CSV
        const allowedFileTypes = ['text/csv', 'text/comma-separated-values', 'application/vnd.ms-excel', 'text/plain']; // 'text/comma-separated-values'

        if (!(allowedFileTypes.includes(fileType))) { /* && fileExtension != '.csv' */
            holder.classList.add('input-error');
            fileNameBox.innerText = 'This file type is not allowed!';
            setTimeout(() => {
                fileNameBox.innerText = inputMessageDefault;
                holder.classList = 'input-drag-drop'; // erase other classes
            }, 5000);
            return false; // exit process
        }
        return true;
    }

    // Download function
    /*function download(filename, text) {

        let element = document.createElement('a');

        element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
        element.setAttribute('download', filename);
        element.style.display = 'none';
        document.body.appendChild(element);
        element.click();
        document.body.removeChild(element);
    }*/

    // Start file download in TXT or JSON
    function downloadJSON(extension) {

        // Generate download of hello.txt file with some content
        let data = document.getElementById("output").value;
        let filename = "csv-to-json-imediacto." + extension;

        fileNameBox = document.getElementById('file-name');

        if (fileNameBox.innerText != inputMessageDefault) {

            let lastIndexDot = fileNameBox.innerText.lastIndexOf('.');
            if (lastIndexDot != -1) {
                filename = fileNameBox.innerText.substring(0, lastIndexDot) + '-json.' + extension;
            } else {
                // Case file without dot extension
                filename = fileNameBox.innerText + '.' + extension;
            }
        }

        download(filename, data);
    }
</script></p>
<p>The post <a href="https://imediacto.com/tools/text-tools/csv-to-json-converter/">CSV to JSON Converter</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/text-tools/csv-to-json-converter/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>HTML List Generator ~ Convert Text to HTML</title>
		<link>https://imediacto.com/tools/html-tools/html-list-generator-convert-text-to-html/</link>
					<comments>https://imediacto.com/tools/html-tools/html-list-generator-convert-text-to-html/#comments</comments>
		
		<dc:creator><![CDATA[Dante]]></dc:creator>
		<pubDate>Sun, 03 Nov 2019 02:55:18 +0000</pubDate>
				<category><![CDATA[HTML Tools]]></category>
		<category><![CDATA[Text Tools]]></category>
		<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://imediacto.com/?p=26</guid>

					<description><![CDATA[<p>HTML List Generator is an Online Tool that converts and transforms plain text to ordered or unordered HTML List and others Text List Formats.</p>
<p>The post <a href="https://imediacto.com/tools/html-tools/html-list-generator-convert-text-to-html/">HTML List Generator ~ Convert Text to HTML</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="boot"><h2>Converting Text to HTML List</h2><p>The <strong>HTML List Generator</strong> is an <strong>HTML converter online tool</strong> that <strong>converts text to html list</strong> and others <strong>text list formats</strong>. Using this tool will help you convert some text list and transform it to a unordered or ordered HTML list, as well these text list formats: text separated by lines, spaces, commas, semicolons and some other custom symbols you want to use.</p><div class="row"><div class="col-12"><h3>Input (insert plain text)</h3><textarea id="input" class="mb-2" rows="7" placeholder="Insert a plain text here to convert it to a HTML list."></textarea></div></div><div class="row"><div class="col-md-5 col-sm-12 mb-3"><h3>Input text options</h3><div class="custom-control custom-radio"> <input type="radio" id="radio1" name="text-origin" value="lines" class="custom-control-input" checked> <label class="custom-control-label" for="radio1">From lines</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio2" name="text-origin" value="commas" class="custom-control-input"> <label class="custom-control-label" for="radio2">Separeted by commas</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio3" name="text-origin" value="semicolons" class="custom-control-input"> <label class="custom-control-label" for="radio3">Separeted by semicolons</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio4" name="text-origin" value="spaces" class="custom-control-input"> <label class="custom-control-label" for="radio4">Separeted by space</label></div></div><div class="col-md-7 col-sm-12"><h3>Output List type options</h3><div class="custom-control custom-radio"> <input type="radio" id="radio5" name="list-type" value="ul" class="custom-control-input" onclick="toggleCustomInput(false)" checked> <label class="custom-control-label" for="radio5">Unordered list</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio6" name="list-type" value="ol" class="custom-control-input" onclick="toggleCustomInput(false)"> <label class="custom-control-label" for="radio6">Ordered list</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio7" name="list-type" value="lines" class="custom-control-input" onclick="toggleCustomInput(false)"> <label class="custom-control-label" for="radio7">Lines</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio8" name="list-type" value="commas" class="custom-control-input" onclick="toggleCustomInput(false)"> <label class="custom-control-label" for="radio8">Commas</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio9" name="list-type" value="semicolons" class="custom-control-input" onclick="toggleCustomInput(false)"> <label class="custom-control-label" for="radio9">Semicolons</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio10" name="list-type" value="spaces" class="custom-control-input" onclick="toggleCustomInput(false)"> <label class="custom-control-label" for="radio10">Spaces</label></div><div class="custom-control custom-radio"> <input type="radio" id="radio11" name="list-type" value="custom" class="custom-control-input" onclick="toggleCustomInput(true)"> <label class="custom-control-label" for="radio11">Custom</label></div><div class="custom-control" style="width: 50%;"> <input type="text" id="custom" placeholder="Insert a custom symbol" class="none custom-symbol"></div><h3>Output extra options</h3><div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="wrap-in-quotes" onchange="toggleQuotes()"> <label class="custom-control-label" for="wrap-in-quotes">Wrap the words in quotes</label><div id="quote-options" class="none"><div class="custom-control custom-radio"> <input type="radio" id="doble-quotes" name="quotes" value="doble" class="custom-control-input"> <label class="custom-control-label" for="doble-quotes">Doble quotes</label></div><div class="custom-control custom-radio"> <input type="radio" id="single-quotes" name="quotes" value="single" class="custom-control-input"> <label class="custom-control-label" for="single-quotes">Single quotes</label></div></div> <span class="help-text">Works only with lines, commas, semicolons and spaces</span></div></div></div><div class="row mb-3"><div class="col-12"> <button class="btn btn-success" onclick="convertToList()" area-label="Button to convert text to HTML list"><i class="fa fa-chevron-right"></i> Convert list</button></div></div><div class="row mb-3"><div class="col-12"><h3>Output (HTML list or other list formats)</h3><textarea class="mb-2" id="output" rows="7"></textarea><div class="flex"><div class="div-btn mr-1" onclick="copyToClipboard()" title="Copy output to clipboard" area-label="Copy the output to clipboard"> <i class="fa fa-copy"> <span>Copy to clipboard</span></i></div><div id="check" class="none"></div></div></div></div><hr><div class="more-notes"><p> Notes: <br> The output text list options are generated with a space after the separator symbol. You can use the custom option to generate that output only with symbols without spaces.</p><p> Example: type comma (,) on custom option and will be generated a list like (banana,apple,blueberry).</p><hr>
<p>After generating your HTML list you may need to compare two lists to see what matches, what’s unique, and what’s different between both lists. You can try our free tool List <a href="https://imediacto.com/tools/list-tools/compare-two-lists/">Comparison List Tool</a> now!</p>

</div><div class="notes"><div class="image"></div><div class="message"><p> Send me your feedback about the <strong>HTML List Generator</strong> and let me know if you have some specific need, then I can implement this new feature to you and improve this <strong>html tool</strong>. Also, let me know if you have some need about other different <strong>text tool / HTML tool</strong> or <strong>coding tool set</strong>. <br> You can learn about how this online tool works or contribute improving the HTML List Generator by programming some new feature or fixing bugs. For that, go to Github on <a href="https://github.com/dantovsky/Imediacto-Online-Tool-Set/tree/master/tools/002-html-list-generator" target="_blank">Github >> HTML List Generator</a> and make a pull request. This will be great!</p></div></div></div><script>
            function toggleCustomInput(showCustomInput) {
                if (showCustomInput) {
                    document.getElementById('custom').classList.remove('none');
                } else {
                    document.getElementById('custom').classList.add('none');
                }
            }
    
            function toggleQuotes() {
                console.log('clicou no chekbox');
                
                let quoteOption = document.getElementById('wrap-in-quotes');
                if (quoteOption.checked) {
                    document.getElementById('quote-options').classList.remove('none');
                    document.getElementById('doble-quotes').checked = true;
                } else {
                    document.getElementById('quote-options').classList.add('none');
                }
            }
    
            function convertToList() {
                let input = document.getElementById('input').value;
                let textOrigin = document.querySelector('input[name="text-origin"]:checked').value;
                let listType = document.querySelector('input[name="list-type"]:checked').value;
                let listTypeCustom = ''
                let quotes = ''
    
                // Input sepearator
                let separator = '';
                if (textOrigin == 'lines') {
                    separator = '\n';
                } else if (textOrigin == 'commas') {
                    separator = ',';
                } else if (textOrigin == 'semicolons') {
                    separator = ';';
                } else if (textOrigin == 'spaces') {
                    separator = ' ';
                }
    
                // Get quote type
                if (document.getElementById('wrap-in-quotes').checked) {
                    checkboxQuotes = document.querySelector('input[name="quotes"]:checked').value;
                    if (checkboxQuotes == 'doble')
                    {
                        quotes = '"'
                    } else {
                        quotes = '\''
                    }
                }
    
                let lines = input.split(separator);
                let output = '';
    
                if (listType == 'ul' || listType == 'ol') {
                    output = `<${listType}>\n`;
                    lines.forEach(e => {
                        output += `    <li>${e.trim()}</li>\n`
                    });
                    output += `</${listType}>`
                } else {
    
                    if (listType == 'commas') {
                        listType = ','
                    } else if (listType == 'semicolons') {
                        listType = ';'
                    } else if (listType == 'custom') {
                        listTypeCustom = document.getElementById('custom').value;
                    }
    
                    lines.forEach(term => {
    
                        // Apply the quotes if exists
                        term = quotes + term.trim() + quotes;
    
                        if (listType == 'lines') {
                            output += `${term}\n`;
                        } else if (listType == 'spaces') {
                            output += `${term} `;
                        } else if (listType == 'custom') {
                            output += term + listTypeCustom;
                        } else if (listType == ',' || listType == ';') {
                            output += `${term}${listType} `;
                        }
                    });
                }
    
                // Remove the last symbol
                if (listType == 'lines' || listType == 'spaces') {
                    output = output.substring(0, output.length - 1);
                } else if (listType == ',' || listType == ';') {
                    output = output.substring(0, output.length - 2);
                } else if (listType == 'custom') {
                    output = output.substring(0, output.length - listTypeCustom.length);
                }
                document.getElementById('output').value = output;
                copyToClipboard();
            }
            function copyToClipboard() {
                let copyText = document.getElementById("output");
                copyText.select();
                copyText.setSelectionRange(0, 99999);
                document.execCommand("copy");
    
                let check = document.getElementById("check");
                check.classList.remove('none');
                setTimeout(() => {
                    check.classList.add('none');
                }, 3000);
            }
        </script></p>
<p>The post <a href="https://imediacto.com/tools/html-tools/html-list-generator-convert-text-to-html/">HTML List Generator ~ Convert Text to HTML</a> appeared first on <a href="https://imediacto.com">Free Online Tools - Imediacto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://imediacto.com/tools/html-tools/html-list-generator-convert-text-to-html/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
