예제 #1
0
    def try_find_prettier_config(self, view):
        try:
            source_file_dir = get_file_abs_dir(view.file_name())
        except:
            source_file_dir = get_st_project_path()
        st_project_path = get_st_project_path()

        #
        # 1. Attempt to use prettier config defined in the 'additional_cli_args' (if exist - ensure it's abs path)

        # check if '--config <filename>' is defined in 'additional_cli_args'
        # parsed_additional_cli_args = parse_additional_cli_args(self.get_additional_cli_args(view))
        additional_cli_arg_config = get_cli_arg_value(self.additional_cli_args,
                                                      "--config")
        if not is_str_none_or_empty(additional_cli_arg_config):
            additional_cli_arg_config = os.path.normpath(
                additional_cli_arg_config)
            if not os.path.isabs(additional_cli_arg_config):
                additional_cli_arg_config = in_source_file_path_or_project_root(
                    source_file_dir, st_project_path,
                    additional_cli_arg_config)
                if additional_cli_arg_config and os.path.exists(
                        additional_cli_arg_config):
                    log_debug(
                        view,
                        "Using Prettier config file defined in 'additional_cli_args' config -> {0}'"
                        "".format(additional_cli_arg_config),
                        True,
                    )
                    return additional_cli_arg_config

                log_warn(
                    "Cannot find Prettier config file defined "
                    "in 'additional_cli_args' -> '--config <path>'.",
                    True,
                )

                return None

        #
        # 2. Attempt to resolve a prettier config path:
        resolved_prettier_config = find_prettier_config(source_file_dir)
        if resolved_prettier_config and os.path.exists(
                resolved_prettier_config):
            log_debug(
                view,
                "Prettier config file discovered at '{0}'".format(
                    resolved_prettier_config),
            )
            return resolved_prettier_config

        log_debug(
            view,
            "Prettier config file not found. "
            "Will use Prettier options defined in Sublime Text '{0}' file.".
            format(SETTINGS_FILENAME),
            True,
        )

        return None
예제 #2
0
    def try_find_prettier_config(self, view):
        source_file_dir = get_file_abs_dir(view.file_name())
        st_project_path = get_st_project_path()

        #
        # 1. Check if defined in 'additional_cli_args':
        additional_cli_arg_config = get_cli_arg_value(self.additional_cli_args, '--config')
        if not is_str_none_or_empty(additional_cli_arg_config):
            additional_cli_arg_config = os.path.normpath(additional_cli_arg_config)
            if not os.path.isabs(additional_cli_arg_config):
                additional_cli_arg_config = in_source_file_path_or_project_root(
                    source_file_dir, st_project_path, additional_cli_arg_config)
                if additional_cli_arg_config and os.path.exists(additional_cli_arg_config):
                    log_debug(view, "Using Prettier config file defined in additional_cli_args '{0}'"
                              .format(additional_cli_arg_config), True)
                    return additional_cli_arg_config
                log_warn("Could not find Prettier config file defined in additional_cli_args '{0}'"
                         .format(str(additional_cli_arg_config)), True)
                return None

        #
        # 2. Attempt to automatically resolve:
        resolved_prettier_config = find_prettier_config(source_file_dir)
        if resolved_prettier_config and os.path.exists(resolved_prettier_config):
            log_debug(view, "Found Prettier config file '{0}'".format(resolved_prettier_config))
            return resolved_prettier_config

        log_debug(view, "Could not resolve Prettier config file, will use options defined in Sublime Text.", True)

        return None
예제 #3
0
    def try_find_prettier_config(self, view):
        source_file_dir = get_file_abs_dir(view.file_name())
        st_project_path = get_st_project_path()

        #
        # 1. Attempt to use prettier config defined in the 'additional_cli_args' (if exist - ensure it's abs path)

        # check if '--config <filename>' is defined in 'additional_cli_args'
        # parsed_additional_cli_args = parse_additional_cli_args(self.get_additional_cli_args(view))
        additional_cli_arg_config = get_cli_arg_value(self.additional_cli_args, '--config')
        if not is_str_none_or_empty(additional_cli_arg_config):
            additional_cli_arg_config = os.path.normpath(additional_cli_arg_config)
            if not os.path.isabs(additional_cli_arg_config):
                additional_cli_arg_config = in_source_file_path_or_project_root(
                    source_file_dir, st_project_path, additional_cli_arg_config)
                if additional_cli_arg_config and os.path.exists(additional_cli_arg_config):
                    log_debug(view, "Using Prettier config file defined in 'additional_cli_args' config -> {0}'"
                                    "".format(additional_cli_arg_config), True)
                    return additional_cli_arg_config

                log_warn("Cannot find Prettier config file defined "
                         "in 'additional_cli_args' -> '--config <path>'.", True)

                return None

        #
        # 2. Attempt to resolve a prettier config path:
        resolved_prettier_config = find_prettier_config(source_file_dir)
        if resolved_prettier_config and os.path.exists(resolved_prettier_config):
            log_debug(view, "Prettier config file discovered at '{0}'".format(resolved_prettier_config))
            return resolved_prettier_config

        log_debug(view, "Prettier config file not found. "
                        "Will use Prettier options defined in Sublime Text '{0}' file."
                  .format(SETTINGS_FILENAME), True)

        return None
예제 #4
0
    def format_code(self,
                    source,
                    node_path,
                    prettier_cli_path,
                    prettier_options,
                    view,
                    provide_cursor=False,
                    is_selection=False):

        self._error_message = None

        cursor = None
        if provide_cursor:
            cursor = view.sel()[0].a
            prettier_options += ['--cursor-offset', str(cursor)]

        if is_windows() and is_str_none_or_empty(
                node_path) and prettier_cli_path.endswith(".js"):
            # on windows, when a custom 'node_path' is not specified and 'prettier_cli_path' is
            # presumably a .js script (e.g: 'bin-prettier.js')...
            # automatically prepend the environment detected node[.exe|.cmd] path to
            # the generated command (see #146 --no-bin-links).
            cmd = [resolve_node_path(view.file_name())] \
                + [prettier_cli_path] \
                + ['--stdin'] \
                + prettier_options
        elif is_str_none_or_empty(node_path):
            cmd = [prettier_cli_path] \
                + ['--stdin'] \
                + prettier_options
        else:
            cmd = [node_path] \
                + [prettier_cli_path] \
                + ['--stdin'] \
                + prettier_options

        try:
            format_debug_message('Prettier CLI Command', list_to_str(cmd),
                                 debug_enabled(view))

            proc = Popen(cmd,
                         stdin=PIPE,
                         stderr=PIPE,
                         stdout=PIPE,
                         env=get_proc_env(),
                         shell=is_windows())

            stdout, stderr = proc.communicate(input=source.encode('utf-8'))
            if proc.returncode != 0:
                error_output = stderr.decode('utf-8')
                self.error_message = format_error_message(
                    error_output, str(proc.returncode))

                # detect and scroll to 'Syntax Errors' (if not formatting a selection):
                if not is_selection:
                    _, _, error_line, error_col = self.has_syntax_error(
                        error_output)
                    if error_line != -1 and error_col != -1:
                        scroll_view_to(view, error_line, error_col)

                return None

            new_cursor = None
            if stderr:
                stderr_output = stderr.decode('utf-8')
                if provide_cursor:
                    stderr_lines = stderr_output.splitlines()
                    stderr_output, new_cursor = '\n'.join(
                        stderr_lines[:-1]), stderr_lines[-1]

                # allow warnings to pass-through
                if stderr_output:
                    print(
                        format_error_message(stderr_output,
                                             str(proc.returncode)))

            if provide_cursor:
                if not new_cursor and cursor is not None:
                    new_cursor = cursor
                try:
                    new_cursor = int(new_cursor)
                except ValueError:
                    log_warn(
                        view,
                        'Adjusted cursor position could not be parsed (int).')
                    return stdout.decode('utf-8'), None
                return stdout.decode('utf-8'), new_cursor

            return stdout.decode('utf-8')
        except OSError as ex:
            sublime.error_message('{0} - {1}'.format(PLUGIN_NAME, ex))
            raise