User:PROXiCiDE/SkyIndent.lua
Jump to navigation
Jump to search
--
--
-- Sky Indent PROXiCiDE aka Taewon
-- Version 0.5
--
-- Allows you to beautify Papyrus source code
--
-- Steam: http://steamcommunity.com/id/PROXiCiDE
-- Nexus: http://skyrim.nexusmods.com/users/3018315
-- Bethesda: http://forums.bethsoft.com/user/425376-taewon/
--
--
-- Version History
-- 0.5 Support for SKSE 1.7.0, SkyUI 4.1
-- 0.4
-- Keywords for Functions and Events used to be generated from the Creation Kit WIKI
-- Functions and Events are now parsed from a collection of Papyrus source code
-- Alot eaiser to keep SkyIndent updated
--
-- Reason was because there are undocumented functions and shortcuts
-- Example GetRef() -> GetReference()
--
-- *.PSC
-- Skyrim default
-- SkyUI
-- SKSE
-- 0.3
-- Optimizations, supports SKSE Events / Functions
-- File size of SkyIndent.lua has been reduced significantly
-- 0.2b
-- Fixed array indentation
-- 0.2a
-- Tab spacing is the default if no option -s# passed in the command line arguments
-- 0.1a
-- Initial Release
--
--
local StrLen = string.len
local StrSub = string.sub
local StrByte = string.byte
local StrChar = string.char
local StrRep = string.rep
local StrFormat = string.format
local OsExit = os.exit
local function OsError(str)
print('Error: '..StrFormat(str))
os.execute("pause")
OsExit(1)
end
local program = nil
local codeTable01 = {}
local codeTable02 = {}
local function EraseTable(t)
for k in next,t do
t[k] = nil
end
end
local function StrIns(s, pos, insertStr)
return StrSub(s, 1, pos) .. insertStr .. StrSub(s, pos + 1)
end
local function StrDel(s, pos1, pos2)
return StrSub(s, 1, pos1 - 1) .. StrSub(s, pos2 + 1)
end
local Lexer = {}
local TokenData = {}
TokenData.AND = 1
TokenData.ASSIGNMENT = 2
TokenData.ASTERISK = 3
TokenData.CIRCUMFLEX = 4
TokenData.COLON = 5
TokenData.COMMA = 6
TokenData.COMMENT_LONG = 7
TokenData.COMMENT_SHORT = 8
TokenData.DOUBLEPERIOD = 9
TokenData.EQUALITY = 10
TokenData.GT = 11
TokenData.GTE = 12
TokenData.IDENTIFIER = 13
TokenData.KEYWORD = 14
TokenData.LEFTBRACKET = 15
TokenData.LEFTPAREN = 16
TokenData.LEFTWING = 17
TokenData.LINEBREAK = 18
TokenData.LT = 19
TokenData.LTE = 20
TokenData.MINUS = 21
TokenData.NOT = 22
TokenData.NE = 23
TokenData.NUMBER = 24
TokenData.OR = 25
TokenData.MODULO = 26
TokenData.PERIOD = 27
TokenData.PLUS = 28
TokenData.RIGHTBRACKET = 29
TokenData.RIGHTPAREN = 30
TokenData.RIGHTWING = 31
TokenData.SEMICOLON = 32
TokenData.SLASH = 33
TokenData.SPECIAL = 34
TokenData.STRING = 35
TokenData.TRIPLEPERIOD = 37
TokenData.UNKNOWN = 38
TokenData.VERTICAL = 39
TokenData.WHITESPACE = 40
-- ascii codes
local ByteData = {}
ByteData.LINEBREAK_UNIX = StrByte("\n")
ByteData.LINEBREAK_MAC = StrByte("\r")
ByteData.SINGLE_QUOTE = StrByte("'")
ByteData.DOUBLE_QUOTE = StrByte('"')
ByteData.NUM_0 = StrByte("0")
ByteData.NUM_9 = StrByte("9")
ByteData.PERIOD = StrByte(".")
ByteData.SPACE = StrByte(" ")
ByteData.TAB = StrByte("\t")
ByteData.E = StrByte("E")
ByteData.e = StrByte("e")
ByteData.MINUS = StrByte("-")
ByteData.EQUALS = StrByte("=")
ByteData.LEFTBRACKET = StrByte("[")
ByteData.RIGHTBRACKET = StrByte("]")
ByteData.BACKSLASH = StrByte("\\")
ByteData.COMMA = StrByte(",")
ByteData.SEMICOLON = StrByte(";")
ByteData.COLON = StrByte(":")
ByteData.LEFTPAREN = StrByte("(")
ByteData.RIGHTPAREN = StrByte(")")
ByteData.EXCLAMATIONMARK = StrByte("!")
ByteData.PLUS = StrByte("+")
ByteData.SLASH = StrByte("/")
ByteData.LEFTWING = StrByte("{")
ByteData.RIGHTWING = StrByte("}")
ByteData.CIRCUMFLEX = StrByte("^")
ByteData.ASTERISK = StrByte("*")
ByteData.LESSTHAN = StrByte("<")
ByteData.GREATERTHAN = StrByte(">")
ByteData.AND = StrByte("&")
ByteData.OR = StrByte("|")
ByteData.MODULO = StrByte("%")
local newline = {}
newline[ByteData.LINEBREAK_UNIX] = 1
newline[ByteData.LINEBREAK_MAC] = 1
local whitespaces = {}
whitespaces[ByteData.SPACE] = 1
whitespaces[ByteData.TAB] = 1
local SymbolData = {}
SymbolData[ByteData.PERIOD] = -1
SymbolData[ByteData.LESSTHAN] = -1
SymbolData[ByteData.GREATERTHAN] = -1
SymbolData[ByteData.LEFTBRACKET] = -1
SymbolData[ByteData.EQUALS] = -1
SymbolData[ByteData.MINUS] = -1
SymbolData[ByteData.SINGLE_QUOTE] = -1
SymbolData[ByteData.DOUBLE_QUOTE] = -1
SymbolData[ByteData.EXCLAMATIONMARK] = -1
SymbolData[ByteData.SEMICOLON] = -1
SymbolData[ByteData.RIGHTBRACKET] = TokenData.RIGHTBRACKET
SymbolData[ByteData.COMMA] = TokenData.COMMA
SymbolData[ByteData.COLON] = TokenData.COLON
SymbolData[ByteData.LEFTPAREN] = TokenData.LEFTPAREN
SymbolData[ByteData.RIGHTPAREN] = TokenData.RIGHTPAREN
SymbolData[ByteData.PLUS] = TokenData.PLUS
SymbolData[ByteData.SLASH] = TokenData.SLASH
SymbolData[ByteData.LEFTWING] = TokenData.LEFTWING
SymbolData[ByteData.RIGHTWING] = TokenData.RIGHTWING
SymbolData[ByteData.CIRCUMFLEX] = TokenData.CIRCUMFLEX
SymbolData[ByteData.ASTERISK] = TokenData.ASTERISK
SymbolData[ByteData.OR] = -1
SymbolData[ByteData.AND] = -1
SymbolData[ByteData.MODULO] = TokenData.MODULO
-- The following was generated from the Creation Kit wiki
-- http://www.creationkit.com/Keyword_Reference
local IndentIgnore = {0, 0}
local IndentLeft = {-1, 0}
local IndentRight = {0, 1}
local IndentBoth = {-1, 1}
function IndentType(t)
local s={}
table.insert(s, {
name = string.lower(t[1]),
orig = t[1],
type = t[2]
})
return s
end
KeywordReferenceData = {
IndentType {"Else",IndentBoth},
IndentType {"ElseIf",IndentBoth},
IndentType {"Native",IndentIgnore},
IndentType {"New",IndentIgnore},
IndentType {"As",IndentIgnore},
IndentType {"Int",IndentIgnore},
IndentType {"Length",IndentIgnore},
IndentType {"Import",IndentIgnore},
IndentType {"None",IndentIgnore},
IndentType {"Parent",IndentIgnore},
IndentType {"Property",IndentIgnore},
IndentType {"String",IndentIgnore},
IndentType {"Hidden",IndentIgnore},
IndentType {"Self",IndentIgnore},
IndentType {"Return",IndentIgnore},
IndentType {"ScriptName",IndentIgnore},
IndentType {"True",IndentIgnore},
IndentType {"Global",IndentIgnore},
IndentType {"Float",IndentIgnore},
IndentType {"Bool",IndentIgnore},
IndentType {"AutoReadOnly",IndentIgnore},
IndentType {"Extends",IndentIgnore},
IndentType {"False",IndentIgnore},
IndentType {"Auto",IndentIgnore},
IndentType {"EndEvent",IndentLeft},
IndentType {"EndFunction",IndentLeft},
IndentType {"EndIf",IndentLeft},
IndentType {"EndProperty",IndentLeft},
IndentType {"EndState",IndentLeft},
IndentType {"EndWhile",IndentLeft},
IndentType {"If",IndentRight},
IndentType {"State",IndentRight},
IndentType {"Event",IndentRight},
IndentType {"Function",IndentRight},
IndentType {"While",IndentRight},
}
function FindKeywordReference(name)
for k,v in ipairs(KeywordReferenceData) do
if string.lower(name) == v[1].name then
return v[1].name,v[1].orig,v[1].type
end
end
return nil,nil,nil
end
-- The following was generated from the Creation Kit wiki
-- http://www.creationkit.com/Category:Script_Objects
function CaseType(t)
local s={}
for i,v in ipairs(t) do
s[string.lower(v)]=v
end
return s
end
ScriptObjects = CaseType {
"Action", "Activator", "ActiveMagicEffect", "Actor",
"ActorBase", "ActorValueInfo", "Alias", "Ammo",
"Apparatus", "Armor", "ArmorAddon", "Art",
"AssociationType", "Book", "Cell", "Class",
"ColorForm", "CombatStyle", "ConstructibleObject", "Container",
"Debug", "DefaultObjectManager", "Door", "EffectShader",
"Enchantment", "EncounterZone", "EquipSlot", "Explosion",
"Faction", "Flora", "Form", "FormList",
"Furniture", "Game", "GlobalVariable", "Hazard",
"HeadPart", "Idle", "ImageSpaceModifier", "ImpactDataSet",
"Ingredient", "Input", "Key", "Keyword",
"LeveledActor", "LeveledItem", "LeveledSpell", "Light",
"Location", "LocationAlias", "LocationRefType", "MagicEffect",
"Math", "Message", "MiscObject", "ModEvent",
"MusicType", "NetImmerse", "ObjectReference", "Outfit",
"Package", "Perk", "Potion", "Projectile",
"Quest", "Race", "ReferenceAlias", "Scene",
"Scroll", "Shout", "SKSE", "SoulGem",
"Sound", "SoundCategory", "SoundDescriptor", "Spell",
"Static", "StringUtil", "TalkingActivator", "TextureSet",
"Topic", "TopicInfo", "Tree", "UI",
"UICallback", "Utility", "VisualEffect", "VoiceType",
"Weapon", "Weather", "WordOfPower", "WorldSpace",
"WornObject",
}
-- The following used to be generated from the Creation Kit wiki
-- http://www.creationkit.com/Category:Papyrus
--
-- Now generated from a collection of Papyrus files
ApiData = CaseType {
-- Generated data for Skyrim
"IsFurnitureMarkerInUse", "GetSunPositionX", "Dismount", "ToggleCollisions",
"CanFlyHere", "ShowLimitedRaceMenu", "SetAV", "GetPlayerGrabbedRef",
"SetFogPower", "SetDestroyed", "KillSilent", "TryToClear",
"RemoveShout", "ClearTempEffects", "KeepOffsetFromActor", "HasForm",
"SetProtected", "IsInInterior", "SetCrimeGold", "GetGiftFilter",
"Resurrect", "StopObjectProfiling", "CanPayCrimeGold", "GetRace",
"Dispel", "FindRandomReferenceOfAnyTypeInListFromRef", "TraceAndBox", "ForceMovementRotationSpeedRamp",
"HasCommonParent", "StartScriptProfiling", "IsFightingControlsEnabled", "SetCrimeFaction",
"GetValueInt", "RegisterForUpdateGameTime", "IsStopping", "SetActorOwner",
"GetEquippedWeapon", "ShowTitleSequenceMenu", "GetAlias", "HasLOS",
"IsMapMarkerVisible", "GetActorOwner", "CenterOnCellAndWait", "GetLeveledActorBase",
"TryToEvaluatePackage", "HasParentRelationship", "SetCleared", "SetValueInt",
"SetEnemy", "GetKiller", "TryToRemoveFromFaction", "UnequipItem",
"CaptureFrameRate", "GetEditorLocation", "StartStackProfiling", "FailAllObjectives",
"SetSubGraphFloatVariable", "IsActive", "HasMagicEffectWithKeyword", "AddItem",
"PlaySyncedAnimationAndWaitSS", "FindClosestReferenceOfAnyTypeInListFromRef", "FindClosestReferenceOfTypeFromRef", "SetMotionType",
"MoveToPackageLocation", "GetCurrentWeatherTransition", "IsSneakingControlsEnabled", "AddInventoryEventFilter",
"GetAt", "GetSize", "GetBudgetCount", "IncrementSkill",
"ClearLookAt", "Show", "IsInFaction", "QuitGame",
"PlayerKnows", "TriggerScreenBlood", "WornHasKeyword", "GetGoldValue",
"IsBeingRidden", "GetAVPercentage", "SetObjectiveDisplayed", "TraceStack",
"SetPublic", "GetLockLevel", "Ceiling", "RemoveDependentAnimatedObjectReference",
"DoCombatSpellApply", "SetLockLevel", "FindClosestActor", "PlayImpactEffect",
"StartDeferredKill", "AddAchievement", "GetBribeAmount", "SetINIFloat",
"GetLocation", "MessageBox", "SetDontMove", "SetAttackActorOnSight",
"SetHeadTracking", "UnequipSpell", "ShowGiftMenu", "AddDependentAnimatedObjectReference",
"ForceMovementDirection", "GetPositionY", "SetAnimationVariableInt", "SetPlayerAIDriven",
"UnequipShout", "AddPerk", "SetFootIK", "ForceAV",
"GetAnimationVariableInt", "ModAV", "SetInvulnerable", "ToggleMenus",
"CenterOnCell", "ForceLocationTo", "GetAnimationVariableFloat", "DumpAliasData",
"GetAngleZ", "SetAllowFlying", "AddToMap", "RemoveSpell",
"GetStolenItemValueCrime", "BlockActivation", "GetAssociatedSkill", "SetINIBool",
"SetAngle", "SetPlayerReportCrime", "SendTrespassAlarm", "RemoveItem",
"TryToReset", "ShowBarterMenu", "FindRandomReferenceOfAnyTypeInList", "ForceRefTo",
"SplineTranslateToRefNode", "TrapSoul", "IsUnique", "Lock",
"ModReaction", "GetPositionZ", "ShakeCamera", "SendStealAlarm",
"GetHeadingAngle", "GetInfamy", "PlaceActorAtMe", "ClearExpressionOverride",
"ClearKeepOffsetFromActor", "Notification", "SetOpen", "GetDialogueTarget",
"Delete", "IsAllowedToFly", "IsActivationBlocked", "EnableNoWait",
"GetDeadCount", "UnregisterForUpdate", "Pause", "SetPlayerControls",
"DrawWeapon", "RemoveFromAllFactions", "GetNoBleedoutRecovery", "GetPlatformName",
"IsCleared", "SetOutfit", "IsInCombat", "FindRandomReferenceOfType",
"SetFogPlanes", "AdvanceSkill", "IsPlayerTeammate", "WillIntimidateSucceed",
"FindRandomReferenceOfTypeFromRef", "Reset", "UnregisterForLOS", "IsPlayerSungazing",
"GetAngleX", "OpenInventory", "HasEffectKeyword", "Clear",
"GetConfigName", "IsLocked", "TraceConditional", "ShowAsHelpMessage",
"FindRandomActorFromRef", "FindRandomActor", "LearnAllEffects", "UnregisterForUpdateGameTime",
"IsEquipped", "IsDead", "AttachAshPile", "HasAssociation",
"IsActivateChild", "GetFactionRank", "GetHighestRelationshipRank", "LearnEffect",
"LearnNextEffect", "GetForm", "FadeOutGame", "TraceUser",
"PathToReference", "GetEquippedShout", "IsInKillMove", "GetAverageFrameRate",
"SetPlayerExpelled", "UnLockOwnedDoorsInCell", "SetActorCause", "GetCurrentScene",
"SetVehicle", "OverBudget", "GetSunPositionZ", "GetCurrentPackage",
"SetPosition", "GameTimeToString", "GetLowestRelationshipRank", "Play",
"AddHavokBallAndSocketConstraint", "IsInLocation", "ClearExtraArrows", "EquipItem",
"GetMinFrameRate", "RegisterForUpdate", "SetHudCartMode", "IsInMenuMode",
"PushActorAway", "IsActivateControlsEnabled", "StopInstance", "GetSitState",
"SetEssential", "DisableLinkChain", "HasSpell", "ForceTargetSpeed",
"IsNearPlayer", "ResetHelpMessage", "Start", "IsDetectedBy",
"TakeScreenshot", "CalculateFavorCost", "SetINIString", "RemoveInventoryEventFilter",
"ClearPrison", "GetStolenItemValueNoCrime", "RegisterForAnimationEvent", "Floor",
"StartObjectProfiling", "Mod", "EquipSpell", "GetSkyMode",
"IsFastTravelEnabled", "SendAnimationEvent", "AddToFaction", "GetOutgoingWeather",
"GetItemHealthPercent", "GetKeywordData", "GetClassification", "SetEyeTexture",
"FindWeather", "ForceActive", "ReleaseOverride", "ForceThirdPerson",
"IgnoreFriendlyHits", "Fire", "IsPlayersLastRiddenHorse", "GetBudgetName",
"GetCurrentBudget", "GetCurrentMemory", "HasKeyword", "IsLoaded",
"GetTriggerObjectCount", "CreateDetectionEvent", "GetNthLinkedRef", "GetGameSettingInt",
"GetCombatTarget", "GetPlayersLastRiddenHorse", "UnequipItemSlot", "SetINIInt",
"GetCasterActor", "PlayTerrainEffect", "RandomInt", "SetLookAt",
"GetCurrentGameTime", "SendWereWolfTransformation", "GetKey", "GetCurrentRealTime",
"Unload", "Remove", "Preload", "IncrementStat",
"ModCrimeGold", "TetherToHorse", "RemoteCast", "RemoveAllInventoryEventFilters",
"RegisterForLOS", "SetFrequency", "GetCurrentWeather", "UnMute",
"IsEssential", "Mute", "MoveTo", "GetPlayerControls",
"SetInstanceVolume", "PlayAndWait", "PlayerMoveToAndWait", "MoveToMyEditorLocation",
"IsActionComplete", "IsPlaying", "TryToEnableNoWait", "TryToEnable",
"TryToMoveTo", "TryToKill", "ForceStart", "TryToDisableNoWait",
"GetBaseAV", "TryToDisable", "IsAttached", "TryToStopCombat",
"TryToAddToFaction", "IsProtected", "GetActorRef", "GetWorldSpace",
"GetWidth", "PlayAnimation", "GetLinkedRef", "ModFactionRank",
"ForceRefIfEmpty", "GetReference", "IsJournalControlsEnabled", "IsFastTravelControlsEnabled",
"HideTitleSequenceMenu", "InterruptCast", "UnregisterForSleep", "SetIntimidated",
"StartSneaking", "IsChild", "SetBeastForm", "IsSprinting",
"IsSneaking", "ShowRaceMenu", "UnPause", "SetPlayerEnemy",
"GetCurrentDestructionStage", "IsMenuControlsEnabled", "UpdateCurrentInstanceGlobal", "GetDistance",
"GetCurrentStageID", "SetObjectiveFailed", "SetObjectiveCompleted", "GetActorReference",
"SetActive", "IsStopped", "GetItemCount", "IsStageDone",
"IsObjectiveFailed", "PrecacheCharGenClear", "IsDeleted", "DebugChannelNotify",
"IsObjectiveDisplayed", "FindClosestActorFromRef", "SetExpressionOverride", "IsObjectiveCompleted",
"PlayAnimationAndWait", "IsCompleted", "RemoveCrossFade", "IsDisabled",
"GetInfamyViolent", "Enable", "GetStageDone", "GetStage",
"SetStage", "IsAlerted", "RestoreActorValue", "CompleteQuest",
"IsGuard", "StopScriptProfiling", "UnregisterForTrackedStatsEvent", "GetOpenState",
"countLinkedRefChain", "SetValue", "GetTemplate", "WaitForAnimationEvent",
"GetPlayer", "TranslateToRef", "StopTranslation", "RadiansToDegrees",
"StopCombatAlarm", "SplineTranslateTo", "MakePlayerFriend", "RemoveAllItems",
"TranslateTo", "IsMovementControlsEnabled", "GetOwningQuest", "UnregisterForAnimationEvent",
"AllowBleedoutDialogue", "SetNoFavorAllowed", "acos", "GetParentCell",
"ForceMovementSpeed", "GetRefTypeDeadCount", "SetAnimationVariableFloat", "GetCurrentLocation",
"GetGameSettingFloat", "DisableNoWait", "ProcessTrapHit", "RandomFloat",
"SetBribed", "GetBaseActorValue", "atan", "PlayGamebryoAnimation",
"AddSpell", "GetRef", "IsFactionInCrimeGroup", "DropObject",
"PlaceAtMe", "MoveToNode", "MoveToInteractionLocation", "KnockAreaEffect",
"RemovePerk", "IsIgnoringFriendlyHits", "IsLockBroken", "IsInDialogueWithPlayer",
"IsFurnitureInUse", "rampRumble", "IsEnabled", "HasRefType",
"GetReaction", "FindClosestReferenceOfType", "HasNode", "EquipShout",
"GetPositionX", "SetAlpha", "IsIntimidated", "EndFrameRateCapture",
"QueryStat", "IsDoingFavor", "GetScale", "DBSendPlayerPosition",
"SetReaction", "ToggleAI", "SendPlayerToJail", "ForceMovementSpeedRamp",
"GetSelfAsActor", "GetMass", "EnableLinkChain", "ForceAddRagdollToWorld",
"StartFrameRateCapture", "GetTargetActor", "SetCurrentStageID", "SetUnconscious",
"GetLength", "SetVolume", "IsStarting", "GetHeight",
"SetVoiceRecoveryTime", "SetAnimationVariableBool", "ClearDestruction", "UnequipAll",
"DamageObject", "SetRelationshipRank", "GetEquippedSpell", "RegisterForSingleLOSGain",
"ForceRemoveRagdollFromWorld", "Disable", "GetAngleY", "GetVoiceRecoveryTime",
"GetAnimationVariableBool", "CompleteAllObjectives", "RequestSave", "StopCombat",
"GetRelationshipRank", "CalculateEncounterLevel", "AddShout", "GetAV",
"SetCriticalStage", "RestoreAV", "ApplyHavokImpulse", "GetClass",
"ForceMovementDirectionRamp", "ForceTargetDirection", "Activate", "GetFactionReaction",
"IsUnconscious", "AddKeyIfNeeded", "ModActorValue", "DeleteWhenAble",
"MoveToWhenUnloaded", "GetForcedLandingMarker", "IsWeaponDrawn", "MoveToIfUnloaded",
"IsAlarmed", "GetCrimeFaction", "GetEquippedShield", "ApplyCrossFade",
"PlayIdle", "SetAllowFlyingEx", "set", "DamageActorValue",
"GetActorValue", "Add", "RemoveFromFaction", "ClearForcedMovement",
"tan", "IsBribed", "sqrt", "GetSleepState",
"get", "pow", "DegreesToRadians", "Kill",
"GetSex", "IsPlayerExpelled", "HasPerk", "cos",
"GetMaxFrameRate", "PlaySyncedAnimationSS", "SetActorValue", "asin",
"GetFormID", "IsArrestingTarget", "abs", "GetLightLevel",
"EnableAI", "GetVersionNumber", "RequestModel", "StartCannibal",
"SetGodMode", "SetKeywordData", "SetDoingFavor", "Find",
"IsSameLocation", "Is3DLoaded", "GetRefTypeAliveCount", "PopTo",
"Apply", "GetInfamyNonViolent", "IsGhost", "SendAssaultAlarm",
"ModObjectiveGlobal", "ModFavorPointsWithGlobal", "EndDeferredKill", "SetGhost",
"RegisterForTrackedStatsEvent", "WaitGameTime", "UsingGamepad", "ClearArrested",
"IsInterior", "HasFamilyRelationship", "GetCrimeGoldViolent", "RegisterForSleep",
"TeachWord", "ShowTrainingMenu", "SetSunGazeImageSpaceModifier", "SetAllowFlyingMountLandingRequests",
"PlayerPayCrimeGold", "IsFlying", "StartTitleSequence", "ShakeController",
"SetSittingRotation", "SetInChargen", "SetPlayerResistingArrest", "SetCameraTarget",
"ServeTime", "GetBaseObject", "IsOnMount", "GetActorBase",
"RequestAutoSave", "DamageAV", "IsBleedingOut", "EnableFastTravel",
"SetNotShowOnStealthMeter", "PrecacheCharGen", "PlayIdleWithTarget", "IsWordUnlocked",
"ForceMovementRotationSpeed", "ModFavorPoints", "GetGoldAmount", "ResetHealthAndLimbs",
"SetPlayerTeammate", "IsCamSwitchControlsEnabled", "IncrementSkillBy", "IsArrested",
"GetSunPositionY", "IsRunning", "SplineTranslateToRef", "GetGameSettingString",
"WaitMenuMode", "GetFactionOwner", "ForceActorValue", "Say",
"GetFormFromFile", "SetFactionRank", "sin", "FindClosestReferenceOfAnyTypeInList",
"GetFlyingState", "IsHostileToActor", "RegisterForSingleLOSLost", "RemoveHavokConstraints",
"GetActorValuePercentage", "ClearForcedLandingMarker", "Trace", "DispelSpell",
"CanFastTravelToMarker", "FastTravel", "HasMagicEffect", "KillEssential",
"QuitToMainMenu", "StopStackProfiling", "IsTrespassing", "AddPerkPoints",
"RegisterForSingleUpdateGameTime", "GetVoiceType", "SetRace", "AddForm",
"CloseUserLog", "GetRealHoursPassed", "SetForcedLandingMarker", "SetCrimeGoldViolent",
"ShowFirstPersonGeometry", "GetEquippedItemType", "SetAlly", "PlaySubGraphAnimation",
"GetCrimeGold", "ForceTargetAngle", "IsHostile", "EvaluatePackage",
"ShowRefPosition", "OpenUserLog", "SetNoBleedoutRecovery", "RegisterForSingleUpdate",
"GetLevel", "Cast", "RemoveAddedForm", "GetCombatState",
"SetFactionOwner", "IsInvulnerable", "UnlockWord", "GetCrimeGoldNonViolent",
"DispelAllSpells", "SetScale", "ForceFirstPerson", "GetValue",
"StartVampireFeed", "IsLookingControlsEnabled", "StartCombat", "Wait",
"SetRestrained", "IsCommandedActor", "Stop", "SetAlert",
"AllowPCDialogue", "Revert",
-- Generated data for SkyUI
"AddMenuOptionST", "SetKeyMapOptionValue", "SetCursorFillMode", "SetTextOptionValueST",
"SetTextOptionValue", "SetTitleText", "SetSliderOptionValue", "AddKeyMapOptionST",
"UnloadCustomContent", "SetKeyMapOptionValueST", "SetCursorPosition", "SetSliderDialogStartValue",
"CheckVersion", "SetInfoText", "SetMenuDialogOptions", "SetSliderDialogDefaultValue",
"AddEmptyOption", "SetColorOptionValueST", "SetSliderDialogRange", "SetMenuDialogDefaultIndex",
"AddToggleOptionST", "GetCustomControl", "Guard", "AddHeaderOption",
"SetMenuOptionValueST", "SetSliderOptionValueST", "SetToggleOptionValueST", "SetOptionFlagsST",
"AddColorOptionST", "AddSliderOptionST", "SetSliderDialogInterval", "ShowMessage",
"AddSliderOption", "AddToggleOption", "AddTextOptionST", "AddMenuOption",
"SetOptionFlags", "LoadCustomContent", "GetVersion", "AddTextOption",
"SetColorDialogStartColor", "AddColorOption", "SetColorDialogDefaultColor", "SetMenuDialogStartIndex",
"SetMenuOptionValue", "SetToggleOptionValue", "ForcePageReset", "AddKeyMapOption",
"SetColorOptionValue",
-- Generated data for SKSE
"GetNumHeadParts", "SetNthEffectMagnitude", "GetNthLevel", "ModPerkPoints",
"GetMeleePowerAttackStaggeredMult", "GetNthPlayableRace", "GetDescriptor", "SaveGame",
"GetNthAdditionalRace", "GetWornForm", "GetNumParts", "GetIndexOfExtraPart",
"GetNthPart", "SetMagicMult", "EquipItemById", "IsImmobile",
"UpdateWeight", "GetMagicMult", "CanWalk", "LoadGame",
"SetNthSpell", "GetIconPath", "GetNumTexturePaths", "SetIconPath",
"GetFrequencyVariance", "SetNthLevel", "SetAllowPickpocket", "GetNthModDependency",
"SetSkillLevel", "ResetInventory", "GetSpellCount", "LogicalAnd",
"OpenCustomMenu", "GetVersionRelease", "PushStringA", "Release",
"SetOffensiveMult", "GetNthSpell", "GetNthEntryText", "SetQuality",
"IsLightArmor", "SetNthEntryText", "GetQuality", "GetNumIngredients",
"GetNthCount", "TempClone", "MakeCanSwim", "GetNthEffectMagnitude",
"ClearRaceFlag", "ClearAllowPCDialogue", "PushInt", "RegisterForCrosshairRef",
"IsClothingHands", "SetArmorRating", "UnregisterForActorAction", "GetNthParent",
"GetModName", "SetCloseRangeFlankingFlankDistance", "NoKnockdowns", "GetNthReferenceAlias",
"UpdateTintMaskColors", "SetNthTintMaskTexturePath", "SetNthEffectDuration", "GetEquipAbility",
"SetMeleeBashMult", "IsWarAxe", "SetEquipAbility", "GetMeleeBashMult",
"GetNthEffectDuration", "GetNthTintMaskTexturePath", "SetPlayerKnows", "GetResult",
"GetAllowDualWielding", "QueueNiNodeUpdate", "GetSkillLevel", "GetArmorRating",
"GetCloseRangeFlankingStalkTime", "GetPerkPoints", "GetImpactDataSet", "IsStaff",
"SetSlotMask", "GetIngredient", "GetNthEntrySpell", "GetCritMultiplier",
"SetFrequencyVariance", "SetImpactDataSet", "GetINIFloat", "GetIsNthEffectKnown",
"GetSlotMask", "GetSoulSize", "GetNthWordOfPower", "GetVersionBeta",
"IsTakeable", "GetFormEx", "SetPerkPoints", "SetEnchantmentValue",
"SetNthWordOfPower", "UnregisterForAllMenus", "GetModelNthTextureSet", "GetNumParents",
"Substring", "GetAvoidThreatChance", "SetNthEntrySpell", "SetIngredient",
"UnregisterForAllKeys", "SetEffectFlag", "SetArea", "GetNthTintMaskType",
"MakeNonWalking", "SetAllowPCDialogue", "ClearNoKNockdowns", "GetString",
"GetModByName", "SetString", "LogicalXor", "NoShadow",
"GetChanceGlobal", "UnbindObjectHotkey", "GetType", "SetNthTintMaskColor",
"SetAssociatedSkill", "TapKey", "GetActorValueInfoByID", "IsPrintable",
"GetCloseRangeDuelingFallbackMult", "IsBattleaxe", "GetWeightClass", "AddSlotToMask",
"CloseCustomMenu", "GetWornItemId", "HasKeywordString", "IsHarvested",
"Invoke", "GetNextPerk", "SetNthTexturePath", "SetSkillImproveMult",
"IsClothingBody", "IsMenuOpen", "GetID", "SetItemHealthPercent",
"SetMeleeBashRecoiledMult", "UnregisterForCameraState", "SetNoShadow", "IsRaceFlagSet",
"GetSunDamage", "RegenerateHead", "IsEffectFlagSet", "SetFlightDiveBombChance",
"GetMeleeBashRecoiledMult", "UnregisterForAllModEvents", "GetAVIByName", "GetMaxRange",
"GetActorValueInfoByName", "GetNthEntryValue", "SetMaxRange", "GetINIBool",
"GetNumItems", "SetSkillOffsetMult", "SetFlightFlyingAttackChance", "GetGemSize",
"GetNthTintMaskColor", "SetRed", "SetNthEntryValue", "SetMiscStat",
"GetNthKeyword", "GetNumKeysPressed", "SetNthEntryPriority", "GetSkillOffsetMult",
"GetArea", "SetDisplayName", "GetOutfit", "MakePushable",
"GetRed", "GetValidRaces", "InvokeNumberA", "GetPerk",
"SetEquippedModel", "ClearNoShadow", "GetNumber", "GetNthKeyPressed",
"IsClothingRich", "SetNthEntryLeveledList", "GetNodePositionY", "GetEnchantShader",
"SetChanceNone", "GetEquippedModel", "GetWindDirection", "AsChar",
"SetEnchantShader", "GetLight", "IsCuirass", "GetGroupOffensiveMult",
"SetGroupOffensiveMult", "UpdateHairColor", "IsGauntlets", "SetWorkbenchKeyword",
"GetINIInt", "GetNthEntryRank", "SetSkin", "GetWorkbenchKeyword",
"GetSkin", "GetNumAdditionalRaces", "IsShield", "IsTextInputEnabled",
"GetDefaultVoiceType", "RegisterForModEvent", "IsHelmet", "GetSkillExperience",
"GetStaffMult", "GetSkillImproveMult", "ClearEffectFlag", "SetWeightClass",
"SetMeleeBashAttackMult", "IsJewelry", "IsClothing", "Send",
"RemoveSlotFromMask", "GetAVIByID", "GetNthEntryLeveledList", "GetMappedControl",
"SetValidRaces", "SetResist", "SetDefaultVoiceType", "LogicalNot",
"SetNumber", "SetSkillExperience", "GetFlightHoverChance", "GetImageSpaceMod",
"SetNthEntryQuest", "GetInt", "LeftShift", "SetNthIngredientQuantity",
"SetFlightHoverChance", "IsFood", "GetNthEntryQuest", "GetFaceMorph",
"SetInt", "GetNumForms", "SetTintMaskColor", "UnregisterForModEvent",
"GetNumTintsByType", "SetFaceMorph", "SetImageSpaceMod", "GetSpell",
"UnregisterForKey", "GetFacePreset", "IsMace", "SetHitEffectArt",
"UpdateThirdPerson", "IsPunctuation", "SetWeight", "SetItemMaxCharge",
"UnregisterForMenu", "GetPluginVersion", "InvokeString", "GetINIString",
"SetCritEffectOnDeath", "SetStaffMult", "GetNthForm", "GetWeight",
"GetTimeElapsed", "SetFacePreset", "SetForm", "GetBaseCost",
"GetEnchantment", "SetRaceFlag", "GetNumExtraParts", "SetCritDamage",
"GetName", "GetCritDamage", "SetName", "GetItemMaxCharge",
"SetDecibelVariance", "SetPlayersLastRiddenHorse", "GetPlayerExperience", "GetTintMaskColor",
"IsObjectFavorited", "IsChildRace", "GetReach", "GetExplosion",
"GetNthAlias", "GetNthExtraPart", "SetBaseCost", "GetNthIngredientQuantity",
"IsSword", "SetPlayerExperience", "SetEnchantment", "PushIntA",
"SetCombatStyle", "UnregisterForAllControls", "GetCombatStyle", "CanSwim",
"SetMeleePowerAttackBlockingMult", "Create", "GetSkillImproveOffset", "GetMeleePowerAttackBlockingMult",
"GetFlightFlyingAttackChance", "SetCastingArt", "SetMeleeSpecialAttackMult", "IsClothingRing",
"Log", "SetResistance", "SetNodeTextureSet", "GetPlayerMovementMode",
"GetMeleeSpecialAttackMult", "GetModDescription", "SetResultQuantity", "GetModelPath",
"SetCloseRangeDuelingCircleMult", "MakeNonSwimming", "GetResultQuantity", "GetSkinFar",
"GetNodePositionX", "SetMinRange", "UnregisterForControl", "PushBool",
"GetPerkTree", "IsSwimming", "GetDuration", "ClearNoCombatInWater",
"GetSaturation", "MakeCanWalk", "SetSaturation", "IsKeyPressed",
"GetCameraState", "SendModEvent", "MakeCanFly", "GetMaskForSlot",
"GetBaseDamage", "GetNumArmorAddons", "SetNodeScale", "GetModAuthor",
"GetCastingArt", "GetMessageIconPath", "GetNodeScale", "GetNumEffects",
"GetNumOverlayHeadParts", "GetUnarmedMult", "GetFogDistance", "GetMeleeAttackStaggeredMult",
"SetGameSettingBool", "GetColor", "GetDefensiveMult", "SetMeleeAttackStaggeredMult",
"SetDefensiveMult", "InvokeInt", "MakeChildRace", "GetWindDirectionRange",
"GetSunGlare", "IsWarhammer", "IsGreatsword", "IsDagger",
"SetUnarmedMult", "SetAvoidThreatChance", "SetCritMultiplier", "GetCritEffectOnDeath",
"SetCritEffect", "GetCritEffect", "GetResist", "GetNumEntries",
"SetMeleeMult", "GetEnchantmentValue", "SetCloseRangeDuelingFallbackMult", "SetProjectile",
"AvoidsRoads", "GetWeaponType", "GetBool", "SetNthHeadPart",
"EquipItemEx", "GetModDependencyCount", "GetEnchantArt", "GetMeleeMult",
"RegisterForControl", "GetIndexOfHeadPartByType", "SetEnchantArt", "SetStagger",
"GetStagger", "SetSpeed", "GetSpeed", "GetMinRange",
"AddSkillExperience", "GetMagnitude", "SetReach", "SetGameSettingInt",
"SetBaseDamage", "UnregisterForCrosshairRef", "SetColor", "GetHue",
"PushFloatA", "PushBoolA", "InvokeForm", "InvokeStringA",
"InvokeFloatA", "AllowPickpocket", "InvokeIntA", "PushForm",
"InvokeBoolA", "InvokeNumber", "InvokeFloat", "SetFaceTextureSet",
"InvokeBool", "GetFloat", "SetFloat", "SetSkillUsageMult",
"GetNthTexturePath", "SetMeleePowerAttackStaggeredMult", "SetLongRangeStrafeMult", "SetGoldValue",
"IsLetter", "IsClothingHead", "GetTotalItemWeight", "GetEnableParent",
"GetNthChar", "GetMeleeBashAttackMult", "SetHue", "PushString",
"GetHitEffectArt", "IsDigit", "AsOrd", "GetCostliestEffectIndex",
"SetNthEffectArea", "GetNthRef", "GetEffectiveMagickaCost", "GetNumTintMasks",
"SetFrequencyShift", "SetNthEntryStage", "IsAIEnabled", "GetFrequencyShift",
"SetSkill", "GetDecibelVariance", "SetDecibelAttenuation", "GetDecibelAttenuation",
"GetResistance", "IsClothingPoor", "GetQuest", "GetScriptVersionRelease",
"GetNthEntryStage", "GetAlpha", "HasExtraPart", "GetHotkeyBoundObject",
"SetNthRecoveryTime", "GetVersionMinor", "GetNthRecoveryTime", "RegisterForActorAction",
"SetChanceGlobal", "SetEquipType", "SetSkillImproveOffset", "GetSkill",
"GetIndexOfOverlayHeadPartByType", "SetHitShader", "SetCantOpenDoors", "SetTintMaskTexturePath",
"SetResult", "RegisterForCameraState", "ReplaceHeadPart", "IsSkill",
"GetNumPlayableRaces", "GetCloseRangeFlankingFlankDistance", "ClearAvoidsRoads", "GetHarvestSound",
"SetAvoidsRoads", "SetAR", "GetNumAliases", "SetNoCombatInWater",
"NoCombatInWater", "SetPerk", "GetNumKeywords", "SetHeight",
"GetNthArmorAddon", "SetCloseRangeFlankingStalkTime", "IsBow", "GetTintMaskTexturePath",
"MakeNotPushable", "GetAR", "GetMagickaCost", "IsNotPushable",
"MakeMobile", "MakeImmobile", "IsClothingFeet", "ClearCantOpenDoors",
"SetModelNthTextureSet", "SetNthIngredient", "SetHairColor", "SetModelPath",
"GetBaseEnchantment", "GetModCount", "CantOpenDoors", "SetSkinFar",
"GetLongRangeStrafeMult", "IsOffLimits", "GetOffensiveMult", "RegisterForKey",
"MakeNonFlying", "CanFly", "SetGameSettingString", "CreateEnchantment",
"SetSkillLegendaryLevel", "GetCloseRangeDuelingCircleMult", "SetCastTime", "MakePlayable",
"SetAllowDualWielding", "GetNthIngredient", "SetShoutMult", "IsPlayable",
"GetExperienceForLevel", "GetRangedMult", "GetShoutMult", "UnequipItemEx",
"GetFaceTextureSet", "GetProjectile", "HoldKey", "SetHarvestSound",
"PushFloat", "MakeUnplayable", "SetBlue", "GetSkillLegendaryLevel",
"SetGreen", "GetNthEffectMagicEffect", "SetMessageIconPath", "GetMappedKey",
"GetGreen", "SetNthCount", "GetCastTime", "GetNthEntryPriority",
"SetNthEntryRank", "GetNthHeadPart", "GetAliasByName", "IsRead",
"GetEquippedObject", "GetDisplayName", "GetNumRefs", "ModArmorRating",
"IsHeavyArmor", "SetHarvested", "GetSkillUseMult", "ModAR",
"GetTotalArmorWeight", "GetSkillUsageMult", "SetSkillUseMult", "GetNumReferenceAliases",
"GetNodePositionZ", "SetExplosion", "SetWeaponType", "SetBool",
"GetPriority", "SetMeleeBashPowerAttackMult", "GetEquippedItemId", "SetClass",
"GetBlue", "SetGameSettingFloat", "GetItemCharge", "LogicalOr",
"RightShift", "GetFlightDiveBombChance", "SetItemCharge", "GetHeadPart",
"ReleaseKey", "GetMeleeBashPowerAttackMult", "SetVoiceType", "GetEquipType",
"GetHitShader", "GetNthOverlayHeadPart", "RegisterForMenu", "SetLight",
"IsBoots", "GetModelNumTextureSets", "SheatheWeapon", "MakeNonChildRace",
"GetChanceNone", "GetNthEffectArea", "GetKeyword", "MakeNoKnockdowns",
"SetRangedMult", "GetHairColor", "ChangeHeadPart", "ClearAllowPickpocket",
}
-- The following used to be generated from the Creation Kit wiki
-- http://www.creationkit.com/Category:Events
--
-- Now generated from a collection of Papyrus files
EventData = CaseType {
-- Generated data for Skyrim
"OnSell", "OnObjectUnequipped", "OnStoryIncreaseLevel", "OnPackageChange",
"OnTranslationFailed", "OnUpdate", "OnRelease", "OnUpdateGameTime",
"OnMagicEffectApply", "OnDestructionStageChanged", "OnDying", "OnStoryCraftItem",
"OnPackageStart", "OnAnimationEventUnregistered", "OnGetUp", "OnClose",
"OnTriggerLeave", "OnPackageEnd", "OnStoryIncreaseSkill", "OnItemAdded",
"OnTranslationComplete", "OnWardHit", "OnTrigger", "OnDeath",
"OnItemRemoved", "OnStoryFlatterNPC", "OnDetachedFromCell", "OnStoryPickLock",
"OnCellDetach", "OnCellLoad", "OnOpen", "OnUnequipped",
"OnSleepStop", "OnSpellCast", "OnTriggerEnter", "OnStoryNewVoicePower",
"OnStoryInfection", "OnCombatStateChanged", "OnEffectFinish", "OnStoryEscapeJail",
"OnStoryDialogue", "OnLocationChange", "OnRaceSwitchComplete", "OnEquipped",
"OnTranslationAlmostComplete", "OnCellAttach", "OnStoryHello", "OnActivate",
"OnStoryCure", "OnSleepStart", "OnLoad", "OnTrackedStatsEvent",
"OnAnimationEvent", "OnPlayerBowShot", "OnStoryPlayerGetsFavor", "OnEffectStart",
"OnPlayerLoadGame", "OnAttachedToCell", "OnSit", "OnEnterBleedout",
"OnObjectEquipped", "OnLostLOS", "OnGrab", "OnTrapHitStop",
"OnStoryBribeNPC", "OnStoryIntimidateNPC", "OnUnload", "OnRead",
"OnLockStateChanged", "OnStoryActivateActor", "OnHit", "OnContainerChanged",
"OnReset", "OnGainLOS",
-- Generated data for SkyUI
"OnHighlightST", "OnConfigInit", "OnSelectST", "OnColorOpenST",
"OnPageReset", "OnSliderAcceptST", "OnKeyMapChangeST", "OnOptionKeyMapChange",
"OnColorAcceptST", "OnOptionColorOpen", "OnConfigOpen", "OnGameReload",
"OnInit", "OnOptionMenuOpen", "OnOptionColorAccept", "OnOptionDefault",
"OnOptionMenuAccept", "OnMenuOpenST", "OnVersionUpdate", "OnOptionSliderAccept",
"OnSliderOpenST", "OnOptionSelect", "OnMenuAcceptST", "OnConfigRegister",
"OnDefaultST", "OnConfigClose", "OnOptionSliderOpen", "OnOptionHighlight",
-- Generated data for SKSE
"OnActorAction", "OnMenuOpen", "OnCrosshairRefChange", "OnMenuClose",
"OnControlDown", "OnKeyUp", "OnKeyDown", "OnControlUp",
"OnPlayerCameraState",
}
IndentData = {}
IndentData[TokenData.LEFTPAREN] = IndentRight
IndentData[TokenData.LEFTBRACKET] = IndentRight
IndentData[TokenData.LEFTWING] = IndentRight
IndentData[TokenData.RIGHTPAREN] = IndentLeft
IndentData[TokenData.RIGHTBRACKET] = IndentLeft
IndentData[TokenData.RIGHTWING] = IndentLeft
--
--
--
function Lexer.NumberExponent(text, pos)
local function IntExponent(text, pos)
while true do
local byte = StrByte(text, pos)
if not byte then
return TokenData.NUMBER, pos
end
if byte >= ByteData.NUM_0 and byte <= ByteData.NUM_9 then
pos = pos + 1
else
return TokenData.NUMBER, pos
end
end
end
local byte = StrByte(text, pos)
if not byte then
return TokenData.NUMBER, pos
end
if byte == ByteData.MINUS then
byte = StrByte(text, pos + 1)
if byte == ByteData.MINUS then
return TokenData.NUMBER, pos
end
return IntExponent(text, pos + 1)
end
return IntExponent(text, pos)
end
function Lexer.NumberFraction(text, pos)
while true do
local byte = StrByte(text, pos)
if not byte then
return TokenData.NUMBER, pos
end
if byte >= ByteData.NUM_0 and byte <= ByteData.NUM_9 then
pos = pos + 1
elseif byte == ByteData.E or byte == ByteData.e then
return Lexer.NumberExponent(text, pos + 1)
else
return TokenData.NUMBER, pos
end
end
end
function Lexer.Number(text, pos)
while true do
local byte = StrByte(text, pos)
if not byte then
return TokenData.NUMBER, pos
end
if byte >= ByteData.NUM_0 and byte <= ByteData.NUM_9 then
pos = pos + 1
elseif byte == ByteData.PERIOD then
return Lexer.NumberFraction(text, pos + 1)
elseif byte == ByteData.E or byte == ByteData.e then
return Lexer.NumberExponent(text, pos + 1)
else
return TokenData.NUMBER, pos
end
end
end
function Lexer.Identifier(text, pos)
while true do
local byte = StrByte(text, pos)
if not byte or
newline[byte] or
whitespaces[byte] or
SymbolData[byte] then
return TokenData.IDENTIFIER, pos
end
pos = pos + 1
end
end
function Lexer.Comment(text, pos)
local byte = StrByte(text, pos)
while true do
byte = StrByte(text, pos)
if not byte then
return TokenData.COMMENT_SHORT, pos
end
if newline[byte] then
return TokenData.COMMENT_SHORT, pos
end
pos = pos + 1
end
end
function Lexer.String(text, pos, character)
local even = true
while true do
local byte = StrByte(text, pos)
if not byte then
return TokenData.STRING, pos
end
if byte == character then
if even then
return TokenData.STRING, pos + 1
end
end
if byte == ByteData.BACKSLASH then
even = not even
else
even = true
end
pos = pos + 1
end
end
function Lexer.GetToken(text, pos)
local byte = StrByte(text, pos)
if not byte then
return nil
end
if newline[byte] then
return TokenData.LINEBREAK, pos + 1
end
if whitespaces[byte] then
while true do
pos = pos + 1
byte = StrByte(text, pos)
if not byte or not whitespaces[byte] then
return TokenData.WHITESPACE, pos
end
end
end
local token = SymbolData[byte]
if token then
if token ~= -1 then
return token, pos + 1
end
if byte == ByteData.OR then
byte = StrByte(text, pos + 1)
if byte == ByteData.OR then
return TokenData.OR, pos + 2
end
return TokenData.UNKNOWN, pos + 1
end
if byte == ByteData.AND then
byte = StrByte(text, pos + 1)
if byte == ByteData.AND then
return TokenData.AND, pos + 2
end
return TokenData.UNKNOWN, pos + 1
end
if byte == ByteData.SEMICOLON then
return Lexer.Comment(text, pos + 1)
end
if byte == ByteData.SINGLE_QUOTE then
return Lexer.String(text, pos + 1, ByteData.SINGLE_QUOTE)
end
if byte == ByteData.DOUBLE_QUOTE then
return Lexer.String(text, pos + 1, ByteData.DOUBLE_QUOTE)
end
if byte == ByteData.LEFTBRACKET then
return TokenData.LEFTBRACKET, pos + 1
end
if byte == ByteData.EQUALS then
byte = StrByte(text, pos + 1)
if not byte then
return TokenData.ASSIGNMENT, pos + 1
end
if byte == ByteData.EQUALS then
return TokenData.EQUALITY, pos + 2
end
return TokenData.ASSIGNMENT, pos + 1
end
if byte == ByteData.PERIOD then
byte = StrByte(text, pos + 1)
if not byte then
return TokenData.PERIOD, pos + 1
end
if byte >= ByteData.NUM_0 and byte <= ByteData.NUM_9 then
return Lexer.NumberFraction(text, pos + 2)
end
return TokenData.PERIOD, pos + 1
end
if byte == ByteData.LESSTHAN then
byte = StrByte(text, pos + 1)
if byte == ByteData.EQUALS then
return TokenData.LTE, pos + 2
end
return TokenData.LT, pos + 1
end
if byte == ByteData.GREATERTHAN then
byte = StrByte(text, pos + 1)
if byte == ByteData.EQUALS then
return TokenData.GTE, pos + 2
end
return TokenData.GT, pos + 1
end
if byte == ByteData.EXCLAMATIONMARK then
byte = StrByte(text, pos + 1)
if byte == ByteData.EQUALS then
return TokenData.NE, pos + 2
end
return TokenData.NOT, pos + 1
end
return TokenData.UNKNOWN, pos + 1
elseif byte >= ByteData.NUM_0 and byte <= ByteData.NUM_9 then
return Lexer.Number(text, pos + 1)
else
return Lexer.Identifier(text, pos + 1)
end
end
--
--
--
local function IndentTabs(n, unused)
return StrRep("\t", n)
end
local function IndentSpaces(a, b)
return StrRep(" ", a*b)
end
function IndentCode(code, width, position)
local Indentfunction
local tsize2 = 0
local totalLen2 = 0
local newPosition
local bNewPosition = false
local prevTokenWidth = 0
local pos = 1
local IndentLevel = 0
local bNonWhitespace = false
local bIndentRight = false
local preIndent = 0
local postIndent = 0
local tsize = 0
local totalLen = 0
if width == nil then
width = defaultTabWidth
end
if width then
Indentfunction = IndentSpaces
else
Indentfunction = IndentTabs
end
EraseTable(codeTable01)
EraseTable(codeTable02)
while true do
if position and not newPosition and pos >= position then
if pos == position then
newPosition = totalLen + totalLen2
else
newPosition = totalLen + totalLen2
local diff = pos - position
if diff > prevTokenWidth then
diff = prevTokenWidth
end
newPosition = newPosition - diff
end
end
prevTokenWasColored = false
prevTokenWidth = 0
local tokenType, nextPos = Lexer.GetToken(code, pos)
if not tokenType or tokenType == TokenData.LINEBREAK then
IndentLevel = IndentLevel + preIndent
if IndentLevel < 0 then IndentLevel = 0 end
local s = Indentfunction(IndentLevel, width)
tsize = tsize + 1
codeTable01[tsize] = s
totalLen = totalLen + StrLen(s)
if newPosition and not bNewPosition then
newPosition = newPosition + StrLen(s)
bNewPosition = true
end
for k, v in next,codeTable02 do
tsize = tsize + 1
codeTable01[tsize] = v
totalLen = totalLen + StrLen(v)
end
if not tokenType then
break
end
tsize = tsize + 1
codeTable01[tsize] = StrSub(code, pos, nextPos - 1)
totalLen = totalLen + nextPos - pos
IndentLevel = IndentLevel + postIndent
if IndentLevel < 0 then IndentLevel = 0 end
EraseTable(codeTable02)
tsize2 = 0
totalLen2 = 0
bNonWhitespace = false
bIndentRight = false
preIndent = 0
postIndent = 0
elseif tokenType == TokenData.WHITESPACE then
if bNonWhitespace then
prevTokenWidth = nextPos - pos
tsize2 = tsize2 + 1
local s = StrSub(code, pos, nextPos - 1)
codeTable02[tsize2] = s
totalLen2 = totalLen2 + StrLen(s)
end
else
bNonWhitespace = true
local str = StrSub(code, pos, nextPos - 1)
prevTokenWidth = nextPos - pos
local indentTable
if tokenType == TokenData.IDENTIFIER then
local tempstr = string.lower(str)
local RefName,RefOrig,RefType = FindKeywordReference(tempstr)
indentTable = RefType
if ApiData[tempstr] then
str = ApiData[tempstr]
elseif RefName then
str = RefOrig
elseif ScriptObjects[tempstr] then
str = ScriptObjects[tempstr]
elseif EventData[tempstr] then
str = EventData[tempstr]
end
else
indentTable = IndentData[tokenType]
end
if indentTable then
if bIndentRight then
postIndent = postIndent + indentTable[1] + indentTable[2]
else
local pre = indentTable[1]
local post = indentTable[2]
if post > 0 then
bIndentRight = true
end
preIndent = preIndent + pre
postIndent = postIndent + post
end
end
if FindKeywordReference(str) then
tokenType = TokenData.KEYWORD
end
tsize2 = tsize2 + 1
codeTable02[tsize2] = str
totalLen2 = totalLen2 + nextPos - pos
end
pos = nextPos
end
return table.concat(codeTable01), newPosition
end
local function PrintUsage()
io.stderr:write(StrFormat(
"Usage %s [options] [script.psc]\n"..
"Available options are:\n"..
" -s[number] Spacing to indent, TAB spacing is default\n"..
" -b Backup the Papyrus Script\n"
, program))
io.stderr:flush()
end
if _G.arg and _G.arg[0] and #_G.arg[0] > 0 then
program = _G.arg[0]
end
local argv = {...}
local function CollectArgs(argv,p)
local i = 1
while i <= #argv do
if StrSub(argv[i],1,1) ~= '-' then
return i
end
local option = StrSub(argv[i],2,2)
if option == 'b' then
if #argv[i] > 2 then return -1 end
p[option] = true
elseif option == 's' then
local spacing = tonumber(StrSub(argv[i],3,7))
if type(spacing) ~= 'number' then return -1 end
p['spacing'] = spacing
p[option] = true
else
return -1
end
i = i + 1
end
return 0
end
HasOptions = {
b = false,
s = false
}
local PapyrusScript = CollectArgs(argv,HasOptions)
if PapyrusScript <= 0 then
PrintUsage()
OsExit(1)
end
local script = argv[PapyrusScript]
local spacing = HasOptions['spacing'] or nil
local TempFileName = os.tmpname()
local PapyrusFile = io.open(script, "r")
if PapyrusFile == nil then
OsError('Could not open file for reading "'..script..'"')
end
local TempFile = io.open(TempFileName,"w")
if TempFile == nil then
OsError('Could not open file for reading "'..TempFileName..'"')
end
local Code = PapyrusFile:read("*a")
if HasOptions.b then
local BackupFile = io.open(script..'.backup',"w")
if BackupFile == nil then
OsError('Could not open file for reading "'..script..'.backup'..'"')
end
BackupFile:write(Code)
BackupFile:close()
end
local IndentedCode = IndentCode(Code, spacing)
TempFile:write(IndentedCode)
PapyrusFile:close()
TempFile:close()
os.remove(script)
os.rename(TempFileName,script)