📄 selector.c
字号:
s++; state = ATTR; } else errexit("Expected letter instead of \"%c\" after \"[\"",*s); break; case ATTR: /* Inside attrib name */ if (isnmchar(*s)) {strappc(&sel->attribs->name, *s); s++;} else state = AFTER_ATTR; break; case AFTER_ATTR: if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = AFTER_ATTR; state = SLASH;} else if (*s == ']') {s++; sel->attribs->op = Exists; state = AFTER_TYPE;} else if (*s == '~') {s++; sel->attribs->op = Includes; state = EQ;} else if (*s == '|') {s++; sel->attribs->op = LangMatch; state=EQ;} else if (*s == '^') {s++; sel->attribs->op = StartsWith; state=EQ;} else if (*s == '$') {s++; sel->attribs->op = EndsWidth; state=EQ;} else if (*s == '*') {s++; sel->attribs->op = Contains; state = EQ;} else {sel->attribs->op = Equals; state = EQ;} break; case EQ: /* Expect '=' */ if (*s != '=') errexit("Expected '=' instead of \"%c\"", *s); else {s++; sel->attribs->value = newstring(""); state=START_VALUE;} break; case START_VALUE: /* After '=' */ if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = START_VALUE; state=SLASH;} else if (*s == '"') {s++; state = DSTRING;} else if (*s == '\'') {s++; state = SSTRING;} else if (!isnmstart(*s)) errexit("Syntax error at \"%c\"\n", *s); else {strappc(&sel->attribs->value, *s); s++; state = VALUE;} break; case DSTRING: /* Inside "..." */ if (*s == '"') {s++; state = AFTER_VALUE;} else {strappc(&sel->attribs->value, *s); s++;} break; case SSTRING: /* Inside "..." */ if (*s == '\'') {s++; state = AFTER_VALUE;} else {strappc(&sel->attribs->value, *s); s++;} break; case VALUE: /* Inside keyword */ if (isnmchar(*s)) {strappc(&sel->attribs->value, *s); s++;} else state = AFTER_VALUE; break; case AFTER_VALUE: /* Expect ']' */ if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = AFTER_VALUE; state = HASH;} else if (*s == ']') {s++; state = AFTER_TYPE;} else errexit("Expected ']' instead of \"%c\"\n", *s); break; case START_PSEUDO: /* After ':' */ new(pseudosel); pseudosel->next = sel->pseudos; sel->pseudos = pseudosel; if (*s == 'r' || *s == 'R') {s++; state = PSEUDO_R;} else if (*s == 'n' || *s == 'N') {s++; state = PSEUDO_N;} else if (*s == 'f' || *s == 'F') {s++; state = PSEUDO_F;} else if (*s == 'l' || *s == 'L') {s++; state = PSEUDO_L;} else errexit("Unknown pseudo-class \":%c...\"\n", *s); break; case PSEUDO_R: /* After ':r' */ if (*s == 'o' || *s == 'O') {s++; state = PSEUDO_RO;} else errexit("Unknown pseudo-class \":r%c...\"\n", *s); break; case PSEUDO_RO: /* After ':ro' */ if (*s == 'o' || *s == 'O') {s++; state = PSEUDO_ROO;} else errexit("Unknown pseudo-class \":ro%c...\"\n", *s); break; case PSEUDO_ROO: /* After ':roo' */ if (*s == 't' || *s == 'T') {sel->pseudos->type = Root; s++; state=PSEUDO_ROOT;} else errexit("Unknown pseudo-class \":roo%c...\"\n", *s); break; case PSEUDO_ROOT: /* After ':root' */ if (!isnmchar(*s)) state = AFTER_TYPE; else errexit("Unknown pseudo-class \":root%c...\"\n", *s); break; case PSEUDO_N: /* After ':n' */ if (*s == 't' || *s == 'T') {s++; state = PSEUDO_NT;} else errexit("Unknown pseudo-class \":n%c...\"\n", *s); break; case PSEUDO_NT: /* After ':nt' */ if (*s == 'h' || *s == 'H') {s++; state = PSEUDO_NTH;} else errexit("Unknown pseudo-class \":nt%c...\"\n", *s); break; case PSEUDO_NTH: /* After ':nth' */ if (*s == '-') {s++; state = PSEUDO_NTH_;} else errexit("Unknown pseudo-class \":nth%c...\"\n", *s); break; case PSEUDO_NTH_: /* After ':nth_' */ if (*s == 'c' || *s == 'C') {s++; state = PSEUDO_NTH_C;} else if (*s == 'o' || *s == 'O') {s++; state = PSEUDO_NTH_O;} else errexit("Unknown pseudo-class \":nth_%c...\"\n", *s); break; case PSEUDO_NTH_C: /* After ':nth_c' */ if (*s == 'h' || *s == 'H') {s++; state = PSEUDO_NTH_CH;} else errexit("Unknown pseudo-class \":nth_c%c...\"\n", *s); break; case PSEUDO_NTH_CH: /* After ':nth_ch' */ if (*s == 'i' || *s == 'I') {s++; state = PSEUDO_NTH_CHI;} else errexit("Unknown pseudo-class \":nth_ch%c...\"\n", *s); break; case PSEUDO_NTH_CHI: /* After ':nth_chi' */ if (*s == 'l' || *s == 'L') {s++; state = PSEUDO_NTH_CHIL;} else errexit("Unknown pseudo-class \":nth_chi%c...\"\n", *s); break; case PSEUDO_NTH_CHIL: /* After ':nth_chil' */ if (*s == 'd' || *s == 'D') {s++; state = PSEUDO_NTH_CHILD;} else errexit("Unknown pseudo-class \":nth_chil%c...\"\n", *s); break; case PSEUDO_NTH_CHILD: /* After ':nth_child' */ if (*s == '(') {s++; state = PSEUDO_NTH_CHILD_;} else errexit("Unknown pseudo-class \":nth_child%c...\"\n", *s); break; case PSEUDO_NTH_CHILD_: /* After ':nth_child(' */ sel->pseudos->type = NthChild; sel->pseudos->a = 0; if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = state; state = SLASH;} else if (isdigit(*s)) {saved_state = AFTER_MUL; state = START_INT;} else if (*s == '-') {s++; state = PSEUDO__MINUS;} else if (*s == 'o' || *s == 'O') {s++; state = PSEUDO__O;} else if (*s == 'e' || *s == 'E') {s++; state = PSEUDO__E;} else if (*s == 'n' || *s == 'N') {s++; sel->pseudos->a = 1; state=AFTER_MUL_N;} else errexit("Expected digit after \"nth-child(\" at \"%c\"\n",*s); break; case PSEUDO__MINUS: /* After :nth-...(- */ if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = state; state = SLASH;} else if (isdigit(*s)) {saved_state = PSEUDO__NEG; state=START_INT;} else if (*s == 'n' || *s == 'N') {s++; sel->pseudos->a = -1; state=AFTER_MUL_N;} else errexit("Expected digit after \":nth-...(\" at \"%c\"\n",*s); break; case PSEUDO__NEG: /* After -<num> */ sel->pseudos->b = -sel->pseudos->b; state = AFTER_MUL; break; case PSEUDO__O: /* After :nth...(o */ if (*s == 'd' || *s == 'D') {s++; state = PSEUDO__OD;} else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s); break; case PSEUDO__OD: /* After :nth...(od */ if (*s == 'd' || *s == 'D') {s++; state = PSEUDO__ODD;} else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s); break; case PSEUDO__ODD: /* After :nth-...(odd */ if (!isnmchar(*s)) {state = END_PSEUDO; sel->pseudos->a = 2; sel->pseudos->b = 1;} else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s); break; case PSEUDO__E: /* After :nth-...(e */ if (*s == 'v' || *s == 'V') {s++; state = PSEUDO__EV;} else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s); break; case PSEUDO__EV: /* After :nth-...(ev */ if (*s == 'e' || *s == 'E') {s++; state = PSEUDO__EVE;} else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s); break; case PSEUDO__EVE: /* After :nth-...(eve */ if (*s == 'n' || *s == 'N') {s++; state = PSEUDO__EVEN;} else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s); break; case PSEUDO__EVEN: /* Afte :nth-...(even */ if (!isnmchar(*s)) {state = END_PSEUDO; sel->pseudos->a = 2; sel->pseudos->b = 0;} else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s); break; case START_INT: /* At a digit */ n = *s - '0'; s++; state = INT; break; case INT: /* Inside number */ if (isdigit(*s)) {n = 10 * n + *s - '0'; s++;} else {sel->pseudos->b = n; state = saved_state;} break; case AFTER_MUL: /* After "...(<num>" */ if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = state; state = SLASH;} else if (*s == ')') {s++; state = AFTER_TYPE;} else if (*s == 'n' || *s == 'N') {s++; state = AFTER_MUL_N; sel->pseudos->a = sel->pseudos->b; sel->pseudos->b = 0;} else errexit("Illegal character \"%c\"\n", *s); break; case AFTER_MUL_N: /* After "...(<num>N" */ if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = state; state = SLASH;} else if (*s == '+') {s++; state = AFTER_MUL_NPLUS;} else if (*s == ')') {s++; state = AFTER_TYPE;} else errexit("Illegal character \"%c\"\n", *s); break; case AFTER_MUL_NPLUS: /* After "...(<num>N+" */ if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = state; state = SLASH;} else if (isdigit(*s)) {saved_state = END_PSEUDO; state=START_INT;} else errexit("Expected a digit after \"+\" at \"%c\"\n", *s); break; case END_PSEUDO: /* Expect ')' */ if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = END_PSEUDO; state = SLASH;} else if (*s == ')') {s++; state = AFTER_TYPE;} else errexit("Illegal character \"%c\"\n", *s); break; case PSEUDO_NTH_O: /* After ':nth_o' */ if (*s == 'f' || *s == 'F') {s++; state = PSEUDO_NTH_OF;} else errexit("Unknown pseudo-class \":nth_o%c...\"", *s); break; case PSEUDO_NTH_OF: /* After ':nth_of' */ if (*s == '-') {s++; state = PSEUDO_NTH_OF_;} else errexit("Unknown pseudo-class \":nth_of%c...\"", *s); break; case PSEUDO_NTH_OF_: /* After ':nth_of_' */ if (*s == 't' || *s == 'T') {s++; state = PSEUDO_NTH_OF_T;} else errexit("Unknown pseudo-class \":nth_of_%c...\"", *s); break; case PSEUDO_NTH_OF_T: /* After ':nth_of_t' */ if (*s == 'y' || *s == 'Y') {s++; state = PSEUDO_NTH_OF_TY;} else errexit("Unknown pseudo-class \":nth_of_t%c...\"", *s); break; case PSEUDO_NTH_OF_TY: /* After ':nth_of_ty' */ if (*s == 'p' || *s == 'P') {s++; state = PSEUDO_NTH_OF_TYP;} else errexit("Unknown pseudo-class \":nth_of_ty%c...\"", *s); break; case PSEUDO_NTH_OF_TYP: /* After ':nth_of_typ' */ if (*s == 'e' || *s == 'E') {s++; state = PSEUDO_NTH_OF_TYPE;} else errexit("Unknown pseudo-class \":nth_of_typ%c...\"", *s); break; case PSEUDO_NTH_OF_TYPE: /* After :nth_of_type */ if (*s == '(') {s++; state = PSEUDO_NTH_OF_TYPE_;} else errexit("Unknown pseudo-class \":nth_of_type%c...\"", *s); break; case PSEUDO_NTH_OF_TYPE_: /* After :nth_of_type( */ sel->pseudos->type = NthChild; sel->pseudos->a = 0; if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = state; state = SLASH;} else if (isdigit(*s)) {saved_state = AFTER_MUL; state = START_INT;} else if (*s == '-') {s++; state = PSEUDO__MINUS;} else if (*s == 'o' || *s=='O') {s++; state = PSEUDO__O;} else if (*s == 'e' || *s=='E') {s++; state = PSEUDO__E;} else if (*s == 'n' || *s=='N') {s++; sel->pseudos->a=1;state=AFTER_MUL_N;} else errexit("Expected digit after \":nth-of_type(\" at \"%c\"\n",*s); break; case PSEUDO_F: /* After ':f' */ if (*s == 'i' || *s == 'I') {s++; state = PSEUDO_FI;} else errexit("Unknown pseudo-class \":f%c...\"", *s); break; case PSEUDO_FI: /* After ':fi' */ if (*s == 'r' || *s == 'R') {s++; state = PSEUDO_FIR;} else errexit("Unknown pseudo-class \":fi%c...\"", *s); break; case PSEUDO_FIR: /* After ':fir' */ if (*s == 's' || *s == 'S') {s++; state = PSEUDO_FIRS;} else errexit("Unknown pseudo-class \":fir%c...\"", *s); break; case PSEUDO_FIRS: /* After ':firs' */ if (*s == 't' || *s == 'T') {s++; state = PSEUDO_FIRST;} else errexit("Unknown pseudo-class \":firs%c...\"", *s); break; case PSEUDO_FIRST: /* After ':first' */ if (*s == '-') {s++; state = PSEUDO_FIRST_;} else errexit("Unknown pseudo-class \":first%c...\"", *s); break; case PSEUDO_FIRST_: /* After ':first_' */ if (*s == 'c' || *s == 'C') {s++; state = PSEUDO_FIRST_C;} else if (*s == 'o') {s++; state = PSEUDO_FIRST_O;} else errexit("Unknown pseudo-class \":first_%c...\"", *s); break; case PSEUDO_FIRST_C: /* After ':first_c' */ if (*s == 'h' || *s == 'H') {s++; state = PSEUDO_FIRST_CH;} else errexit("Unknown pseudo-class \":first_c%c...\"", *s); break; case PSEUDO_FIRST_CH: /* After ':first_ch' */ if (*s == 'i' || *s == 'I') {s++; state = PSEUDO_FIRST_CHI;} else errexit("Unknown pseudo-class \":first_ch%c...\"", *s); break; case PSEUDO_FIRST_CHI: /* After ':first_chi' */ if (*s == 'l' || *s == 'L') {s++; state = PSEUDO_FIRST_CHIL;} else errexit("Unknown pseudo-class \":first_chi%c...\"", *s); break; case PSEUDO_FIRST_CHIL: /* After ':first_chil' */ if (*s != 'd' && *s != 'D') errexit("Unknown pseudo-class \":first_chil%c...\"", *s); else {sel->pseudos->type = FirstChild; s++; state = PSEUDO_FIRST_CHILD;} break; case PSEUDO_FIRST_CHILD: /* After ':first_child' */ if (!isnmchar(*s)) {state = AFTER_TYPE;} else errexit("Unknown pseudo-class \":first_child%c...\"", *s); break; case PSEUDO_FIRST_O: /* After ':first_o' */ if (*s == 'f' || *s == 'F') {s++; state = PSEUDO_FIRST_OF;} else errexit("Unknown pseudo-class \":first_o%c...\"", *s); case PSEUDO_FIRST_OF: /* After ':first_of' */ if (*s == '-') {s++; state = PSEUDO_FIRST_OF_;} else errexit("Unknown pseudo-class \":first_of%c...\"", *s); case PSEUDO_FIRST_OF_: /* After ':first_of_' */ if (*s == 't' || *s == 'T') {s++; state = PSEUDO_FIRST_OF_T;} else errexit("Unknown pseudo-class \":first_of_%c...\"", *s); case PSEUDO_FIRST_OF_T: /* After ':first_of_t' */ if (*s == 'y' || *s == 'Y') {s++; state = PSEUDO_FIRST_OF_TY;} else errexit("Unknown pseudo-class \":first_of_t%c...\"", *s); case PSEUDO_FIRST_OF_TY: /* After ':first_of_ty' */ if (*s == 'p' || *s == 'P') {s++; state = PSEUDO_FIRST_OF_TYP;} else errexit("Unknown pseudo-class \":first_of_ty%c...\"", *s); case PSEUDO_FIRST_OF_TYP: /* After ':first_of_typ' */ if (*s == 'e' || *s == 'E') {s++; state = PSEUDO_FIRST_OF_TYPE;} else errexit("Unknown pseudo-class \":first_of_typ%c...\"", *s); case PSEUDO_FIRST_OF_TYPE: /* After ':first_of_type' */ if (!isnmchar(*s)) {sel->pseudos->type = FirstOfType; state =AFTER_TYPE;} else errexit("Unknown pseudo-class \":first_of_type%c...\"", *s); case PSEUDO_L: /* After ':l' */ if (*s == 'a' || *s == 'A') {s++; state = PSEUDO_LA;} else errexit("Unknown pseudo-class \":l%c...\"", *s); break; case PSEUDO_LA: /* After ':la' */ if (*s == 'n' || *s == 'N') {s++; state = PSEUDO_LAN;} else errexit("Unknown pseudo-class \":la%c...\"", *s); break; case PSEUDO_LAN: /* After ':lan' */ if (*s == 'g' || *s == 'G') {s++; state = PSEUDO_LANG;} else errexit("Unknown pseudo-class \":lan%c...\"", *s); break; case PSEUDO_LANG: /* After ':lang' */ if (*s == '(') {s++; state = PSEUDO_LANG_;} else errexit("Unknown pseudo-class \":lang%c...\"", *s); break; case PSEUDO_LANG_: /* After ':lang(' */ if (isspace(*s)) s++; else if (*s == '/') {s++; saved_state = PSEUDO_LANG_; state = SLASH;} else if (!isnmstart(*s)) errexit("Incorrect \":lang(\" at \"%c\"\n", *s); else { sel->pseudos->type = Lang; sel->pseudos->s = newstring(""); strappc(&sel->pseudos->s, *s); s++; state = LANG; } break; case LANG: /* Inside a language code */ if (isnmchar(*s)) {strappc(&sel->pseudos->s, *s); s++;} else state = END_PSEUDO; break; default: assert(!"Cannot happen"); } } return sel;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -