Ejemplo n.º 1
0
def check_and_create_default_files() -> bool:
    _PROC = f"{PROC}: check and create files"
    logger.debug(msg.PROC_START.format(proc=_PROC))

    for elm in BASE_FILES:
        path = filepath_of(elm, BASE_FILE_TABLE[elm])
        if not is_exists_path(path):
            data = get_template_data(elm)
            if not write_file(path, data):
                logger.warning(msg.ERR_FAIL_CANNOT_CREATE_DATA.format(data=f"{str(elm)} in {_PROC}"))
                return False
        else:
            logger.debug(msg.PROC_MESSAGE.format(proc=f"Already exists {str(elm)} file in {PROC}"))
            continue

    for elm in DEFAULT_FILES:
        path = filepath_of(elm, 'main')
        if not is_exists_path(path):
            data = get_template_data(elm)
            if not write_file(path, data):
                logger.warning(msg.ERR_FAIL_CANNOT_CREATE_DATA.format(data=f"{str(elm)} in {_PROC}"))
                return False
        else:
            logger.debug(msg.PROC_MESSAGE.format(proc=f"Already exists {str(elm)} file in {PROC}"))
            continue

    logger.debug(msg.PROC_SUCCESS.format(proc=_PROC))
    return True
Ejemplo n.º 2
0
def set_project_data(args: Namespace) -> bool:
    assert isinstance(args, Namespace)
    assert has_cmd_of(args, CmdType.SET)

    logger.debug(msg.PROC_START.format(proc=PROC))

    if not _is_enable_setelm(args):
        logger.error(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"set element type in {PROC}"))
        return False

    elm = _setelm_from(args)
    is_succeeded = False

    if SetElmType.EDITOR is elm:
        is_succeeded = set_editor()
    else:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"set element type in {PROC}"))

    if not is_succeeded:
        logger.error(msg.ERR_FAIL_SUBPROCESS.format(proc=f"in {PROC}"))
        return False

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return True
Ejemplo n.º 3
0
def scene_item_of(record: StoryRecord, item: SceneItem) -> str:
    assert isinstance(record, StoryRecord)
    assert isinstance(item, SceneItem)

    if str(item) in record.data:
        return record.data[str(item)]
    else:
        logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"scene item in {PROC}"))
        return ""
Ejemplo n.º 4
0
def _base_data_from(actions_data: ActionsData) -> list:
    assert isinstance(actions_data, ActionsData)

    _PROC = f"{PROC}: base data"
    logger.debug(msg.PROC_START.format(proc=_PROC))

    tmp = []
    cache = SceneInfo()

    for record in actions_data.get_data():
        assert isinstance(record, ActionRecord)
        if ActType.DATA is record.type:
            if record.subtype in TITLE_ACTIONS:
                tmp.append(_record_as_title_from(record))
            elif ActDataType.SCENE_CAMERA is record.subtype:
                cache.camera = record.subject
            elif ActDataType.SCENE_STAGE is record.subtype:
                cache.stage = record.subject
            elif ActDataType.SCENE_YEAR is record.subtype:
                cache.year = record.subject
            elif ActDataType.SCENE_DATE is record.subtype:
                cache.date = record.subject
            elif ActDataType.SCENE_TIME is record.subtype:
                cache.time = record.subject
            elif ActDataType.SCENE_START is record.subtype:
                tmp.append(_record_as_scene_head_from(cache.cloned()))
            elif ActDataType.SCENE_END is record.subtype:
                tmp.append(_get_record_as_scene_end())
                cache.reset()
            elif ActDataType.COMMENT is record.subtype:
                tmp.append(_record_as_comment_from(record))
            elif ActDataType.FORESHADOW is record.subtype:
                tmp.append(_record_as_foreshadow_from(record))
            elif ActDataType.PAYOFF is record.subtype:
                tmp.append(_record_as_payoff_from(record))
            elif record.subtype in [ActDataType.BR,
                    ActDataType.PARAGRAPH_START,
                    ActDataType.PARAGRAPH_END,
                    ActDataType.INSTRUCTION]:
                continue
            elif ActDataType.TEXT is record.subtype:
                continue
            else:
                logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"act data type in {PROC}"))
                continue
        elif record.type in NORMAL_ACTIONS:
            tmp.append(_record_as_action_from(record))
        elif ActType.NONE is record.type:
            continue
        elif ActType.SAME is record.type:
            logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"same act type in {PROC}"))
            continue
        else:
            continue

    logger.debug(msg.PROC_SUCCESS.format(proc=_PROC))
    return tmp
Ejemplo n.º 5
0
def _safe_get_elm_item_of(record: StoryRecord, item_table: dict) -> Any:
    assert isinstance(record, StoryRecord)
    assert isinstance(item_table, dict)

    key = str(item_table[record.type])
    if key in record.data:
        return record.data[key]
    else:
        logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"{key} data in {PROC}"))
        return ""
Ejemplo n.º 6
0
def _base_structs_data_from(actions_data: ActionsData) -> list:
    assert isinstance(actions_data, ActionsData)

    tmp = []
    cache = SceneInfo()

    for record in actions_data.get_data():
        assert isinstance(record, ActionRecord)
        if record.type is ActType.DATA:
            if record.subtype in TITLE_ACTIONS:
                tmp.append(_record_as_title_from(record))
            elif ActDataType.SCENE_START is record.subtype:
                tmp.append(_record_as_scene_data_from(cache))
            elif ActDataType.SCENE_END is record.subtype:
                tmp.append(_get_record_as_scene_end())
                cache.reset()
            elif ActDataType.SCENE_CAMERA is record.subtype:
                cache.camera = record.subject
            elif ActDataType.SCENE_STAGE is record.subtype:
                cache.stage = record.subject
            elif ActDataType.SCENE_YEAR is record.subtype:
                cache.year = record.subject
            elif ActDataType.SCENE_DATE is record.subtype:
                cache.date = record.subject
            elif ActDataType.SCENE_TIME is record.subtype:
                cache.time = record.subject
            elif ActDataType.COMMENT is record.subtype:
                tmp.append(_record_as_comment_from(record))
            elif ActDataType.TEXT is record.subtype:
                tmp.append(_record_as_text_from(record))
            elif record.subtype in [
                    ActDataType.BR,
                    ActDataType.FORESHADOW,
                    ActDataType.PAYOFF,
                    ActDataType.PARAGRAPH_START,
                    ActDataType.PARAGRAPH_END,
            ]:
                continue
            else:
                logger.warning(
                    msg.ERR_FAIL_UNKNOWN_DATA.format(
                        data=f"act data sub type in {PROC}"))
                continue
        elif record.type in NORMAL_ACTIONS:
            tmp.append(_record_as_action_from(record))
        elif record.type in [ActType.NONE, ActType.SAME]:
            # NOTE: SE?
            continue
        else:
            logger.warning(
                msg.ERR_FAIL_INVALID_DATA.format(data=f"act type in {PROC}"))
            continue

    return tmp
Ejemplo n.º 7
0
def _get_renamed_name(elm: ElmType) -> str:
    assert isinstance(elm, ElmType)

    _fname = new_filename_by_input(str(elm))

    if is_duplicated_path_in_dir(elm, _fname):
        logger.warning(
            msg.ERR_FAIL_DUPLICATED_DATA.format(
                data=f"new name for renaming in {PROC}"))
        return ""
    return _fname
Ejemplo n.º 8
0
def person_item_of(fname: str, item: PersonItem) -> Any:
    assert isinstance(fname, str)
    assert isinstance(item, PersonItem)

    data = read_markdown_data_as_yaml(
        read_file(filepath_of(ElmType.PERSON, fname)))
    if str(item) in data:
        return data[str(item)]
    else:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"{item} in {PROC}"))
        return ""
Ejemplo n.º 9
0
def _get_new_filename(elm: ElmType, fname: str) -> str:
    assert isinstance(elm, ElmType)

    _fname = assertion.is_str(fname) if fname else new_filename_by_input(
        str(elm))

    if is_duplicated_path_in_dir(elm, _fname):
        logger.warning(
            msg.ERR_FAIL_DUPLICATED_DATA_WITH_DATA.format(
                data=f"new filename in {PROC}"), _fname)
        return ""
    return _fname
Ejemplo n.º 10
0
def _get_edit_filename(elm: ElmType, fname: str) -> str:
    assert isinstance(elm, ElmType)

    filenames = filepaths_by_elm(elm)

    _fname = assertion.is_str(fname) if fname else get_target_filename_from_list(f"edit {str(elm)}", filenames)

    if not is_duplicated_path_in_dir(elm, _fname):
        logger.warning(
                msg.ERR_FAIL_MISSING_DATA_WITH_DATA.format(data=f"edit filename in {PROC}"),
                _fname)
        return ""
    return _fname
Ejemplo n.º 11
0
def get_basefile_data(elm: ElmType) -> dict:
    assert isinstance(elm, ElmType)

    if not elm in BASE_FILES:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"element type in {PROC}"))
        return {}

    data = read_file(filepath_of(elm, ''))

    if EXT_TABLE[elm] is MARKDOWN_EXT:
        return read_markdown_data_as_yaml(data)
    else:
        return read_yaml_data(data)
Ejemplo n.º 12
0
def _content_record_of(record: StoryRecord, index: int) -> ContentRecord:
    assert isinstance(record, StoryRecord)
    assert isinstance(index, int)

    elm = assertion.is_instance(record.type, ElmType)

    if not str(TITLE_ELMS[elm]) in record.data:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"content record in {PROC}"))
        return None

    title = record.data[str(TITLE_ELMS[elm])]

    return ContentRecord(elm, title, index)
Ejemplo n.º 13
0
def elm_from_ordername(ordername: str) -> ElmType:
    assert isinstance(ordername, str)

    if str(OrderItem.BOOK) in ordername:
        return ElmType.BOOK
    elif str(OrderItem.CHAPTER) in ordername:
        return ElmType.CHAPTER
    elif str(OrderItem.EPISODE) in ordername:
        return ElmType.EPISODE
    elif str(OrderItem.SCENE) in ordername:
        return ElmType.SCENE
    else:
        logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"in {PROC}"))
        return ElmType.NONE
Ejemplo n.º 14
0
def _base_novels_data_from(actions_data: ActionsData) -> list:
    assert isinstance(actions_data, ActionsData)

    tmp = []

    for record in actions_data.get_data():
        assert isinstance(record, ActionRecord)
        if ActType.DATA is record.type:
            if record.subtype in TITLE_ACTIONS:
                tmp.append(_record_as_title_from(record))
            elif ActDataType.SCENE_START is record.subtype:
                tmp.append(_get_record_as_br())
            elif ActDataType.SCENE_END is record.subtype:
                tmp.append(_get_record_as_br())
            elif ActDataType.COMMENT is record.subtype:
                tmp.append(_record_as_comment_from(record))
            elif ActDataType.BR is record.subtype:
                tmp.append(_get_record_as_br())
            elif ActDataType.PARAGRAPH_START is record.subtype:
                tmp.append(_get_record_as_paragraph_start())
            elif ActDataType.PARAGRAPH_END is record.subtype:
                tmp.append(_get_record_as_paragraph_end())
            elif ActDataType.TEXT is record.subtype:
                tmp.append(_record_as_description_from(record))
            elif record.subtype in SCENE_DATAS:
                # NOTE: 何か利用する場合はここでキャッシュ
                continue
            elif record.subtype in [
                    ActDataType.FORESHADOW, ActDataType.PAYOFF
            ]:
                continue
            else:
                logger.warning(
                    msg.ERR_FAIL_INVALID_DATA_WITH_DATA.format(
                        data=f"act data type in {PROC}"), record.subtype)
                continue
        elif record.type in NORMAL_ACTIONS:
            if ActType.TALK is record.type:
                tmp.append(_record_as_dialogue_from(record))
            else:
                tmp.append(_record_as_description_from(record))
        elif record.type in [ActType.NONE, ActType.SAME]:
            continue
        else:
            logger.warning(
                msg.ERR_FAIL_INVALID_DATA.format(data=f"act type in {PROC}"))
            continue

    return tmp
Ejemplo n.º 15
0
def _title_from(record: ActionRecord) -> InfoType:
    assert isinstance(record, ActionRecord)

    if ActDataType.BOOK_TITLE is record.subtype:
        return InfoType.TITLE_BOOK
    elif ActDataType.CHAPTER_TITLE is record.subtype:
        return InfoType.TITLE_CHAPTER
    elif ActDataType.EPISODE_TITLE is record.subtype:
        return InfoType.TITLE_EPISODE
    elif ActDataType.SCENE_TITLE is record.subtype:
        return InfoType.TITLE_SCENE
    elif ActDataType.SCENE_HEAD is record.subtype:
        return InfoType.TITLE_TEXT
    else:
        logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"title data type in {PROC}"))
        return InfoType.NONE
Ejemplo n.º 16
0
def _get_push_parent_filename(elm: ElmType) -> str:
    assert isinstance(elm, ElmType)

    parent_elm = get_elm_from_order(get_parent_item_of(orderitem_of(elm)))
    ordernames = [
        rid_prefix(orderitem_of(parent_elm), name)
        for name in get_filenames_in_order_by_elm(parent_elm)
    ]

    _fname = get_target_filename_from_list("parent name", ordernames)

    if not is_duplicated_path_in_dir(parent_elm, _fname):
        logger.warning(
            msg.ERR_FAIL_MISSING_DATA_WITH_DATA.format(
                data=f"parent filename in {PROC}"), _fname)
        return ""

    return _fname
Ejemplo n.º 17
0
def _get_reject_filename(elm: ElmType, fname: str) -> str:
    assert isinstance(elm, ElmType)

    ordernames = [
        rid_prefix(orderitem_of(elm), name)
        for name in get_filenames_in_order_by_elm(elm)
    ]

    _fname = assertion.is_str(
        fname) if fname else get_target_filename_from_list(
            f"reject {str(elm)}", ordernames)

    if not is_duplicated_path_in_dir(elm, _fname):
        logger.warning(
            msg.ERR_FAIL_CANNOT_WRITE_DATA_WITH_DATA.format(
                data=f"reject filename in {PROC}"), _fname)
        return ""
    return _fname
Ejemplo n.º 18
0
def conv_base_action_data_from(story_data: StoryData) -> ActionsData:
    assert isinstance(story_data, StoryData)

    tmp = []

    for record in story_data.get_data():
        assert isinstance(record, StoryRecord)
        if record.type in TOP_LEVEL_ELMS:
            tmp.append(_record_as_title_from(record))
        elif record.type is ElmType.SCENE:
            tmp.extend(_conv_action_records_on_scene_from(record))
        else:
            logger.warning(
                msg.ERR_FAIL_INVALID_DATA.format(
                    data=f"element type in {PROC}"))
            continue

    return ActionsData(tmp)
Ejemplo n.º 19
0
def _record_as_title_from(record: ScriptRecord) -> str:
    assert isinstance(record, ScriptRecord)

    if ScriptType.TITLE_BOOK is record.type:
        return f"# {record.subject}"
    elif ScriptType.TITLE_CHAPTER is record.type:
        return f"## {record.subject}"
    elif ScriptType.TITLE_EPISODE is record.type:
        return f"### {record.subject}"
    elif ScriptType.TITLE_SCENE is record.type:
        return f"** {record.subject} **"
    elif ScriptType.TITLE_TEXT is record.type:
        return f"[{record.subject}]"
    else:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"script type title in {PROC}"))
        return ""
Ejemplo n.º 20
0
def get_commandline_arguments() -> Namespace:
    logger.debug(msg.PROC_START.format(proc=PROC))

    parser = assertion.is_instance(_init_commandline_parser(), ArgumentParser)

    if not parser:
        return None

    if not _set_parser_options(parser):
        logger.warning(msg.ERR_FAIL_SET_DATA.format(data='arg parser options'))
        return None

    args = parser.parse_args()

    if not args:
        return None

    logger.debug(msg.PROC_DONE.format(proc=PROC))
    return args
Ejemplo n.º 21
0
def _conv_plot_record(record: StoryRecord) -> PlotRecord:
    assert isinstance(record, StoryRecord)

    elm = assertion.is_instance(record.type, ElmType)
    if not is_enable_the_elm(elm, ENABLE_ELMS):
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"element type in {PROC}"))
        return None

    title = assertion.is_str(elm_title_of(record))
    setup = assertion.is_str(_elm_setup_of(record))
    tp1st = assertion.is_str(_elm_tp1st_of(record))
    develop = assertion.is_str(_elm_develop_of(record))
    tp2nd = assertion.is_str(_elm_tp2nd_of(record))
    climax = assertion.is_str(_elm_climax_of(record))
    resolve = assertion.is_str(_elm_resolve_of(record))

    return PlotRecord(elm, title, setup, tp1st, develop, tp2nd, climax,
                      resolve)
Ejemplo n.º 22
0
def _get_plot_item_of(record: StoryRecord, item: PlotItem) -> str:
    assert isinstance(record, StoryRecord)
    assert isinstance(item, PlotItem)

    data = assertion.is_dict(elm_plot_of(record))

    if not data:
        logger.warning(
            msg.ERR_FAIL_MISSING_DATA.format(data=f"plot data in {PROC}"))
        return ""

    key = str(item)
    if key not in data:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"{key} of record in {PROC}"))
        return ""

    return data[key]
Ejemplo n.º 23
0
def _get_push_filename(elm: ElmType, fname: str) -> str:
    assert isinstance(elm, ElmType)

    filenames = [basename_of(name) for name in filepaths_by_elm(elm)]
    ordernames = [
        rid_prefix(orderitem_of(elm), name)
        for name in get_filenames_in_order_by_elm(elm)
    ]

    _fname = assertion.is_str(
        fname) if fname else get_target_filename_from_list(
            f"push {str(elm)}", list(set(filenames) - set(ordernames)))

    if not is_duplicated_path_in_dir(elm, _fname):
        logger.warning(
            msg.ERR_FAIL_MISSING_DATA_WITH_DATA.format(
                data=f"push filename in {PROC}"), _fname)
        return ""
    return _fname
Ejemplo n.º 24
0
def _record_as_title_from(record: StructRecord, index: HeadIndex) -> str:
    assert isinstance(record, StructRecord)
    assert isinstance(index, HeadIndex)

    if StructType.TITLE_BOOK is record.type:
        return f"# {record.subject}"
    elif StructType.TITLE_CHAPTER is record.type:
        return f"## {record.subject}"
    elif StructType.TITLE_EPISODE is record.type:
        return f"### {record.subject}"
    elif StructType.TITLE_SCENE is record.type:
        return f"#### {index.chapter}.{index.episode}.{index.scene} {record.subject}"
    elif StructType.TITLE_TEXT is record.type:
        return f"[{record.subject}]"
    else:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(
                data=f"struct type title in {PROC}"))
        return ""
Ejemplo n.º 25
0
def actions_data_apply_instructions(actions_data: ActionsData,
                                    tags: dict) -> ActionsData:
    assert isinstance(actions_data, ActionsData)
    assert isinstance(tags, dict)

    logger.debug(msg.PROC_START.format(proc=PROC))

    tmp = []
    alias = {}

    # TODO: パラグラフはパラグラフのActDataTypeで制御し、インデントやBRはここでは命令分以外は入れない
    for record in actions_data.get_data():
        assert isinstance(record, ActionRecord)
        if ActDataType.INSTRUCTION is record.subtype:
            if record.subject in INST_PARAGRAPH_START:
                tmp.append(_get_record_as_paragraph_start())
            elif record.subject in INST_PARAGRAPH_END:
                tmp.append(_get_record_as_paragraph_end())
            elif record.subject in INST_BREAK:
                tmp.append(_get_record_as_br())
            elif record.subject in INST_ALIAS:
                short, origin = record.outline.split('=')
                alias[short] = origin
            elif record.subject in INST_FORESHADOW:
                tmp.append(_record_as_foreshadow_from(record, tags))
            elif record.subject in INST_PAYOFF:
                tmp.append(_record_as_payoff_from(record, tags))
            else:
                logger.warning(
                    msg.ERR_FAIL_INVALID_DATA.format(
                        data=f"instruction type in {PROC}"))
                continue
        elif ActDataType.SCENE_START is record.subtype:
            alias = {}
            tmp.append(record)
        elif record.type in NORMAL_ACTIONS:
            tmp.append(_conv_shorter_by_alias(record, alias))
        else:
            tmp.append(record)

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))
    return ActionsData(tmp)
Ejemplo n.º 26
0
def infos_data_from(actions_data: ActionsData, tags: dict) -> InfosData:
    assert isinstance(actions_data, ActionsData)
    assert isinstance(tags, dict)

    logger.debug(msg.PROC_START.format(proc=PROC))

    base_data = _base_data_from(actions_data)

    updated = update_data_tags(base_data, tags)

    data_set = _get_info_data_set(updated)
    if not data_set or not data_set.has_data():
        logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"data set in {PROC}"))
        return None

    eliminated = _eliminate_empty_records(data_set)

    logger.debug(msg.PROC_SUCCESS.format(proc=PROC))

    return eliminated
Ejemplo n.º 27
0
def _get_status_info_data_set(infos_data: InfosData) -> InfosData:
    assert isinstance(infos_data, InfosData)

    _PROC = f"{PROC}: status info set"
    logger.debug(msg.PROC_START.format(proc=_PROC))

    persons = person_status_info_from(infos_data)
    if not persons or not persons.has_data():
        logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"persons status data in {_PROC}"))
        return None

    stages = stage_status_info_from(infos_data)
    if not stages or not stages.has_data():
        logger.warning(msg.ERR_FAIL_INVALID_DATA.format(data=f"stages status data in {_PROC}"))
        return None

    data_set = persons + stages

    logger.debug(msg.PROC_SUCCESS.format(proc=_PROC))

    return data_set
Ejemplo n.º 28
0
def update_story_data_if_same_or_next_tag(story_data: StoryData) -> StoryData:
    assert isinstance(story_data, StoryData)

    tmp = []
    cache = None

    for record in story_data.get_data():
        assert isinstance(record, StoryRecord)
        if record.type in TOP_LEVEL_ELMS:
            tmp.append(record)
        elif record.type is ElmType.SCENE:
            ret = _copy_and_change_scene_data_if_same_or_next(record, cache)
            tmp.append(ret)
            cache = ret
        else:
            logger.warning(
                msg.ERR_FAIL_INVALID_DATA.format(
                    data=f"element type in {PROC}"))
            continue

    return StoryData(tmp)
Ejemplo n.º 29
0
def _conv_action_record_from(line: str) -> ActionRecord:
    assert isinstance(line, str)

    record = rid_rn(line)

    if record in LINE_EMPTY:
        return None
    elif record.startswith(LINE_COMMENT):
        return _record_as_comment_from(record)
    elif record.startswith(LINE_HEAD):
        return _record_as_head_from(record)
    elif record.startswith(LINE_INSTRUCTION):
        return _record_as_instruction_from(record)
    elif record.startswith(LINE_ACTION):
        return _record_as_action_from(record)
    elif record:
        return _record_as_text_from(record)
    else:
        logger.warning(
            msg.ERR_FAIL_INVALID_DATA.format(data=f"action line in {PROC}"))
        return None
Ejemplo n.º 30
0
def update_actions_data_if_same(actions_data: ActionsData) -> ActionsData:
    assert isinstance(actions_data, ActionsData)

    tmp = []
    cache = None

    for record in actions_data.get_data():
        assert isinstance(record, ActionRecord)
        if record.type in [ActType.DATA, ActType.NONE]:
            tmp.append(record)
        elif record.type in NORMAL_ACTIONS + [
                ActType.SAME,
        ]:
            ret = _copy_action_record_if_same(record, cache)
            if ret:
                tmp.append(ret)
                cache = ret
        else:
            logger.warning(
                msg.ERR_FAIL_UNKNOWN_DATA.format(data=f"act type in {PROC}"))
            continue

    return ActionsData(tmp)