mirror of
				https://github.com/CorentinTh/it-tools.git
				synced 2025-11-04 02:47:00 -05:00 
			
		
		
		
	feat(tool): url encode/decode
This commit is contained in:
		
							parent
							
								
									034c686896
								
							
						
					
					
						commit
						afac5664c8
					
				@ -10,6 +10,7 @@ import { tool as bip39 } from './bip39-generator';
 | 
				
			|||||||
import { tool as dateTimeConverter } from './date-time-converter';
 | 
					import { tool as dateTimeConverter } from './date-time-converter';
 | 
				
			||||||
import { tool as gitMemo } from './git-memo';
 | 
					import { tool as gitMemo } from './git-memo';
 | 
				
			||||||
import { tool as baseConverter } from './integer-base-converter';
 | 
					import { tool as baseConverter } from './integer-base-converter';
 | 
				
			||||||
 | 
					import { tool as urlEncoder } from './url-encoder';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const toolsByCategory: ToolCategory[] = [
 | 
					export const toolsByCategory: ToolCategory[] = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -22,6 +23,11 @@ export const toolsByCategory: ToolCategory[] = [
 | 
				
			|||||||
    icon: LockOpen,
 | 
					    icon: LockOpen,
 | 
				
			||||||
    components: [dateTimeConverter, baseConverter, romanNumeralConverter],
 | 
					    components: [dateTimeConverter, baseConverter, romanNumeralConverter],
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: 'Web',
 | 
				
			||||||
 | 
					    icon: LockOpen,
 | 
				
			||||||
 | 
					    components: [urlEncoder],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    name: 'Development',
 | 
					    name: 'Development',
 | 
				
			||||||
    icon: LockOpen,
 | 
					    icon: LockOpen,
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								src/tools/url-encoder/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/tools/url-encoder/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					import { Link } from '@vicons/tabler';
 | 
				
			||||||
 | 
					import type { ITool } from '../Tool';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const tool: ITool = {
 | 
				
			||||||
 | 
					  name: 'Encode/decode url formatted strings',
 | 
				
			||||||
 | 
					  path: '/url-encoder',
 | 
				
			||||||
 | 
					  description: 'Encode to url-encoded format (also known as "percent-encoded") or decode from it.',
 | 
				
			||||||
 | 
					  keywords: ['url', 'encode', 'decode', 'percent', '%20', 'format'],
 | 
				
			||||||
 | 
					  component: () => import('./url-encoder.vue'),
 | 
				
			||||||
 | 
					  icon: Link,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										100
									
								
								src/tools/url-encoder/url-encoder.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/tools/url-encoder/url-encoder.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,100 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					    <n-space item-style="flex:1">
 | 
				
			||||||
 | 
					        <n-card title="Encode">
 | 
				
			||||||
 | 
					            <n-form-item label="Your string :" :feedback="encodedValidation.message"
 | 
				
			||||||
 | 
					                :validation-status="encodedValidation.status">
 | 
				
			||||||
 | 
					                <n-input v-model:value="encodeInput" type="textarea" placeholder="The string to encode"
 | 
				
			||||||
 | 
					                    :autosize="{ minRows: 3 }" />
 | 
				
			||||||
 | 
					            </n-form-item>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <n-form-item label="Your string encoded :">
 | 
				
			||||||
 | 
					                <n-input :value="encodeOutput" type="textarea" readonly placeholder="Your string encoded"
 | 
				
			||||||
 | 
					                    :autosize="{ minRows: 3 }" />
 | 
				
			||||||
 | 
					            </n-form-item>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <n-space justify="center">
 | 
				
			||||||
 | 
					                <n-button @click="copyEncoded" secondary>Copy</n-button>
 | 
				
			||||||
 | 
					            </n-space>
 | 
				
			||||||
 | 
					        </n-card>
 | 
				
			||||||
 | 
					        <n-card title="Encode">
 | 
				
			||||||
 | 
					            <n-form-item label="Your encode string :" :feedback="decodeValidation.message"
 | 
				
			||||||
 | 
					                :validation-status="decodeValidation.status">
 | 
				
			||||||
 | 
					                <n-input v-model:value="decodeInput" type="textarea" placeholder="The string to decode"
 | 
				
			||||||
 | 
					                    :autosize="{ minRows: 3 }" />
 | 
				
			||||||
 | 
					            </n-form-item>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <n-form-item label="Your string decoded :">
 | 
				
			||||||
 | 
					                <n-input :value="decodeOutput" type="textarea" readonly placeholder="Your string decoded"
 | 
				
			||||||
 | 
					                    :autosize="{ minRows: 3 }" />
 | 
				
			||||||
 | 
					            </n-form-item>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <n-space justify="center">
 | 
				
			||||||
 | 
					                <n-button @click="copyDecoded" secondary>Copy</n-button>
 | 
				
			||||||
 | 
					            </n-space>
 | 
				
			||||||
 | 
					        </n-card>
 | 
				
			||||||
 | 
					    </n-space>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import { useCopy } from '@/composable/copy';
 | 
				
			||||||
 | 
					import { useValidation } from '@/composable/validation';
 | 
				
			||||||
 | 
					import { computed, ref } from 'vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const encodeInput = ref('Hello world :)')
 | 
				
			||||||
 | 
					const encodeOutput = computed(() => {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        return encodeURIComponent(encodeInput.value)
 | 
				
			||||||
 | 
					    } catch (_) {
 | 
				
			||||||
 | 
					        return ''
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const encodedValidation = useValidation({
 | 
				
			||||||
 | 
					    source: encodeInput, rules: [{
 | 
				
			||||||
 | 
					        validator: (value) => {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                encodeURIComponent(value)
 | 
				
			||||||
 | 
					                return true
 | 
				
			||||||
 | 
					            } catch (_) {
 | 
				
			||||||
 | 
					                return false
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        message: 'Impossible to parse this string'
 | 
				
			||||||
 | 
					    }]
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const { copy: copyEncoded } = useCopy({ source: encodeOutput, text: 'Encoded string copied to the clipboard' })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const decodeInput = ref('Hello%20world%20%3A)')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const decodeOutput = computed(() => {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        return decodeURIComponent(decodeInput.value)
 | 
				
			||||||
 | 
					    } catch (_) {
 | 
				
			||||||
 | 
					        return ''
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const decodeValidation = useValidation({
 | 
				
			||||||
 | 
					    source: encodeInput, rules: [{
 | 
				
			||||||
 | 
					        validator: (value) => {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                decodeURIComponent(value)
 | 
				
			||||||
 | 
					                return true
 | 
				
			||||||
 | 
					            } catch (_) {
 | 
				
			||||||
 | 
					                return false
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        message: 'Impossible to parse this string'
 | 
				
			||||||
 | 
					    }]
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const { copy: copyDecoded } = useCopy({ source: decodeOutput, text: 'Decoded string copied to the clipboard' })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user