⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 farsi.c

📁 VIM文本编辑器
💻 C
📖 第 1 页 / 共 3 页
字号:
	case HE_J:  return _HE_J;
	case XE:    return _XE;
	case SIN:   return _SIN;
	case SHIN:  return _SHIN;
	case SAD:   return _SAD;
	case ZAD:   return _ZAD;

	case AYN:
	case AYN_:
	case _AYN:  return _AYN_;

	case GHAYN:
	case GHAYN_:
	case _GHAYN_:	return _GHAYN_;

	case FE:    return _FE;
	case GHAF:  return _GHAF;
	case KAF:   return _KAF;
	case GAF:   return _GAF;
	case LAM:   return _LAM;
	case MIM:   return _MIM;
	case NOON:  return _NOON;

	case _HE:
	case F_HE:	return _HE_;

	case YE:
	case YE_:	return _YE;

	case IE_:
	case IE:	return _IE;

	case TEE:	return TEE_;

	case YEE:
	case YEE_:	return _YEE;
    }
    return c;
}

/*
** Can a given Farsi character join via its left edj.
*/
    static int
canF_Ljoin(c)
    int	c;
{
    switch (c)
    {
	case _BE:
	case BE:
	case PE:
	case _PE:
	case TE:
	case _TE:
	case SE:
	case _SE:
	case JIM:
	case _JIM:
	case CHE:
	case _CHE:
	case HE_J:
	case _HE_J:
	case XE:
	case _XE:
	case SIN:
	case _SIN:
	case SHIN:
	case _SHIN:
	case SAD:
	case _SAD:
	case ZAD:
	case _ZAD:
	case _TA:
	case _ZA:
	case AYN:
	case _AYN:
	case _AYN_:
	case AYN_:
	case GHAYN:
	case GHAYN_:
	case _GHAYN_:
	case _GHAYN:
	case FE:
	case _FE:
	case GHAF:
	case _GHAF:
	case _KAF_H:
	case KAF:
	case _KAF:
	case GAF:
	case _GAF:
	case LAM:
	case _LAM:
	case MIM:
	case _MIM:
	case NOON:
	case _NOON:
	case IE:
	case _IE:
	case IE_:
	case YE:
	case _YE:
	case YE_:
	case YEE:
	case _YEE:
	case YEE_:
	case F_HE:
	case _HE:
	case _HE_:
	    return TRUE;
    }
    return FALSE;
}

/*
** Can a given Farsi character join via its right edj.
*/
    static int
canF_Rjoin(c)
    int	    c;
{
    switch (c)
    {
	case ALEF:
	case ALEF_:
	case ALEF_U_H:
	case ALEF_U_H_:
	case DAL:
	case ZAL:
	case RE:
	case JE:
	case ZE:
	case TEE:
	case TEE_:
	case WAW:
	case WAW_H:
	    return TRUE;
    }

    return canF_Ljoin(c);

}

/*
** is a given Farsi character a terminating type.
*/
    static int
F_isterm(c)
    int	    c;
{
    switch (c)
    {
	case ALEF:
	case ALEF_:
	case ALEF_U_H:
	case ALEF_U_H_:
	case DAL:
	case ZAL:
	case RE:
	case JE:
	case ZE:
	case WAW:
	case WAW_H:
	case TEE:
	case TEE_:
	    return TRUE;
    }

    return FALSE;
}

/*
** Convert the given Farsi character into a ending type .
*/
    static int
toF_ending(c)
    int	    c;
{

    switch (c)
    {
	case _BE:
		return BE;
	case _PE:
		return PE;
	case _TE:
		return TE;
	case _SE:
		return SE;
	case _JIM:
		return JIM;
	case _CHE:
		return CHE;
	case _HE_J:
		return HE_J;
	case _XE:
		return XE;
	case _SIN:
		return SIN;
	case _SHIN:
		return SHIN;
	case _SAD:
		return SAD;
	case _ZAD:
		return ZAD;
	case _AYN:
		return AYN;
	case _AYN_:
		return AYN_;
	case _GHAYN:
		return GHAYN;
	case _GHAYN_:
		return GHAYN_;
	case _FE:
		return FE;
	case _GHAF:
		return GHAF;
	case _KAF_H:
	case _KAF:
		return KAF;
	case _GAF:
		return GAF;
	case _LAM:
		return LAM;
	case _MIM:
		return MIM;
	case _NOON:
		return NOON;
	case _YE:
		return YE_;
	case YE_:
		return YE;
	case _YEE:
		return YEE_;
	case YEE_:
		return YEE;
	case TEE:
		return TEE_;
	case _IE:
		return IE_;
	case IE_:
		return IE;
	case _HE:
	case _HE_:
		return F_HE;
    }
    return c;
}

/*
** Convert the Farsi 3342 standard into Farsi VIM.
*/
    void
conv_to_pvim()
{
char_u *ptr;
int lnum, llen, i;

    for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
    {
	ptr = ml_get((linenr_t)lnum);

	llen = STRLEN(ptr);

	for ( i = 0; i < llen-1; i++)
	{
	    if (canF_Ljoin(ptr[i]) && canF_Rjoin(ptr[i+1]))
	    {
		ptr[i] = toF_leading(ptr[i]);
		++i;

		while(canF_Rjoin(ptr[i]) && (i < llen))
		{
		    ptr[i] = toF_Rjoin(ptr[i]);
		    if (F_isterm(ptr[i]) || !F_isalpha(ptr[i]))
			break;
		    ++i;
		}
		if (!F_isalpha(ptr[i]) || !canF_Rjoin(ptr[i]))
		    ptr[i-1] = toF_ending(ptr[i-1]);
	    }
	    else
		ptr[i] = toF_TyA(ptr[i]);
	}
    }

    /*
    ** Following lines contains Farsi encoded character.
    */

    do_cmdline((char_u *)"%s/\202\231/\232/g", NULL, NULL, DOCMD_NOWAIT | DOCMD_VERBOSE);
    do_cmdline((char_u *)"%s/\201\231/\370\334/g", NULL, NULL, DOCMD_NOWAIT | DOCMD_VERBOSE);

    update_screen(CLEAR);
    MSG_ATTR(farsi_text_1, hl_attr(HLF_S));
}

/*
** Convert the Farsi VIM into Farsi 3342 standad.
*/
    void
conv_to_pstd()
{
char_u *ptr;
int lnum, llen, i;

    /*
    ** Following line contains Farsi encoded character.
    */

    do_cmdline((char_u *)"%s/\232/\202\231/g", NULL, NULL, DOCMD_NOWAIT | DOCMD_VERBOSE);

    for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
    {
	ptr = ml_get((linenr_t)lnum);

	llen = STRLEN(ptr);

	for ( i = 0; i < llen; i++)
	{
	    ptr[i] = toF_TyA(ptr[i]);

	}
    }

    update_screen(CLEAR);
    MSG_ATTR(farsi_text_2, hl_attr(HLF_S));
}

/*
 * left-right swap the characters in buf[len].
 */
    static void
lrswapbuf(buf, len)
    char_u	*buf;
    int		len;
{
    char_u	*s, *e;
    int		c;

    s = buf;
    e = buf + len - 1;

    while (e > s)
    {
	c = *s;
	*s = *e;
	*e = c;
	++s;
	--e;
    }
}

/*
 * swap all the characters in reverse direction
 */
    char_u *
lrswap(ibuf)
    char_u	*ibuf;
{
    if (ibuf != NULL && *ibuf != NUL)
	lrswapbuf(ibuf, (int)STRLEN(ibuf));
    return ibuf;
}

/*
 * swap all the Farsi characters in reverse direction
 */
    char_u *
lrFswap(cmdbuf, len)
    char_u	*cmdbuf;
    int		len;
{
    int		i, cnt;

    if (cmdbuf == NULL)
	return cmdbuf;

    if (len == 0 && (len = STRLEN(cmdbuf)) == 0)
	return cmdbuf;

    for (i = 0; i < len; i++)
    {
	for (cnt = 0; i + cnt < len
			&& (F_isalpha(cmdbuf[i + cnt])
			    || F_isdigit(cmdbuf[i + cnt])
			    || cmdbuf[i + cnt] == ' '); ++cnt)
	    ;

	lrswapbuf(cmdbuf + i, cnt);
	i += cnt;
    }
    return cmdbuf;
}

/*
 * Reverse the characters in the seach path and substitude section accordingly
 */
    char_u *
lrF_sub(ibuf)
    char_u	*ibuf;
{
    char_u	*p, *ep;
    int		i, cnt;

    p = ibuf;

    /* Find the boundry of the search path */
    while ((p = vim_strchr(++p, '/')) && p[-1] == '\\')
	;

    if (p == NULL)
	return ibuf;

    /* Reverse the Farsi characters in the search path. */
    lrFswap(ibuf, (int)(p-ibuf));

    /* Now find the boundry of the substitute section */
    if ((ep = (char_u *)strrchr((char *)++p, '/')))
	cnt = ep - p;
    else
	cnt = STRLEN(p);

    /* Reverse the characters in the substitute section and take care of '\' */
    for (i = 0; i < cnt-1; i++)
	if (p[i] == '\\')
	{
	    p[i] = p[i+1] ;
	    p[++i] = '\\';
	}

    lrswapbuf(p, cnt);

    return ibuf;
}

/*
 * Map Farsi keyboard when in cmd_fkmap mode.
 */
    int
cmdl_fkmap(c)
    int c;
{
int	tempc;

    switch (c)
    {
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':
	case '`':
	case ' ':
	case '.':
	case '!':
	case '"':
	case '$':
	case '%':
	case '^':
	case '&':
	case '/':
	case '(':
	case ')':
	case '=':
	case '\\':
	case '?':
	case '+':
	case '-':
	case '_':
	case '*':
	case ':':
	case '#':
	case '~':
	case '@':
	case '<':
	case '>':
	case '{':
	case '}':
	case '|':
	case 'B':
	case 'E':
	case 'F':
	case 'H':
	case 'I':
	case 'K':
	case 'L':
	case 'M':
	case 'O':
	case 'P':
	case 'Q':
	case 'R':
	case 'T':
	case 'U':
	case 'W':
	case 'Y':
	case  NL:
	case  TAB:

	       switch ((tempc = cmd_gchar(AT_CURSOR)))
	       {
	    case _BE:
	    case _PE:
	    case _TE:
	    case _SE:
	    case _JIM:
	    case _CHE:
	    case _HE_J:
	    case _XE:
	    case _SIN:
	    case _SHIN:
	    case _SAD:
	    case _ZAD:
	    case _AYN:
	    case _GHAYN:
	    case _FE:
	    case _GHAF:
	    case _KAF:
	    case _GAF:
	    case _LAM:
	    case _MIM:
	    case _NOON:
	    case _HE:
	    case _HE_:
			cmd_pchar(toF_TyA(tempc), AT_CURSOR);
		break;
	    case _AYN_:
			cmd_pchar(AYN_, AT_CURSOR);
		break;
	    case _GHAYN_:
			cmd_pchar(GHAYN_, AT_CURSOR);
		break;
	    case _IE:
		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
			    cmd_pchar(IE_, AT_CURSOR);
		else
			    cmd_pchar(IE, AT_CURSOR);
		break;
	    case _YEE:
		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
			    cmd_pchar(YEE_, AT_CURSOR);
			else
			    cmd_pchar(YEE, AT_CURSOR);
		break;
	    case _YE:
		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
			    cmd_pchar(YE_, AT_CURSOR);
			else
			    cmd_pchar(YE, AT_CURSOR);
	    }

	    switch (c)
	    {
		case '0':   return FARSI_0;
		case '1':   return FARSI_1;
		case '2':   return FARSI_2;
		case '3':   return FARSI_3;
		case '4':   return FARSI_4;
		case '5':   return FARSI_5;
		case '6':   return FARSI_6;
		case '7':   return FARSI_7;
		case '8':   return FARSI_8;
		case '9':   return FARSI_9;
		case 'B':   return F_PSP;
		case 'E':   return JAZR_N;
		case 'F':   return ALEF_D_H;
		case 'H':   return ALEF_A;
		case 'I':   return TASH;
		case 'K':   return F_LQUOT;
		case 'L':   return F_RQUOT;
		case 'M':   return HAMZE;
		case 'O':   return '[';
		case 'P':   return ']';
		case 'Q':   return OO;
		case 'R':   return MAD_N;
		case 'T':   return OW;
		case 'U':   return MAD;
		case 'W':   return OW_OW;
		case 'Y':   return JAZR;
		case '`':   return F_PCN;
		case '!':   return F_EXCL;
		case '@':   return F_COMMA;
		case '#':   return F_DIVIDE;
		case '$':   return F_CURRENCY;
		case '%':   return F_PERCENT;
		case '^':   return F_MUL;
		case '&':   return F_BCOMMA;
		case '*':   return F_STAR;
		case '(':   return F_LPARENT;
		case ')':   return F_RPARENT;
		case '-':   return F_MINUS;
		case '_':   return F_UNDERLINE;
		case '=':   return F_EQUALS;
		case '+':   return F_PLUS;
		case '\\':  return F_BSLASH;
		case '|':   return F_PIPE;
		case ':':   return F_DCOLON;
		case '"':   return F_SEMICOLON;
		case '.':   return F_PERIOD;
		case '/':   return F_SLASH;
		case '<':   return F_LESS;
		case '>':   return F_GREATER;
		case '?':   return F_QUESTION;
		case ' ':   return F_BLANK;
	    }

	    break;

	case 'a':   return _SHIN;
	case 'A':   return WAW_H;
	case 'b':   return ZAL;
	case 'c':   return ZE;
	case 'C':   return JE;
	case 'd':   return _YE;
	case 'D':   return _YEE;
	case 'e':   return _SE;
	case 'f':   return _BE;
	case 'g':   return _LAM;
	case 'G':
		    if (cmd_gchar(AT_CURSOR) == _LAM )
		{
		    cmd_pchar(LAM, AT_CURSOR);
			    return ALEF_U_H;
		}

		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
			return ALEF_U_H_;
		else
			return ALEF_U_H;
	case 'h':
		    if (cmd_gchar(AT_CURSOR) == _LAM )
		{
		    cmd_pchar(LA, AT_CURSOR);
		    redrawcmdline();
		    return K_IGNORE;
		}

		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
			return ALEF_;
		else
			return ALEF;
	case 'i':
		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
			return _HE_;
		else
			return _HE;
	case 'j':   return _TE;
	case 'J':
		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
			return TEE_;
		else
			return TEE;
	case 'k':   return _NOON;
	case 'l':   return _MIM;
	case 'm':   return _PE;
	case 'n':
	case 'N':   return DAL;
	case 'o':   return _XE;
	case 'p':   return _HE_J;
	case 'q':   return _ZAD;
	case 'r':   return _GHAF;
	case 's':   return _SIN;
	case 'S':   return _IE;
	case 't':   return _FE;
	case 'u':
		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
			return _AYN_;
		else
			return _AYN;
	case 'v':
	case 'V':   return RE;
	case 'w':   return _SAD;
	case 'x':
	case 'X':   return _TA;
	case 'y':
		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
			return _GHAYN_;
		else
			return _GHAYN;
	case 'z':
	case 'Z':   return _ZA;
	case ';':   return _KAF;
	case '\'':  return _GAF;
	case ',':   return WAW;
	case '[':   return _JIM;
	case ']':   return _CHE;
	}

	return c;
}

/*
 * F_isalpha returns TRUE if 'c' is a Farsi alphabet
 */
    int
F_isalpha(c)
    int	c;
{
    return (( c >= TEE_ && c <= _YE) ||
	( c >= ALEF_A && c <= YE) ||
	( c >= _IE && c <= YE_));
}

/*
 * F_isdigit returns TRUE if 'c' is a Farsi digit
 */
    int
F_isdigit(c)
    int	    c;
{
    return (( c >= FARSI_0 && c <= FARSI_9 ));
}

/*
 * F_ischar returns TRUE if 'c' is a Farsi character.
 */
    int
F_ischar(c)
    int	    c;
{
    return (( c >= TEE_ && c <= YE_));
}

    void
farsi_fkey(c)
    int	    c;
{
    if (c == K_F8)
    {
	if (p_altkeymap)
	{
	    if (curwin->w_p_pers & W_R_L)
	    {
		p_fkmap=0;
		do_cmdline((char_u *)"set norl", NULL, NULL, DOCMD_NOWAIT);
		MSG("");
	    }
	    else
	    {
		p_fkmap=1;
		do_cmdline((char_u *)"set rl", NULL, NULL, DOCMD_NOWAIT);
		MSG("");
	    }

	    curwin->w_p_pers = curwin->w_p_pers ^ W_R_L;
	}
    }

    if (c == K_F9)
    {
	if (p_altkeymap && curwin->w_p_rl)
	{
	    curwin->w_p_pers = curwin->w_p_pers ^ W_CONV;
	    if (curwin->w_p_pers & W_CONV)
		conv_to_pvim();
	    else
		conv_to_pstd();
	}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -