--- /dev/null
+/* @flow */
+"use strict";
+
+const isStandardSyntaxValue = require("./isStandardSyntaxValue");
+const isVariable = require("./isVariable");
+const keywordSets = require("../reference/keywordSets");
+const postcssValueParser = require("postcss-value-parser");
+
+/**
+ * Get the list-style-type within a `list-style` shorthand property value.
+ */
+module.exports = function findListStyleType(
+ value /*: string*/
+) /*: Array<Object>*/ {
+ const listStyleTypes = [];
+
+ const valueNodes = postcssValueParser(value);
+
+ // Handle `inherit`, `initial` and etc
+ if (
+ valueNodes.nodes.length === 1 &&
+ keywordSets.listStyleTypeKeywords.has(
+ valueNodes.nodes[0].value.toLowerCase()
+ )
+ ) {
+ return [valueNodes.nodes[0]];
+ }
+
+ valueNodes.walk(valueNode => {
+ if (valueNode.type === "function") {
+ return false;
+ }
+ if (valueNode.type !== "word") {
+ return;
+ }
+
+ const valueLowerCase = valueNode.value.toLowerCase();
+
+ // Ignore non standard syntax
+ if (!isStandardSyntaxValue(valueLowerCase)) {
+ return;
+ }
+ // Ignore variables
+ if (isVariable(valueLowerCase)) {
+ return;
+ }
+ // Ignore keywords for other font parts
+ if (
+ keywordSets.listStylePositionKeywords.has(valueLowerCase) ||
+ keywordSets.listStyleImageKeywords.has(valueLowerCase)
+ ) {
+ return;
+ }
+
+ listStyleTypes.push(valueNode);
+ });
+
+ return listStyleTypes;
+};