Skip to content

Instantly share code, notes, and snippets.

@pascalduez
Created June 27, 2014 21:36
Show Gist options
  • Save pascalduez/75b0bc1d1a3c55af274f to your computer and use it in GitHub Desktop.
Save pascalduez/75b0bc1d1a3c55af274f to your computer and use it in GitHub Desktop.
Generated by SassMeister.com.
// ----
// Sass (v3.3.8)
// Compass (v1.0.0.alpha.19)
// ----
// Return a charset string.
// --------
// @param [string] $charset
// --------
// @return [string]
@function charset(
$charset
) {
@return map-get((
numeric:
'0123456789',
alphabetic:
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
alphanumeric:
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
ascii:
'!"#$%&' + "'" +
'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
), $charset);
}
// Get char at `$index` in `$str`.
// --------
// @param [string] $str
// @param [number] $index
// --------
// @return [string]
@function char-at(
$str,
$index: 1
) {
@return str-slice($str, $index, $index);
}
// Get char code from `$str` at `$index` in range `$charset`.
// --------
// @param [string] $str
// @param [number] $index
// @param [string] $charset
// --------
// @return [number]
@function char-code-at(
$str,
$index: 1,
$charset: alphabetic
) {
$chars: charset($charset);
@return str-index($chars, char-at($str, $index));
}
// Get char at `$index` in range `$charset`.
// --------
// @param [number] $index
// @param [string] $charset
// --------
// @return [string]
@function from-char-code(
$index,
$charset: alphabetic
) {
$chars: charset($charset) or $charset;
@return char-at($chars, $index);
}
// Return a filtered string.
// --------
// @param [string] $str
// --------
// @return [string]
@function str-filter(
$str,
$charset: alphabetic
) {
$chars: charset($charset);
$result: '';
@for $i from 1 through str-length($str) {
$c: char-at($str, $i);
@if str-index($chars, $c) {
$result: $result + $c;
}
}
@return $result;
}
@function otp(
$message,
$key,
$op: 'encrypt'
) {
$key: str-filter(to-upper-case($key));
$result: '';
$j: 1;
@for $i from 1 through str-length($message) {
$c: char-code-at($message, $i);
$k: char-code-at($key, $j);
@if $c {
// Uppercase $c <= 26
// Lowercase $c > 26
$case: if($c > 26, 26, 0);
$padded: if($op == 'encrypt', ($c + $k - 2), ($c - $k));
$padded: (($padded - $case) % 26) + $case + 1;
$result: $result + from-char-code($padded);
$j: $j + 1;
}
@else {
// Non [A-Za-z] char.
$result: $result + char-at($message, $i);
}
}
@return $result;
}
tests {
/* eqnvz */
t: otp('Hello', 'xmckl');
t: otp('Eqnvz', 'xmckl', 'decrypt');
/* Hllwjg Eooyar */
t: otp('Berlin Amiens', 'ghulbtecgunz');
t: otp('Hllwjg Eooyar', 'ghulbtecgunz', 'decrypt');
/* Rltsyrg Blqldn */
t: otp('Gilbert Vernam', 'ldiruanghzydb');
t: otp('Rltsyrg Blqldn', 'ldiruanghzydb', 'decrypt');
/* Rviqx Lcdopi */
t: otp('Frank Miller', 'meidnzusdlr');
t: otp('Rviqx Lcdopi', 'meidnzusdlr', 'decrypt');
}
tests {
/* eqnvz */
t: "Eqnvz";
t: "Hello";
/* Hllwjg Eooyar */
t: "Hllwjg Eooyar";
t: "Berlin Amiens";
/* Rltsyrg Blqldn */
t: "Rltsyrg Blqldn";
t: "Gilbert Vernam";
/* Rviqx Lcdopi */
t: "Rviqx Lcdopi";
t: "Frank Miller";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment