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…
	
		Reference in New Issue
	
	Block a user